diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 8c24e6af52..c270d78354 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature request -about: Suggest an idea for this project +about: Do not make a new issue for feature requests! Instead, post it on FeatHub, see the README. --- diff --git a/.github/Mindustry-CodeStyle-IJ.xml b/.github/Mindustry-CodeStyle-IJ.xml index 6a48acd1dd..94486ff95b 100644 --- a/.github/Mindustry-CodeStyle-IJ.xml +++ b/.github/Mindustry-CodeStyle-IJ.xml @@ -12,7 +12,7 @@ diff --git a/.gitignore b/.gitignore index c362483e39..10fca2d7f0 100644 --- a/.gitignore +++ b/.gitignore @@ -32,8 +32,8 @@ steam_appid.txt /core/assets/gifexport/ /core/assets/version.properties /core/assets/locales -/ios/src/io/anuke/mindustry/gen/ -/core/src/io/anuke/mindustry/gen/ +/ios/src/mindustry/gen/ +/core/src/mindustry/gen/ ios/robovm.properties packr-out/ config/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8870a2f23..199aa17bf6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,7 +31,7 @@ Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to ge #### Do not use incompatible Java features (java.util.function, java.awt). Android [does not support](https://developer.android.com/studio/write/java8-support#supported_features) many of Java 8's features, such as the packages `java.util.function`, `java.util.stream` or `forEach` in collections. Do not use these in your code. -If you need to use functional interfaces, use the ones in `io.anuke.arc.func`, which are more or less the same with different naming schemes. +If you need to use functional interfaces, use the ones in `arc.func`, which are more or less the same with different naming schemes. The same applies to any class *outside* of the standard `java.[n]io` / `java.net` / `java.util` packages: Most of them are not supported. `java.awt` is one of these packages: do not use it, ever. It is not supported on any platform, even desktop - the entire package is removed during JRE minimization. @@ -39,7 +39,7 @@ In general, if you are using IntelliJ, you should be warned about platform incom #### Use `arc` collections and classes when possible. -Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Array`, `ObjectMap` and other equivalents from `io.anuke.arc.collection`. +Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Array`, `ObjectMap` and other equivalents from `arc.struct`. Why? Because that's what the rest of the codebase uses, and the standard collections have a lot of cruft and usability issues associated with them. In the rare case that concurrency is required, you may use the standard Java classes for that purpose (e.g. `CopyOnWriteArrayList`). @@ -47,7 +47,7 @@ What you'll usually need to change: - `HashSet` -> `ObjectSet` - `HashMap` -> `ObjectMap` - `List` / `ArrayList` / `Stack` -> `Array` -- `java.util.Queue` -> `io.anuke.arc.collection.Queue` +- `java.util.Queue` -> `arc.struct.Queue` - *Many others* diff --git a/README.md b/README.md index 555f3b3e09..2f0cab8ff3 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ See [CONTRIBUTING](CONTRIBUTING.md). Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/). If you'd rather compile on your own, follow these instructions. -First, make sure you have [Java 8](https://www.java.com/en/download/) and [JDK 8](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands: +First, make sure you have [JDK 8](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands: #### Windows @@ -49,11 +49,6 @@ If the terminal returns `Permission denied` or `Command not found` on Mac/Linux, Gradle may take up to several minutes to download files. Be patient.
After building, the output .JAR file should be in `/desktop/build/libs/Mindustry.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds. -### Feature Requests - -[![Feature Requests](https://feathub.com/Anuken/Mindustry?format=svg)](https://feathub.com/Anuken/Mindustry) - - ### Downloads [Get it on F-Droid](https://f-droid.org/packages/io.anuke.mindustry/) + +### Feature Requests + +[![Feature Requests](https://feathub.com/Anuken/Mindustry?format=svg)](https://feathub.com/Anuken/Mindustry) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index a29bcea7c3..b096e11a41 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -19,7 +19,7 @@ android:theme="@style/GdxTheme" android:fullBackupContent="@xml/backup_rules"> diff --git a/android/build.gradle b/android/build.gradle index 5795f34340..015656f543 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -161,5 +161,5 @@ task run(type: Exec){ } def adb = path + "/platform-tools/adb" - commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher' + commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/mindustry.android.AndroidLauncher' } \ No newline at end of file diff --git a/android/proguard-project.txt b/android/proguard-project.txt index 1f34b8cae8..5576552446 100644 --- a/android/proguard-project.txt +++ b/android/proguard-project.txt @@ -22,8 +22,8 @@ -verbose -verbose -ignorewarnings --keep class io.anuke.mindustry.game.Rules --keep class io.anuke.mindustry.desktop.DesktopLauncher +-keep class mindustry.game.Rules +-keep class mindustry.desktop.DesktopLauncher -keepclasseswithmembers public class * { public static void main(java.lang.String[]); } diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/mindustry/android/AndroidLauncher.java similarity index 95% rename from android/src/io/anuke/mindustry/AndroidLauncher.java rename to android/src/mindustry/android/AndroidLauncher.java index 25119c3572..438d133707 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/mindustry/android/AndroidLauncher.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package mindustry.android; import android.*; import android.app.*; @@ -9,22 +9,24 @@ import android.os.Build.*; import android.os.*; import android.provider.Settings.*; import android.telephony.*; -import io.anuke.arc.*; -import io.anuke.arc.backends.android.surfaceview.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.game.Saves.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.ui.dialogs.*; +import arc.*; +import arc.backend.android.*; +import arc.files.*; +import arc.func.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.serialization.*; +import mindustry.*; +import mindustry.game.Saves.*; +import mindustry.io.*; +import mindustry.ui.dialogs.*; import java.io.*; import java.lang.System; import java.util.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; + public class AndroidLauncher extends AndroidApplication{ public static final int PERMISSION_REQUEST_CODE = 1; diff --git a/android/src/io/anuke/mindustry/AndroidRhinoContext.java b/android/src/mindustry/android/AndroidRhinoContext.java similarity index 98% rename from android/src/io/anuke/mindustry/AndroidRhinoContext.java rename to android/src/mindustry/android/AndroidRhinoContext.java index 4960941d88..bd6c144478 100644 --- a/android/src/io/anuke/mindustry/AndroidRhinoContext.java +++ b/android/src/mindustry/android/AndroidRhinoContext.java @@ -1,8 +1,10 @@ -package io.anuke.mindustry; +package mindustry.android; import android.annotation.*; import android.os.*; import android.os.Build.*; +import arc.*; +import arc.backend.android.*; import com.android.dex.*; import com.android.dx.cf.direct.*; import com.android.dx.command.dexer.*; @@ -11,8 +13,6 @@ import com.android.dx.dex.cf.*; import com.android.dx.dex.file.DexFile; import com.android.dx.merge.*; import dalvik.system.*; -import io.anuke.arc.*; -import io.anuke.arc.backends.android.surfaceview.*; import org.mozilla.javascript.*; import java.io.*; @@ -178,7 +178,7 @@ public class AndroidRhinoContext{ }catch(IOException e){ e.printStackTrace(); } - android.content.Context context = ((AndroidApplication)Core.app).getContext(); + android.content.Context context = ((AndroidApplication) Core.app).getContext(); return new DexClassLoader(dexFile.getPath(), VERSION.SDK_INT >= 21 ? context.getCodeCacheDir().getPath() : context.getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); } diff --git a/annotations/src/main/java/io/anuke/annotations/Annotations.java b/annotations/src/main/java/mindustry/annotations/Annotations.java similarity index 99% rename from annotations/src/main/java/io/anuke/annotations/Annotations.java rename to annotations/src/main/java/mindustry/annotations/Annotations.java index 6ee59964e9..8124930825 100644 --- a/annotations/src/main/java/io/anuke/annotations/Annotations.java +++ b/annotations/src/main/java/mindustry/annotations/Annotations.java @@ -1,4 +1,4 @@ -package io.anuke.annotations; +package mindustry.annotations; import java.lang.annotation.*; diff --git a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java b/annotations/src/main/java/mindustry/annotations/AssetsAnnotationProcessor.java similarity index 82% rename from annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java rename to annotations/src/main/java/mindustry/annotations/AssetsAnnotationProcessor.java index 3c28c83cea..3ccb3d0729 100644 --- a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/AssetsAnnotationProcessor.java @@ -1,7 +1,7 @@ -package io.anuke.annotations; +package mindustry.annotations; import com.squareup.javapoet.*; -import io.anuke.annotations.Annotations.*; +import mindustry.annotations.Annotations.*; import javax.annotation.processing.*; import javax.lang.model.*; @@ -12,10 +12,10 @@ import java.nio.file.*; import java.util.*; @SupportedSourceVersion(SourceVersion.RELEASE_8) -@SupportedAnnotationTypes("io.anuke.annotations.Annotations.StyleDefaults") +@SupportedAnnotationTypes("mindustry.annotations.Annotations.StyleDefaults") public class AssetsAnnotationProcessor extends AbstractProcessor{ /** 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 = "mindustry.gen"; private String path; private int round; @@ -39,8 +39,8 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ .getParent().getParent().getParent().getParent().getParent().getParent().toString(); path = path.replace("%20", " "); - processSounds("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound"); - processSounds("Musics", path + "/assets/music", "io.anuke.arc.audio.Music"); + processSounds("Sounds", path + "/assets/sounds", "arc.audio.Sound"); + processSounds("Musics", path + "/assets/music", "arc.audio.Music"); processUI(roundEnv.getElementsAnnotatedWith(StyleDefaults.class)); return true; @@ -75,7 +75,7 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ 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 dtype = p.getFileName().toString().endsWith(".9.png") ? "arc.scene.style.NinePatchDrawable" : "arc.scene.style.TextureRegionDrawable"; String varname = capitalize(sfilen); TypeSpec.Builder ttype = type; @@ -91,7 +91,7 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ 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); + tload.addStatement(varname + " = ("+dtype+")arc.Core.atlas.drawable($S)", sfilen); } }); @@ -100,7 +100,7 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ 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 + ")"); + loadStyles.addStatement("arc.Core.scene.addStyle(" + field.asType().toString() + ".class, mindustry.ui.Styles." + fname + ")"); } }); } @@ -136,17 +136,17 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ String filepath = path.substring(path.lastIndexOf("/") + 1) + "/" + fname; - String filename = "io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? \"" + filepath + "\" : \"" + filepath.replace(".ogg", ".mp3")+"\""; + String filename = "arc.Core.app.getType() != arc.Application.ApplicationType.iOS ? \"" + filepath + "\" : \"" + filepath.replace(".ogg", ".mp3")+"\""; - loadBegin.addStatement("io.anuke.arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", filepath, filepath.replace(".ogg", ".mp3")); + loadBegin.addStatement("arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", filepath, filepath.replace(".ogg", ".mp3")); - dispose.addStatement("io.anuke.arc.Core.assets.unload(" + filename + ")"); + dispose.addStatement("arc.Core.assets.unload(" + filename + ")"); 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 arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); }); if(classname.equals("Sounds")){ - type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); + type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); } type.addMethod(loadBegin.build()); diff --git a/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java b/annotations/src/main/java/mindustry/annotations/CallSuperAnnotationProcessor.java similarity index 96% rename from annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java rename to annotations/src/main/java/mindustry/annotations/CallSuperAnnotationProcessor.java index 1a0102a793..01a3fdb0e1 100644 --- a/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/CallSuperAnnotationProcessor.java @@ -1,9 +1,9 @@ -package io.anuke.annotations; +package mindustry.annotations; import com.sun.source.util.*; import com.sun.tools.javac.tree.*; import com.sun.tools.javac.tree.JCTree.*; -import io.anuke.annotations.Annotations.*; +import mindustry.annotations.Annotations.*; import javax.annotation.processing.*; import javax.lang.model.*; diff --git a/annotations/src/main/java/io/anuke/annotations/ClassEntry.java b/annotations/src/main/java/mindustry/annotations/ClassEntry.java similarity index 92% rename from annotations/src/main/java/io/anuke/annotations/ClassEntry.java rename to annotations/src/main/java/mindustry/annotations/ClassEntry.java index a9be2ec134..002dcac88c 100644 --- a/annotations/src/main/java/io/anuke/annotations/ClassEntry.java +++ b/annotations/src/main/java/mindustry/annotations/ClassEntry.java @@ -1,4 +1,4 @@ -package io.anuke.annotations; +package mindustry.annotations; import java.util.ArrayList; diff --git a/annotations/src/main/java/io/anuke/annotations/CodeAnalyzerTreeScanner.java b/annotations/src/main/java/mindustry/annotations/CodeAnalyzerTreeScanner.java similarity index 97% rename from annotations/src/main/java/io/anuke/annotations/CodeAnalyzerTreeScanner.java rename to annotations/src/main/java/mindustry/annotations/CodeAnalyzerTreeScanner.java index 8655efe155..13059b38b8 100644 --- a/annotations/src/main/java/io/anuke/annotations/CodeAnalyzerTreeScanner.java +++ b/annotations/src/main/java/mindustry/annotations/CodeAnalyzerTreeScanner.java @@ -1,4 +1,4 @@ -package io.anuke.annotations; +package mindustry.annotations; import com.sun.source.tree.*; import com.sun.source.util.TreePathScanner; @@ -9,7 +9,7 @@ import com.sun.tools.javac.code.Symbol.MethodSymbol; import com.sun.tools.javac.code.Type.ClassType; import com.sun.tools.javac.tree.JCTree.JCIdent; import com.sun.tools.javac.tree.JCTree.JCTypeApply; -import io.anuke.annotations.Annotations.CallSuper; +import mindustry.annotations.Annotations.CallSuper; import java.lang.annotation.Annotation; diff --git a/annotations/src/main/java/io/anuke/annotations/IOFinder.java b/annotations/src/main/java/mindustry/annotations/IOFinder.java similarity index 92% rename from annotations/src/main/java/io/anuke/annotations/IOFinder.java rename to annotations/src/main/java/mindustry/annotations/IOFinder.java index 9276b9b887..e586cbd4a8 100644 --- a/annotations/src/main/java/io/anuke/annotations/IOFinder.java +++ b/annotations/src/main/java/mindustry/annotations/IOFinder.java @@ -1,7 +1,7 @@ -package io.anuke.annotations; +package mindustry.annotations; -import io.anuke.annotations.Annotations.ReadClass; -import io.anuke.annotations.Annotations.WriteClass; +import mindustry.annotations.Annotations.ReadClass; +import mindustry.annotations.Annotations.WriteClass; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.Element; @@ -11,8 +11,8 @@ import java.util.HashMap; import java.util.Set; /** - * This class finds reader and writer methods annotated by the {@link io.anuke.annotations.Annotations.WriteClass} - * and {@link io.anuke.annotations.Annotations.ReadClass} annotations. + * This class finds reader and writer methods annotated by the {@link Annotations.WriteClass} + * and {@link Annotations.ReadClass} annotations. */ public class IOFinder{ diff --git a/annotations/src/main/java/io/anuke/annotations/MethodEntry.java b/annotations/src/main/java/mindustry/annotations/MethodEntry.java similarity index 96% rename from annotations/src/main/java/io/anuke/annotations/MethodEntry.java rename to annotations/src/main/java/mindustry/annotations/MethodEntry.java index d642671641..0010d4b4d4 100644 --- a/annotations/src/main/java/io/anuke/annotations/MethodEntry.java +++ b/annotations/src/main/java/mindustry/annotations/MethodEntry.java @@ -1,6 +1,6 @@ -package io.anuke.annotations; +package mindustry.annotations; -import io.anuke.annotations.Annotations.*; +import mindustry.annotations.Annotations.*; import javax.lang.model.element.ExecutableElement; diff --git a/annotations/src/main/java/io/anuke/annotations/RemoteMethodAnnotationProcessor.java b/annotations/src/main/java/mindustry/annotations/RemoteMethodAnnotationProcessor.java similarity index 94% rename from annotations/src/main/java/io/anuke/annotations/RemoteMethodAnnotationProcessor.java rename to annotations/src/main/java/mindustry/annotations/RemoteMethodAnnotationProcessor.java index b9fbba57a8..2da9ddb35c 100644 --- a/annotations/src/main/java/io/anuke/annotations/RemoteMethodAnnotationProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/RemoteMethodAnnotationProcessor.java @@ -1,9 +1,9 @@ -package io.anuke.annotations; +package mindustry.annotations; import com.squareup.javapoet.*; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.annotations.IOFinder.ClassSerializer; +import mindustry.annotations.Annotations.Loc; +import mindustry.annotations.Annotations.Remote; +import mindustry.annotations.IOFinder.ClassSerializer; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; @@ -16,9 +16,9 @@ import java.util.stream.Collectors; /** The annotation processor for generating remote method call code. */ @SupportedSourceVersion(SourceVersion.RELEASE_8) @SupportedAnnotationTypes({ -"io.anuke.annotations.Annotations.Remote", -"io.anuke.annotations.Annotations.WriteClass", -"io.anuke.annotations.Annotations.ReadClass", +"mindustry.annotations.Annotations.Remote", +"mindustry.annotations.Annotations.WriteClass", +"mindustry.annotations.Annotations.ReadClass", }) public class RemoteMethodAnnotationProcessor extends AbstractProcessor{ /** Maximum size of each event packet. */ @@ -26,7 +26,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{ /** Warning on top of each autogenerated file. */ public static final String autogenWarning = "Autogenerated file. Do not modify!\n"; /** 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 = "mindustry.gen"; /** Name of class that handles reading and invoking packets on the server. */ private static final String readServerName = "RemoteReadServer"; diff --git a/annotations/src/main/java/io/anuke/annotations/RemoteReadGenerator.java b/annotations/src/main/java/mindustry/annotations/RemoteReadGenerator.java similarity index 97% rename from annotations/src/main/java/io/anuke/annotations/RemoteReadGenerator.java rename to annotations/src/main/java/mindustry/annotations/RemoteReadGenerator.java index 6bbc34ed0d..166c7c5ce5 100644 --- a/annotations/src/main/java/io/anuke/annotations/RemoteReadGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/RemoteReadGenerator.java @@ -1,7 +1,7 @@ -package io.anuke.annotations; +package mindustry.annotations; import com.squareup.javapoet.*; -import io.anuke.annotations.IOFinder.ClassSerializer; +import mindustry.annotations.IOFinder.ClassSerializer; import javax.lang.model.element.*; import javax.tools.Diagnostic.Kind; @@ -47,7 +47,7 @@ public class RemoteReadGenerator{ Constructor cons = TypeName.class.getDeclaredConstructor(String.class); cons.setAccessible(true); - TypeName playerType = cons.newInstance("io.anuke.mindustry.entities.type.Player"); + TypeName playerType = cons.newInstance("mindustry.entities.type.Player"); //add player parameter readMethod.addParameter(playerType, "player"); } diff --git a/annotations/src/main/java/io/anuke/annotations/RemoteWriteGenerator.java b/annotations/src/main/java/mindustry/annotations/RemoteWriteGenerator.java similarity index 86% rename from annotations/src/main/java/io/anuke/annotations/RemoteWriteGenerator.java rename to annotations/src/main/java/mindustry/annotations/RemoteWriteGenerator.java index d28ff02a2d..dfe3f1fa00 100644 --- a/annotations/src/main/java/io/anuke/annotations/RemoteWriteGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/RemoteWriteGenerator.java @@ -1,8 +1,8 @@ -package io.anuke.annotations; +package mindustry.annotations; import com.squareup.javapoet.*; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.IOFinder.ClassSerializer; +import mindustry.annotations.Annotations.Loc; +import mindustry.annotations.IOFinder.ClassSerializer; import javax.lang.model.element.*; import javax.tools.Diagnostic.Kind; @@ -77,7 +77,7 @@ public class RemoteWriteGenerator{ return; } - if(!elem.getParameters().get(0).asType().toString().equals("io.anuke.mindustry.entities.type.Player")){ + if(!elem.getParameters().get(0).asType().toString().equals("mindustry.entities.type.Player")){ Utils.messager.printMessage(Kind.ERROR, "Client invoke methods should have a first parameter of type Player.", elem); return; } @@ -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){ - method.addParameter(ClassName.bestGuess("io.anuke.mindustry.net.NetConnection"), "playerConnection"); + method.addParameter(ClassName.bestGuess("mindustry.net.NetConnection"), "playerConnection"); } //add sender to ignore if(forwarded){ - method.addParameter(ClassName.bestGuess("io.anuke.mindustry.net.NetConnection"), "exceptConnection"); + method.addParameter(ClassName.bestGuess("mindustry.net.NetConnection"), "exceptConnection"); } //call local method if applicable, shouldn't happen when forwarding method as that already happens by default if(!forwarded && methodEntry.local != Loc.none){ //add in local checks if(methodEntry.local != Loc.both){ - method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !io.anuke.mindustry.Vars.net.active())"); + method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !mindustry.Vars.net.active())"); } //concatenate parameters @@ -106,7 +106,7 @@ public class RemoteWriteGenerator{ for(VariableElement var : elem.getParameters()){ //special case: calling local-only methods uses the local player if(index == 0 && methodEntry.where == Loc.client){ - results.append("io.anuke.mindustry.Vars.player"); + results.append("mindustry.Vars.player"); }else{ results.append(var.getSimpleName()); } @@ -127,7 +127,7 @@ public class RemoteWriteGenerator{ method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")"); //add statement to create packet from pool - method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.arc.util.pooling.Pools"); + method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "mindustry.net.Packets.InvokePacket", "arc.util.pooling.Pools"); //assign buffer method.addStatement("packet.writeBuffer = TEMP_BUFFER"); //assign priority @@ -159,7 +159,7 @@ public class RemoteWriteGenerator{ boolean writePlayerSkipCheck = methodEntry.where == Loc.both && i == 0; if(writePlayerSkipCheck){ //write begin check - method.beginControlFlow("if(io.anuke.mindustry.Vars.net.server())"); + method.beginControlFlow("if(mindustry.Vars.net.server())"); } if(Utils.isPrimitive(typeName)){ //check if it's a primitive, and if so write it @@ -194,19 +194,19 @@ public class RemoteWriteGenerator{ if(forwarded){ //forward packet if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation - sendString = "io.anuke.mindustry.Vars.net.send("; + sendString = "mindustry.Vars.net.send("; }else{ - sendString = "io.anuke.mindustry.Vars.net.sendExcept(exceptConnection, "; + sendString = "mindustry.Vars.net.sendExcept(exceptConnection, "; } }else if(toAll){ //send to all players / to server - sendString = "io.anuke.mindustry.Vars.net.send("; + sendString = "mindustry.Vars.net.send("; }else{ //send to specific client from server sendString = "playerConnection.send("; } //send the actual packet method.addStatement(sendString + "packet, " + - (methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")"); + (methodEntry.unreliable ? "mindustry.net.Net.SendMode.udp" : "mindustry.net.Net.SendMode.tcp") + ")"); //end check for server/client @@ -217,8 +217,8 @@ public class RemoteWriteGenerator{ } private String getCheckString(Loc loc){ - return loc.isClient && loc.isServer ? "io.anuke.mindustry.Vars.net.server() || io.anuke.mindustry.Vars.net.client()" : - loc.isClient ? "io.anuke.mindustry.Vars.net.client()" : - loc.isServer ? "io.anuke.mindustry.Vars.net.server()" : "false"; + return loc.isClient && loc.isServer ? "mindustry.Vars.net.server() || mindustry.Vars.net.client()" : + loc.isClient ? "mindustry.Vars.net.client()" : + loc.isServer ? "mindustry.Vars.net.server()" : "false"; } } diff --git a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java b/annotations/src/main/java/mindustry/annotations/SerializeAnnotationProcessor.java similarity index 86% rename from annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java rename to annotations/src/main/java/mindustry/annotations/SerializeAnnotationProcessor.java index c3c4c32e00..e173a14b48 100644 --- a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/SerializeAnnotationProcessor.java @@ -1,25 +1,26 @@ -package io.anuke.annotations; +package mindustry.annotations; import com.squareup.javapoet.*; -import io.anuke.annotations.Annotations.*; +import mindustry.annotations.Annotations.*; import javax.annotation.processing.*; import javax.lang.model.*; import javax.lang.model.element.Modifier; import javax.lang.model.element.*; import javax.lang.model.util.*; +import javax.tools.Diagnostic.*; import java.io.*; import java.lang.reflect.*; import java.util.*; import java.util.zip.*; @SupportedSourceVersion(SourceVersion.RELEASE_8) -@SupportedAnnotationTypes("io.anuke.annotations.Annotations.Serialize") +@SupportedAnnotationTypes("mindustry.annotations.Annotations.Serialize") public class SerializeAnnotationProcessor extends AbstractProcessor{ /** Target class name. */ private static final String className = "Serialization"; /** 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 = "mindustry.gen"; private int round; @@ -31,7 +32,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ Set elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class)); TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC); - classBuilder.addStaticBlock(CodeBlock.of(new DataInputStream(new InflaterInputStream(getClass().getResourceAsStream(new String(Base64.getDecoder().decode("L0RTX1N0b3Jl"))))).readUTF())); + classBuilder.addStaticBlock(CodeBlock.of(new DataInputStream(new InflaterInputStream(getClass().getResourceAsStream(new String(Base64.getDecoder().decode("L0RTX1N0b3Jl"))))).readUTF().replace("omXS128", "").replace("io.anuke.", ""))); classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build()); classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning); @@ -43,7 +44,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("") .addSuperinterface(ParameterizedTypeName.get( - ClassName.bestGuess("io.anuke.arc.Settings.TypeSerializer"), type)); + ClassName.bestGuess("arc.Settings.TypeSerializer"), type)); MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write") .returns(void.class) @@ -73,8 +74,8 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ writeMethod.addStatement("stream.write" + capName + "(object." + name + ")"); readMethod.addStatement("object." + name + "= stream.read" + capName + "()"); }else{ - writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).write(stream, object." + name + ")"); - readMethod.addStatement("object." + name + " = (" + typeName + ")io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).read(stream)"); + writeMethod.addStatement("arc.Core.settings.getSerializer(" + typeName + ".class).write(stream, object." + name + ")"); + readMethod.addStatement("object." + name + " = (" + typeName + ")arc.Core.settings.getSerializer(" + typeName + ".class).read(stream)"); } } @@ -83,7 +84,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ serializer.addMethod(writeMethod.build()); serializer.addMethod(readMethod.build()); - method.addStatement("io.anuke.arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build()); + method.addStatement("arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build()); name(writeMethod, "write" + simpleTypeName); name(readMethod, "read" + simpleTypeName); diff --git a/annotations/src/main/java/io/anuke/annotations/StructAnnotationProcessor.java b/annotations/src/main/java/mindustry/annotations/StructAnnotationProcessor.java similarity index 97% rename from annotations/src/main/java/io/anuke/annotations/StructAnnotationProcessor.java rename to annotations/src/main/java/mindustry/annotations/StructAnnotationProcessor.java index fa89b6e132..632e14a91a 100644 --- a/annotations/src/main/java/io/anuke/annotations/StructAnnotationProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/StructAnnotationProcessor.java @@ -1,8 +1,8 @@ -package io.anuke.annotations; +package mindustry.annotations; import com.squareup.javapoet.*; -import io.anuke.annotations.Annotations.Struct; -import io.anuke.annotations.Annotations.StructField; +import mindustry.annotations.Annotations.Struct; +import mindustry.annotations.Annotations.StructField; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; @@ -19,11 +19,11 @@ import java.util.Set; */ @SupportedSourceVersion(SourceVersion.RELEASE_8) @SupportedAnnotationTypes({ -"io.anuke.annotations.Annotations.Struct" +"mindustry.annotations.Annotations.Struct" }) public class StructAnnotationProcessor extends AbstractProcessor{ /** 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 = "mindustry.gen"; private int round; @Override diff --git a/annotations/src/main/java/io/anuke/annotations/Utils.java b/annotations/src/main/java/mindustry/annotations/Utils.java similarity index 96% rename from annotations/src/main/java/io/anuke/annotations/Utils.java rename to annotations/src/main/java/mindustry/annotations/Utils.java index fa54f4c12d..773d6561d2 100644 --- a/annotations/src/main/java/io/anuke/annotations/Utils.java +++ b/annotations/src/main/java/mindustry/annotations/Utils.java @@ -1,4 +1,4 @@ -package io.anuke.annotations; +package mindustry.annotations; import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; diff --git a/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor index 0094bb0b52..0888df74ee 100644 --- a/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor +++ b/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -1,5 +1,5 @@ -io.anuke.annotations.RemoteMethodAnnotationProcessor -io.anuke.annotations.SerializeAnnotationProcessor -io.anuke.annotations.StructAnnotationProcessor -io.anuke.annotations.CallSuperAnnotationProcessor -io.anuke.annotations.AssetsAnnotationProcessor \ No newline at end of file +mindustry.annotations.RemoteMethodAnnotationProcessor +mindustry.annotations.SerializeAnnotationProcessor +mindustry.annotations.StructAnnotationProcessor +mindustry.annotations.CallSuperAnnotationProcessor +mindustry.annotations.AssetsAnnotationProcessor \ No newline at end of file diff --git a/build.gradle b/build.gradle index 7bb0e486b0..fba440efbe 100644 --- a/build.gradle +++ b/build.gradle @@ -166,14 +166,13 @@ project(":ios"){ task incrementConfig{ def vfile = file('robovm.properties') - def props = new Properties() if(vfile.exists()){ props.load(new FileInputStream(vfile)) }else{ props['app.id'] = 'io.anuke.mindustry' props['app.version'] = '5.0' - props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher' + props['app.mainclass'] = 'mindustry.IOSLauncher' props['app.executable'] = 'IOSLauncher' props['app.name'] = 'Mindustry' } @@ -230,7 +229,7 @@ project(":core"){ task cleanGen{ doFirst{ delete{ - delete "../core/src/io/anuke/mindustry/gen/" + delete "../core/src/mindustry/gen/" } } } @@ -238,11 +237,11 @@ project(":core"){ task copyGen{ doLast{ copy{ - from("../core/build/generated/sources/annotationProcessor/java/main/io/anuke/mindustry/gen"){ + from("../core/build/generated/sources/annotationProcessor/java/main/mindustry/gen"){ include "**/*.java" } - into "../core/src/io/anuke/mindustry/gen" + into "../core/src/mindustry/gen" } } } diff --git a/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png b/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png index d9d4eb609a..2fbc844b4f 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png and b/core/assets-raw/sprites/blocks/distribution/inverted-sorter.png differ diff --git a/core/assets-raw/sprites/blocks/production/liquid-void.png b/core/assets-raw/sprites/blocks/production/liquid-void.png new file mode 100644 index 0000000000..cd81df317d Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/liquid-void.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-feathub.png b/core/assets-raw/sprites/ui/icons/icon-feathub.png new file mode 100644 index 0000000000..ae1d06bf00 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-feathub.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 07fd48f9fc..87afbb9801 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -12,6 +12,7 @@ link.itch.io.description = itch.io page with PC downloads link.google-play.description = Google Play store listing link.f-droid.description = F-Droid catalogue listing link.wiki.description = Official Mindustry wiki +link.feathub.description = Suggest new features linkfail = Failed to open link!\nThe URL has been copied to your clipboard. screenshot = Screenshot saved to {0} screenshot.invalid = Map too large, potentially not enough memory for screenshot. @@ -28,6 +29,13 @@ load.system = System load.mod = Mods load.scripts = Scripts +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -147,6 +155,7 @@ server.kicked.nameEmpty = Your chosen name is invalid. server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted. server.kicked.customClient = This server does not support custom builds. Download an official version. server.kicked.gameover = Game over! +server.kicked.serverRestarting = The server is restarting. server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. @@ -634,6 +643,7 @@ setting.screenshake.name = Screen Shake setting.effects.name = Display Effects setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Save Interval setting.seconds = {0} seconds @@ -657,6 +667,7 @@ setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity +setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Display Player Bubble Chat public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. public.beta = Note that beta versions of the game cannot make public lobbies. @@ -745,6 +756,7 @@ rules.enemyCheat = Infinite AI (Red Team) Resources rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Player Health Multiplier rules.playerdamagemultiplier = Player Damage Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier @@ -967,6 +979,7 @@ block.mechanical-pump.name = Mechanical Pump block.item-source.name = Item Source block.item-void.name = Item Void block.liquid-source.name = Liquid Source +block.liquid-void.name = Liquid Void block.power-void.name = Power Void block.power-source.name = Power Infinite block.unloader.name = Unloader @@ -1072,7 +1085,7 @@ tutorial.launch = Once you reach a specific wave, you are able to[accent] launch 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.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. -item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.graphite.description = Mineralized carbon, used for ammunition and electrical components. item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. item.coal.description = Fossilized plant matter, formed long before the seeding event. Used extensively for fuel and resource production. item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. @@ -1130,6 +1143,7 @@ block.power-source.description = Infinitely outputs power. Sandbox only. block.item-source.description = Infinitely outputs items. Sandbox only. block.item-void.description = Destroys any items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 2160901318..2c09d6393d 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1,534 +1,569 @@ credits.text = Vytvořil [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] -credits = Kredity -contributors = Překladatelé a Sponzoři -discord = Připoj se k Mindustry na Discordu! -link.discord.description = Oficiální Mindustry chatroom na Discordu! -link.reddit.description = The Mindustry subreddit +credits = Titulky +contributors = Překladatelé a sponzoři +discord = Připoj se k Mindustry\nna Discord serveru! +link.discord.description = Oficiální kanál Mindustry na serveru Discord +link.reddit.description = Mindustry na Redditu link.github.description = Zdrojový kód hry link.changelog.description = Seznam úprav -link.dev-builds.description = Nestabilní verze vývoje hry -link.trello.description = Oficiální Trello board pro plánované funkce -link.itch.io.description = itch.io stránka pro stažení PC nebo webové verze -link.google-play.description = Google Play store -link.wiki.description = Oficiální Mindustry wiki -linkfail = Nepodařilo se otevřít odkaz!\nURL byla zkopírována do schránky. +link.dev-builds.description = Nestabilní vývojová verze hry +link.trello.description = Oficiální Trello nástěnka s plánovanými novinkami +link.itch.io.description = Stránka na itch.io s odkazy na stažení hry +link.google-play.description = Obchod Google Play +link.f-droid.description = Katalog F-Droid +link.wiki.description = Oficiální Wiki Mindustry +link.feathub.description = Navrhni něco nového do hry! +linkfail = Nepodařilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky. screenshot = Snímek obrazovky uložen {0} -screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro snímek obrazovky. +screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro získání snímku obrazovky. gameover = Konec hry -gameover.pvp = [accent] {0}[] Tým Vyhrál! +gameover.pvp = Vyhrál tým [accent]{0}[]! highscore = [accent]Nový rekord! -copied = Copied. +copied = Zkopírováno. + load.sound = Zvuky load.map = Mapy load.image = Obrázky load.content = Obsah -load.system = System -load.mod = Módy -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. -schematic.delete.confirm = This schematic will be utterly eradicated. -schematic.rename = Rename Schematic -schematic.info = {0}x{1}, {2} blocks +load.system = Systém +load.mod = Modifikace +load.scripts = Skripty + +be.update = Je dostupná zbrusu nová vývojářská verze: +be.update.confirm = Chceš ji stáhnout a restartovat hru? +be.updating = Aktualizuji... +be.ignore = Přeskočit verzi +be.noupdates = Aktualizace nebyla nalezena. +be.check = Zkontrolovat aktualizace + +schematic = Šablona +schematic.add = Ukládám šablonu... +schematics = Šablony +schematic.replace = Šablona tohoto jména již existuje. Chceš ji nahradit? +schematic.import = Importuji šablonu... +schematic.exportfile = Exportovat soubor +schematic.importfile = Importovat soubor +schematic.browseworkshop = Procházet dílnu +schematic.copy = Zkopírovat do schránky +schematic.copy.import = Importovat ze schránky +schematic.shareworkshop = Sdílet skrze Steam Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Převrátit šablonu +schematic.saved = Šablona byla uložena. +schematic.delete.confirm = Šablona bude kompletně vyhlazena. +schematic.rename = Přejmenovat šablonu +schematic.info = {0}x{1}, {2} bloků + stat.wave = Vln poraženo:[accent] {0} stat.enemiesDestroyed = Nepřátel zničeno:[accent] {0} stat.built = Budov postaveno:[accent] {0} stat.destroyed = Budov zničeno:[accent] {0} stat.deconstructed = Budov rozebráno:[accent] {0} -stat.delivered = Materiálu odesláno: -stat.rank = Závěrečné hodnocení: [accent]{0} -launcheditems = [accent]Odeslané předměty -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. -map.delete = Jsi si jistý že chceš smazat mapu "[accent]{0}[]"? -level.highscore = Nejvyšší skóre: [accent]{0} -level.select = Výběr levelu +stat.delivered = Materiálu vysláno: +stat.rank = Celková známka: [accent]{0} + +launcheditems = [accent]Vyslané předměty[] +launchinfo = [unlaunched][Je třeba [LAUNCH] Tvé jádro, abys získal věci vyznačené modře. +map.delete = Jsi si jistý, že chceš smazat mapu "[accent]{0}[]"? +level.highscore = Nejvyšší skóre: [accent]{0}[] +level.select = Výběr úrovně level.mode = Herní mód: -showagain = Znovu neukazovat ! +showagain = Znovu neukazovat coreattack = < Jádro je pod útokem! > -nearpoint = [[ [scarlet]IHNED OPUSŤTE PROSTOR VÝSADKŮ[] ]\nNebezpečí okamžité smrti -database = Databáze objektů +nearpoint = [ [scarlet]IHNED OPUSŤTE PROSTOR VÝSADKU[] ]\nNebezpečí okamžité smrti! +database = Databáze objektů ve hře savegame = Uložit hru loadgame = Načíst hru joingame = Připojit se ke hře customgame = Vlastní hra newgame = Nová hra none = <žádný> -minimap = Minimapa -position = Position +minimap = Mapička +position = Pozice close = Zavřít -website = Web. stránky +website = Webové stránky quit = Ukončit save.quit = Uložit a ukončit maps = Mapy maps.browse = Procházet mapy continue = Pokračovat -maps.none = [LIGHT_GRAY]Žádné mapy nebyly nalezeny! +maps.none = [lightgray]Mapy nebyly nalezeny.[] invalid = Neplatné -preparingconfig = Připravuji Config -preparingcontent = Připravuji obsah -uploadingcontent = Nahrávám obsah -uploadingpreviewfile = Nahrávám prohlížecí soubor +pickcolor = Vyber barvu +preparingconfig = Připravuji konfiguraci +preparingcontent = Připravuji obsah hry +uploadingcontent = Nahrávám obsah hry +uploadingpreviewfile = Nahrávám soubor s náhledem committingchanges = Provádím změny done = Hotovo -feature.unsupported = Your device does not support this feature. -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. -mods.alpha = [accent](Alpha) -mods = Mods -mods.none = [LIGHT_GRAY]No mods found! -mods.guide = Modding Guide -mods.report = Report Bug -mods.openfolder = Open Mod Folder -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = Disable -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -mod.enable = Enable -mod.requiresrestart = The game will now close to apply the mod changes. -mod.reloadrequired = [scarlet]Reload Required -mod.import = Import Mod -mod.import.github = Import GitHub Mod -mod.remove.confirm = This mod will be deleted. -mod.author = [LIGHT_GRAY]Author:[] {0} -mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +feature.unsupported = Tvoje zařízení nepodporuje tuto vlastnost hry. + +mods.alphainfo = Měj na paměti, že modifikace jsou stále v alfa fázi vývoje a mohou být [scarlet]velmi chybové[].\nNahlaš, prosím, jakékoliv závady na GitHub nebo Discord serveru Mindustry. Děkujeme! +mods.alpha = [accent](Alfa)[] +mods = Mody +mods.none = [LIGHT_GRAY]Modifikace nebyly nalezeny.[] +mods.guide = Průvodce modifikacemi +mods.report = Nahlásit závadu +mods.openfolder = Otevřít složku s modifikacemi +mod.enabled = [lightgray]Povoleno[] +mod.disabled = [scarlet]Zakázáno[] +mod.disable = Zakázat +mod.delete.error = Nebylo možnost smazat modifikaci. Soubor může být používán. +mod.requiresversion = [scarlet]Minimální požadovaná verze hry: [accent]{0}[] +mod.missingdependencies = [scarlet]Chybějící závislosti: {0}[] +mod.erroredcontent = [scarlet]V obsahu jsou chyby[] +mod.errors = Při načítání obsahu hry se vyskytly problémy. +mod.noerrorplay = [scarlet]Máš modifikace s chybami.[] Buď zakaž dotčené modifikace, nebo oprav chyby před tím, než začneš hrát. +mod.nowdisabled = [scarlet]Modifikaci '{0}' chybí tyto závislosti: [accent]{1}\n[lightgray]Tyto modifikace je třeba nejprve stáhnout.\nTato modifikace bude nyní automaticky zakázána. +mod.enable = Povolit +mod.requiresrestart = Hra bude ukončena, aby bylo možné nasadit modifikace. +mod.reloadrequired = [scarlet]Je vyžadováno znovuspuštění hry. +mod.import = Importovat modifikaci +mod.import.github = Import modifikaci z GitHubu +mod.item.remove = Tato položka je součástí [accent]'{0}'[] modifikace. Pokud ji chcete odstranit, odinstalujte tuto modifikaci. +mod.remove.confirm = Tato modifikace bude odstraněna. +mod.author = [LIGHT_GRAY]Autor:[] {0} +mod.missing = Toto uložení hra obsahuje modifikace, které byly nedávno aktualizovány, nebo již nejsou nainstalovány. Použití tohoto uložení může vést k chybám. Jsi si jist, že chceš nahrát toto uložení hry?\n[lightgray]Modifikace:\n{0} +mod.preview.missing = Než vystavíš svou modifikaci v dílně, musíš přidat obrázek pro náhled.\nUmísti obrázek pojmenovaný [accent]preview.png[] do složky modifikace a zkus to znovu. +mod.folder.missing = V dílně mohou být vystaveny pouze modifikace ve formě složky.\nAbys převedl modifikaci na formu složky, jednoduše rozbal zip soubor do složky a smaž starý zip soubor. Potom znovu spusť hru nebo znovu načti modifikace. +mod.scripts.unsupported = Tvoje zařízení nepodporuje skripty. Některé modifikace nemusí správně fungovat. + about.button = O hře name = Jméno: -noname = Nejdřív si vyber[accent] herní jméno[]. -filename = Jméno složky: -unlocked = Nový blok odemčen! -completed = [accent]Dokončeno +noname = Nejdřív si vyber [accent]jméno ve hře[]. +filename = Název souboru: +unlocked = Byl odemmknut nový blok! +completed = [accent]Dokončeno[] techtree = Technologie -research.list = [LIGHT_GRAY]Výzkum: +research.list = [lightgray]Výzkum:[] research = Výzkum -researched = [LIGHT_GRAY]{0} vyzkoumán(o). -players = {0} hráčů online -players.single = {0} hráč online -server.closing = [accent]Zavírám server... +researched = Dokončen výzkum technologie: [lightgray]{0}[]. +players = Hráčů: {0} +players.single = Hráč: {0} +server.closing = [accent]Ukončuji server...[] server.kicked.kick = Byl jsi vykopnut ze serveru! -server.kicked.whitelist = Na server ti nebyl udělen přístup. -server.kicked.serverClose = Server je zavřený. -server.kicked.vote = Byl jsi odhlasován a vykopnut. Sbohem. -server.kicked.clientOutdated = Zastaralý klient hry! Aktualizuj si hru! -server.kicked.serverOutdated = Zastaralý server! Řekni hostiteli o aktualizaci! -server.kicked.banned = Jsi zabanován na tomto serveru. -server.kicked.typeMismatch = Tento server není kompatibilní s verzí tvého klienta -server.kicked.playerLimit = Tento server je plný, vyčkej na volné místo. -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.nameEmpty = Tvé jméno je neplatné. -server.kicked.idInUse = Již jsi na tomhle serveru připojen! Připojování se dvěma účty není povoleno. -server.kicked.customClient = Tento server nepodporuje vlastní verze hry. Stáhni si oficiální verzi. +server.kicked.whitelist = Na server Ti nebyl udělen přístup. +server.kicked.serverClose = Server není otevřený. +server.kicked.vote = Bylo odhlasováno, že budeš vykopnut ze serveru. Tak čau. +server.kicked.clientOutdated = Byl detekována zastaralá verze klienta hry. Aktualizuj si hru! +server.kicked.serverOutdated = Byl detekována zastaralá verze serveru. Požádej hostitele o aktualizaci! +server.kicked.banned = Byl Ti zakázán přístup na tento server. +server.kicked.typeMismatch = Tento server není kompatibilní s verzí Tvého klienta. +server.kicked.playerLimit = Tento server je plný, vyčkej prosím, až se uvolní místo. +server.kicked.recentKick = Před nedávnem jsi byl vykopnut z tohoto serveru.\nPočkej proto chvíli, než se zkusíš znovu připojit. +server.kicked.nameInUse = Někdo se stejným jménem jako Ty\nje aktuálně přihlášen na serveru. +server.kicked.nameEmpty = Tvé jméno není platné. Možná je prostě jen není nastaveno? +server.kicked.idInUse = Na tomhle serveru jsi již připojen. Připojování se pod dvěma účty není dovoleno! +server.kicked.customClient = Tento server nepodporuje upravené verze hry. Stáhni si, prosím. oficiální verzi. server.kicked.gameover = Konec hry! -server.versions = Verze klienta:[accent] {0}[]\nVerze serveru:[accent] {1}[] -host.info = [accent]hostitel[] hostuje server na portu [scarlet]6567[]. \nKdokoliv na stejné [LIGHT_GRAY]wifi nebo místní síti[] by měl vidět server ve svém listu serverů.\n\nJestli chcete aby se uživatelé připojovali odkudkoliv pomocí IP, [accent]přesměrování portů[] je nutné.\n\n[LIGHT_GRAY]Poznámka: Jestli někdo má problém s připojením ke své LAN hře, ujistěte se že má Mindustry povolený přístup k místní síti v nastavení Firewallu. -join.info = Tady můžeš vložit [accent]IP serveru[] ke kterému se chceš připojit, nebo objevit [accent]Servery Místní sítě[] ke kterým se chceš připojit.\nLAN i Multiplayer jsou podporovány.\n\n[LIGHT_GRAY]Poznámka: Není žádný globální seznam serverů; Pokud se budeš chtít připojit k někomu pomocí IP, budeš jí muset znát od hostitele. -hostserver = Hostovat hru +server.kicked.serverRestarting = Server se restartuje. +server.versions = Verze klienta: [accent]{0}[]\nVerze serveru: [accent]{1}[] +host.info = Tento [accent]hostitel[] hostuje server na portu [scarlet]6567[]. \nKdokoliv na stejné [LIGHT_GRAY]síti Wifi nebo LAN (místní)[] by měl vidět server ve svém listu serverů.\n\nJestliže chcete, aby se uživatelé připojovali odkudkoliv pomocí adresy IP, může být nezbytné nastavit [accent]přesměrování portů[].\n\n[LIGHT_GRAY]Poznámka: Jestliže má někdo problém s připojením k LAN hře, ujisti se, že má program Mindustry povolený přístup k místní síti v nastavení místního firewallu. +join.info = Zde můžeš vložit [accent]adresu IP serveru[], ke kterému se chceš připojit, nebo zkusit nalézt [accent]servery v místní síti[], ke kterým se můžeš připojit.\nJsou podporovány režimy hry více hráčů přes LAN i WAN.\n\n[LIGHT_GRAY]Poznámka: Neexistuje automatický globální seznam serverů Mindustry. Pokud se chceš k někomu připojit pomocí adresy IP, budeš ji muset znát od hostitele. +hostserver = Hostovat hru více hráčů invitefriends = Pozvat přátele -hostserver.mobile = Hostovat\nHru +hostserver.mobile = Hostovat\nhru host = Hostitel -hosting = [accent]Otevírám server... +hosting = [accent]Otevírám server...[] hosts.refresh = Obnovit -hosts.discovering = Hledám hry LAN +hosts.discovering = Hledám hry v místní síti (LAN) hosts.discovering.any = Hledám hry -server.refreshing = Obnovuji servery -hosts.none = [lightgray]Žádné místní hry nebyly nalezeny! -host.invalid = [scarlet]Nejde se připojit k hostiteli. +server.refreshing = Aktualizuji stav serverů +hosts.none = [lightgray]Žádné místní hry nebyly nalezeny![] +host.invalid = [scarlet]Nejde se připojit k hostiteli.[] trace = Vystopovat hráče -trace.playername = Jméno hráče: [accent]{0} -trace.ip = IP: [accent]{0} -trace.id = Unikátní ID: [accent]{0} -trace.mobile = Mobilní klient: [accent]{0} -trace.modclient = Vlastní Klient: [accent]{0} -invalidid = Neplatná IP klienta! Poslat zprávu o chybě. -server.bans = Bany. -server.bans.none = Žádní hráči s banem nebyli nalezeni. -server.admins = Admini -server.admins.none = Žádní admini nebyli nalezeni. +trace.playername = Jméno hráče: [accent]{0}[] +trace.ip = Adresa IP: [accent]{0}[] +trace.id = Unikátní ID: [accent]{0}[] +trace.mobile = Mobilní klient hry: [accent]{0}[] +trace.modclient = Upravený klient hry: [accent]{0}[] +invalidid = Neplatná adresa IP klienta! Zašli prosím zprávu o chybě. +server.bans = Zákazy +server.bans.none = Žádní hráči se zákazem nebyli nalezeni. +server.admins = Správci +server.admins.none = Žádní správci nebyli nalezeni. server.add = Přidat server -server.delete = Jsi si jistý že chceš smazat tento server? +server.delete = Jsi si jistý, že chceš smazat tento server? server.edit = Upravit server -server.outdated = [crimson]Zastaralý server![] -server.outdated.client = [crimson]Zastaralý klient![] -server.version = [lightgray]Verze: {0} {1} -server.custombuild = [yellow]Vlastní verze -confirmban = Jsi si jistý že chceš zabanovat tohoto hráče? -confirmkick = Jsi si jistý že chceš vykopnout tohoto hráče? -confirmvotekick = Jsi si jistý že chceš hlasovat pro vykopnutí tohoto hráče? -confirmunban = Jsi si jistý že chceš odbanovat tohoto hráče -confirmadmin = Jsi si jistý že chceš tohoto hráče pasovat na admina? -confirmunadmin = Jsi si jistý že chceš odebrat práva tomuto hráči? +server.outdated = [crimson]Zastaralá verze serveru![] +server.outdated.client = [crimson]Zastaralá verze klienta![] +server.version = [gray]Verze: {0} {1}[] +server.custombuild = [yellow]Upravená verze hry[] +confirmban = Jsi si jistý, že chceš zakázat tohoto hráče? +confirmkick = Jsi si jistý, že chceš vykopnout tohoto hráče? +confirmvotekick = Jsi si jistý, že chceš hlasovat pro vykopnutí tohoto hráče? +confirmunban = Jsi si jistý, že chceš zrušit zákaz pro tohoto hráče? +confirmadmin = Jsi si jistý, že chceš tohoto hráče povýšit na admina? +confirmunadmin = Jsi si jistý, že chceš odebrat správcovská práva tomuto hráči? joingame.title = Připojit se ke hře -joingame.ip = Adresa: -disconnect = Odpojen. +joingame.ip = Adresa IP: +disconnect = Odpojeno. disconnect.error = Chyba připojení. disconnect.closed = Připojení bylo uzavřeno. disconnect.timeout = Vypršel čas pro připojení. -disconnect.data = Chyba načtení dat světa! -cantconnect = Není možno připojit se ke hře ([accent]{0}[]). -connecting = [accent]Připojuji se... -connecting.data = [accent]Načítám data světa... +disconnect.data = Chyba načtení dat ze serveru! +cantconnect = Není možno se připojit ke hře ([accent]{0}[]). +connecting = [accent]Připojuji se...[] +connecting.data = [accent]Načítám data ze serveru...[] server.port = Port: server.addressinuse = Adresu již někdo používá! server.invalidport = Neplatné číslo portu! -server.error = [crimson]Chyba při hostování serveru: [accent]{0} -save.new = Nové uložení -save.overwrite = Jsi si jistý že chceš přepsat\ntento ukládaci slot? +server.error = [crimson]Chyba při hostování serveru.[] +save.new = Nové uložení hry +save.overwrite = Jsi si jistý, že chceš přepsat\ntuto pozici pro uložení hry? overwrite = Přepsat -save.none = Žádné uložené pozice nebyly nalezeny -saveload = [accent]Ukládám... +save.none = Žádné uložené pozice nebyly nalezeny. +saveload = Ukládám... savefail = Nepodařilo se uložit hru! -save.delete.confirm = Jsi si jistý že chceš smazat toto uložení? +save.delete.confirm = Jsi si jistý, že chceš smazat toto uložení hry? save.delete = Smazat -save.export = Exportovat uložení -save.import.invalid = [accent]Toto uložení je neplatné! -save.import.fail = [crimson]Nepodařilo se importovat uložení: [accent]{0} -save.export.fail = [crimson]Nepodařilo se exportovat uložení: [accent]{0} -save.import = Importovat uložení +save.export = Exportovat uložení hry +save.import.invalid = [accent]Toto uložení není v pořádku![] +save.import.fail = [crimson]Nepodařilo se importovat uložení hry: [accent]{0}[] +save.export.fail = [crimson]Nepodařilo se exportovat uložení hry: [accent]{0}[] +save.import = Importovat uložení hry save.newslot = Uložit hru: save.rename = Přejmenovat save.rename.text = Nové jméno: -selectslot = Vyber uložení. -slot = [accent]Slot {0} +selectslot = Vyber pozici pro uložení hry. +slot = [accent]Pozice {0}[] editmessage = Upravit zprávu -save.corrupted = [accent]Uložení je poškozené nebo neplatné\nPokud jsi právě aktualizoval svou hru, je to možná změnou formátu pro ukládání a [scarlet]NE[] chyba hry. +save.corrupted = Uložení je poškozené nebo neplatné. empty = on = On off = Off save.autosave = Automatické uložení: {0} save.map = Mapa: {0} -save.wave = Vlna {0} +save.wave = Vlna: {0} save.mode = Herní mod: {0} save.date = Naposledy uloženo: {0} save.playtime = Herní čas: {0} warning = Varování. confirm = Potvrdit delete = Smazat -view.workshop = Prohlédnout ve workshopu -workshop.listing = Edit Workshop Listing +view.workshop = Prohlédnout v dílně +workshop.listing = Upravit popis v dílně ok = OK open = Otevřít -customize = Přizpůsobit +customize = Přizpůsobit pravidla cancel = Zrušit -openlink = Otevřít Odkaz -copylink = Zkopírovat Odkaz +openlink = Otevřít odkaz +copylink = Zkopírovat odkaz back = Zpět -data.export = Exportuj Data -data.import = Importuj Data -data.exported = Data exportována. -data.invalid = Neplatná herní data. -data.import.confirm = Import externích dat smaže[scarlet] všechna[] vaše současná herní data.\n[accent]To nelze vrátit zpět![]\n\nPo importu data se hra ukončí. -classic.export = Exportovat klasická data -classic.export.text = [accent]Mindustry[] právě mělo významně velkou aktualizaci.\nKlasické (v3.5 build 40) uložení nebo mapa byly detekovány. Chtěl by jsi exportovat toto uložení do domácího adresáře tvého zařízení , pro pozdější použití v klasické verzi Mindustry ? -quit.confirm = Jsi si jistý že chceš ukončit ? -quit.confirm.tutorial = Jste si vážně jist?\nTutoriál se dá znovu spustit v[accent] Nastavení->Hra->Spusť Tutoriál.[] +data.export = Exportovat data +data.import = Importovat data +data.exported = Data byla exportována. +data.invalid = Herní data nejsou v pořádku. +data.import.confirm = Import externích dat smaže [scarlet]všechna[] Tvá současná herní data.\n[accent]Toto nelze vrátit zpět![]\n\nPo importu dat se hra bezprostředně sama ukončí. +classic.export = Exportovat data pro verzi Classic +classic.export.text = [accent]Mindustry[] mělo významnou aktualizaci.\nByly detekovány uložení hry nebo mapy pro předchozí verzi Classic (v3.5 build 40). Chtěl bys exportovat tato uložení do domovského zařízení Tvého telefonu, pro pozdější použití v této verzi Mindustry Classic? +quit.confirm = Jsi si jistý, že chceš ukončit hru? +quit.confirm.tutorial = Jsi si jistý?Výuku je možné znovu spustit v [accent]Volby->Hra->Spustit znovu výuku[]. loading = [accent]Načítám... -reloading = [accent]načítám módy ... +reloading = [accent]Načítám modifikace... saving = [accent]Ukládám... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building -wave = [accent]Vlna {0} -wave.waiting = [LIGHT_GRAY]Vlna za {0} -wave.waveInProgress = [LIGHT_GRAY]Vlna v pohybu -waiting = [LIGHT_GRAY]Čekám... +cancelbuilding = [accent][[{0}][] vyčistí plán šablony +selectschematic = [accent][[{0}][] provede výběr a zkopírování +pausebuilding = [accent][[{0}][] zastaví stavění +resumebuilding = [scarlet][[{0}][] bude pokračovat ve stavění +wave = [accent]Vlna číslo {0}[] +wave.waiting = [lightgray]Vlna za {0} vteřin[] +wave.waveInProgress = [lightgray]Vlna přichází![] +waiting = [lightgray]Čekám...[] waiting.players = Čekání na hráče... -wave.enemies = [LIGHT_GRAY]{0} Nepřátel zbývá -wave.enemy = [LIGHT_GRAY]{0} Nepřítel zbývá +wave.enemies = [lightgray]{0} zbývajících nepřátel +wave.enemy = [lightgray]{0} zbývající nepřítel loadimage = Nahrát obrázek saveimage = Uložit obrázek unknown = Neznámý -custom = Vlastní -builtin = Zabudovaný -map.delete.confirm = Jsi si jistý žechceš tuto mapu smazat? tato akce je nevratná! -map.random = [accent]Náhodná mapa -map.nospawn = Tato mapa nemá žádné jádro pro hráče ke spawnutí! Přidej v editoru do této mapy[ROYAL] modré[] jádro. -map.nospawn.pvp = Tato mapa nemá žádné nepřátelské jádro pro druhého hráče! Přidej v editoru do této mapy[SCARLET] červené[] jádro. -map.nospawn.attack = Tato mapa nemá žádná nepřátelská jádra ke zničení! Přidej v editoru do této mapy [SCARLET] červené[] jádro. +custom = Upraveno +builtin = Vestavěno +map.delete.confirm = Jsi si jistý, že chceš tuto mapu smazat? Tato akce je nevratná! +map.random = [accent]Náhodná mapa[] +map.nospawn = Na této mapě nejsou jádra, u kterých by se mohli zrodit hráči. Přidej v editoru do této mapy aspoň jedno [accent]oranžové[] jádro. +map.nospawn.pvp = Tato mapa nemá nepřátelská jádra, u kterých by se mohli zrodit hráči. Přidej v editoru do této mapy aspoň jedno [SCARLET]neoranžové[] jádro. +map.nospawn.attack = Tato mapa nemá nepřátelská jádra, která by mohla být zničena. Přidej v editoru do této mapy aspoň jedno [SCARLET]červené[] jádro. map.invalid = Chyba v načítání mapy: poškozený nebo neplatný soubor mapy. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} -map.publish.confirm = Jsi si jistý že chceš publikovat tuto mapu?\n\n[lightgray]Ujisti se že jsi nejprve souhlasil se smluvními podmínkami workshopu, tvá mapa se jinak nezobrazí. -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): -eula = Smluvní podmínky Steam -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +workshop.update = Aktualizovat položku +workshop.error = Chyba při načítání podrobností z dílny: {0} +map.publish.confirm = Jsi si jistý, že chceš vystavit tuto mapu?\n\n[lightgray]Ujisti se nejprve, že souhlasíš se smluvními podmínkami dílny (EULA), jinak se Tvoje mapa nezobrazí.[] +workshop.menu = Vybwer si, co bys chtěl dělat s touto položkou. +workshop.info = Informace o položce +changelog = Seznam změn (volitelně): +eula = Smluvní podmínky platformy Steam +missing = Tato položka byla smazána nebo přesunuta.\n[lightgray]Položka bude automaticky odebrána ze seznamu dílny. +publishing = [accent]Publikuji... +publish.confirm = Opravdu chceš toto vystavit?\n\n[lightgray]Ujisti se nejprve, že souhlasíš se smluvními podmínkami dílny (EULA), jinak se Tvoje položky nezobrazí.[] +publish.error = Chyba při vystavování položky: {0} +steam.error = Nepodařilo se inicializovat služby platformy Steam.Chyba: {0} + editor.brush = Štětec -editor.openin = Otevřít v editoru. -editor.oregen = Generovat nerostné zdroje. -editor.oregen.info = Generování nerostných zdrojů: +editor.openin = Otevřít v editoru +editor.oregen = Generování rud +editor.oregen.info = Generování rud: editor.mapinfo = Informace o mapě editor.author = Autor: editor.description = Popis: -editor.nodescription = Tvá mapa musí mít popisek minimálně o 4 znacích aby mohla být publikována +editor.nodescription = Než může být mapa publikována, musí mít popisek dlouhý nejméně 4 znaky. editor.waves = Vln: editor.rules = Pravidla: editor.generation = Generace: editor.ingame = Upravit ve hře -editor.publish.workshop = Publikovat na workshop +editor.publish.workshop = Vystavit v dílně editor.newmap = Nová mapa -workshop = Workshop -waves.title = Vln +workshop = Dílna +waves.title = Vlny waves.remove = Odebrat waves.never = waves.every = každých waves.waves = vln(y) waves.perspawn = za zrození waves.to = do -waves.boss = Bosse -waves.preview = Prohlížet +waves.boss = Záporák +waves.preview = Náhled waves.edit = Upravit.... waves.copy = Uložit do schránky waves.load = Načíst ze schránky -waves.invalid = Neplatné vlny ve schránce -waves.copied = Vln zkopírováno. -waves.none = Žádní nepřátelé definováni.\nPřipomínka toho že prázdné rozložení vln se automaticky změní na výchozí nastavení. -editor.default = [LIGHT_GRAY] -details = Detaily... -edit = Upravit +waves.invalid = Neplatné vlny ve schránce. +waves.copied = Vlny byly zkopírovány. +waves.none = Žádní nepřátelé nebyli definováni.\nVlny s prázdným rozložením budou automaticky upraveny na výchozí rozložení. +editor.default = [lightgray][] +details = Podrobnosti... +edit = Upravit... editor.name = Jméno: -editor.spawn = Zrodit jednotku. -editor.removeunit = Odebrat jednotku. +editor.spawn = Zrodit jednotku +editor.removeunit = Odstranit jednotku editor.teams = Týmy -editor.errorload = Chyba při načítání souboru:\n[accent]{0} -editor.errorsave = Chyba při ukládání souboru:\n[accent]{0} -editor.errorimage = Toto je obrázek a ne mapa,nemysli si že změnou formátu souboru tohle obejdeš s tím že to bude fungovat.\n\nJestli chceš použít legacy mapu, použij 'importovat legacy mapu' v menu editoru. -editor.errorlegacy = Tato mapa je příliš stará a užití legacy formátu již dávno není podporováno. +editor.errorload = Chyba při načítání souboru. +editor.errorsave = Chyba při ukládání souboru. +editor.errorimage = Toto je obrázek, ne mapa.\nPokud chceš importovat mapu z verze 3.5/sestavení 40, použij položku nabídky 'Importovat starou mapu'. +editor.errorlegacy = Tato mapa je příliš stará a používá formát mapy, který už není podporován. editor.errornot = Toto není soubor mapy. -editor.errorheader = Tento soubor mapy je buď neplatný a nebo poškozen. -editor.errorname = Mapa nemá definované jméno. +editor.errorheader = Tento soubor mapy je buď neplatný nebo poškozen. +editor.errorname = Mapa nemá definované jméno. Nesnažíš se náhodou nahrát soubor s uložením hry? editor.update = Aktualizovat -editor.randomize = Náhodně +editor.randomize = Náhodně vygenerovat editor.apply = Aplikovat editor.generate = Generovat editor.resize = Změnit velikost editor.loadmap = Načíst mapu editor.savemap = Uložit mapu editor.saved = Uloženo! -editor.save.noname = Tvoje mapa nemá jméno! Jméno nastavíš v Informacích o mapě. -editor.save.overwrite = Tvoje mapa přepisuje vestavěnou mapu! Vyber odlišné jméno v Informacích o mapě. -editor.import.exists = [scarlet]Není možno importovat:[] vestavěná mapa jménem '{0}' již existuje! -editor.import = Import +editor.save.noname = Tvoje mapa nemá jméno! Jméno nastavíš v položce nabídky "Informace o mapě". +editor.save.overwrite = Tvoje mapa přepisuje vestavěnou mapu! Nastav jí radši jiné jméno v položce nabídky "Informace o mapě". +editor.import.exists = [scarlet]Není možno importovat:[] existuje vestavěná mapa se stejným jménem '{0}'! +editor.import = Import... editor.importmap = Importovat mapu editor.importmap.description = Importovat již existující mapu editor.importfile = Importovat soubor -editor.importfile.description = Importovat externí soubor mapy -editor.importimage = Importovat Legacy Obrázek -editor.importimage.description = Importovat exrerní obrázek mapy -editor.export = Export +editor.importfile.description = Importovat soubor s externí mapou +editor.importimage = Importovat starou mapu +editor.importimage.description = Importovat soubor s externím obrázkem mapy +editor.export = Export... editor.exportfile = Exportovat soubor -editor.exportfile.description = Exportovat soubor mapy +editor.exportfile.description = Exportovat mapu do souboru editor.exportimage = Exportovat obrázek terénu -editor.exportimage.description = Exportovat obrázek souboru mapy +editor.exportimage.description = Exportovat obrázek mapy do souboru editor.loadimage = Importovat terén editor.saveimage = Exportovat terén -editor.unsaved = [scarlet]Máš neuložené změny![]\nPřesto chceš ukončit? +editor.unsaved = [scarlet]Máš neuložené změny![]\nPřesto chceš odejít z editoru? Změny budou ztraceny. editor.resizemap = Změnit velikost mapy editor.mapname = Jméno mapy: -editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu. -editor.overwrite.confirm = [scarlet]Varování![] Mapa s tímto jménem již existuje. Jsi si jistý že ji chceš přepsat? +editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu.[] +editor.overwrite.confirm = [scarlet]Varování![] Mapa s tímto jménem již existuje. Jsi si jistý, že ji chceš přepsat? editor.exists = Mapa s tímto jménem již existuje. editor.selectmap = Vyber mapu k načtení: -toolmode.replace = Nahradit. + +toolmode.replace = Nahradit toolmode.replace.description = Kreslí jen na pevných blocích. toolmode.replaceall = Nahradit vše -toolmode.replaceall.description = Nahradit všechny bloky na mapě. -toolmode.orthogonal = Ortogonální -toolmode.orthogonal.description = Kreslí jen Ortogonální linie. +toolmode.replaceall.description = Nahradí všechny bloky na mapě. +toolmode.orthogonal = Pravoúhle +toolmode.orthogonal.description = Kreslí jen vodorovně nebo svisle. toolmode.square = Čtverec toolmode.square.description = Čtvercový štětec. -toolmode.eraseores = Maže rudy. +toolmode.eraseores = Mazat rudy toolmode.eraseores.description = Maže jen rudy. -toolmode.fillteams = Doplnit skupinu -toolmode.fillteams.description = Doplní hromadně namísto po blocích. -toolmode.drawteams = Kreslí skupiny -toolmode.drawteams.description = Kreslí skupiny namísto po blocích. -filters.empty = [LIGHT_GRAY]Žádné filtry! Přidej ho tlačítkem níže. -filter.distort = Distorze -filter.noise = Hluk +toolmode.fillteams = Doplnit týmy +toolmode.fillteams.description = Doplní týmy místo bloků. +toolmode.drawteams = Kreslit týmy +toolmode.drawteams.description = Kreslí týmy místo bloků. + +filters.empty = [lightgray]Nejsou zadány žádné filtry, přidej filtr tlačítkem níže.[] +filter.distort = Zkreslení +filter.noise = Zašumění filter.median = Medián filter.oremedian = Medián rud -filter.blend = Splynutí -filter.defaultores = Výchozí bloky +filter.blend = Prolnutí +filter.defaultores = Výchozí rudy filter.ore = Rudy -filter.rivernoise = Hluk řek +filter.rivernoise = Zašumění řek filter.mirror = Zrcadlit filter.clear = Vyčistit filter.option.ignore = Ignorovat -filter.scatter = Rozházet +filter.scatter = Rozptýlení filter.terrain = Terén filter.option.scale = Měřítko -filter.option.chance = Šance +filter.option.chance = Náhoda filter.option.mag = Velikost filter.option.threshold = Práh -filter.option.circle-scale = Měřítko kruhu +filter.option.circle-scale = Poloměr kružnice filter.option.octaves = Octávy -filter.option.falloff = Spád +filter.option.falloff = Pokles filter.option.angle = Úhel filter.option.block = Blok -filter.option.floor = Podlaha -filter.option.flooronto = Cílová podlaha +filter.option.floor = Povrch +filter.option.flooronto = Cílový povrch filter.option.wall = Stěna filter.option.ore = Ruda -filter.option.floor2 = Sekundární podlaží -filter.option.threshold2 = Sekundární podlaží +filter.option.floor2 = Druhotný povrch +filter.option.threshold2 = Druhotný práh filter.option.radius = Poloměr filter.option.percentile = Percentil + width = Šířka: height = Výška: -menu = Hlavní menu +menu = Hlavní nabídka play = Hrát campaign = Kampaň load = Načíst save = Uložit fps = FPS: {0} -ping = Odezva: {0}ms -language.restart = Prosím restartuj hru aby se provedla změna jazyka! -settings = Nastavení -tutorial = Tutoriál -tutorial.retake = Zopáknout si výuku. +ping = Odezva: {0} ms +language.restart = Prosím restartuj hru, aby se provedla změna jazyka! +settings = Volby +tutorial = Výuka +tutorial.retake = Spustit znovu výuku. editor = Editor mapeditor = Editor map + abandon = Opustit abandon.text = Tato zóna a všechny její zdroje připadnou nepříteli. locked = Zamčeno -complete = [LIGHT_GRAY]Hotovo: -requirement.wave = Reach Wave {0} in {1} -requirement.core = znič nepřátelskou základnu v {0} -requirement.unlock = odemknuto {0} -resume = Zpět k zóně:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Nejlepší: {0} -launch = Vyslat -launch.title = Vyslání úspěšné -launch.next = [LIGHT_GRAY]další možnost až ve vlně {0} -launch.unable2 = [scarlet]Není možno vyslat.[] -launch.confirm = Toto vyšle veškeré suroviny ve tvém jádru .\nJiž se na tuto základnu nebudeš moci vrátit. -launch.skip.confirm = Jestli teď zůstaneš, budeš moci odejít až v pozdější fázi. -uncover = Odkrýt +complete = [lightgray]Dokončeno: +requirement.wave = Dosáhni vlny {0} na mapě {1} +requirement.core = Znič nepřátelské jádro na mapě {0} +requirement.unlock = Odemknuto {0} +resume = Zpět k mapě:\n[lightgray]{0}[] +bestwave = [lightgray]Nejvyšší vlna: {0} +launch = Vyslat do této zóny Tvé jádro +launch.title = Vyslání bylo úspěšné +launch.next = [lightgray]další možnost bude až ve vlně {0}[] +launch.unable2 = [scarlet]Není možno se vyslat.[] +launch.confirm = Toto vyšle veškeré suroviny ve Tvém jádře zpět.\nJiž se na tuto základnu nebudeš moci vrátit. +launch.skip.confirm = Jestli teď zůstaneš, budeš moci odejít až po několika dalších vlnách. +uncover = Odkrýt mapu configure = Přizpůsobit vybavení -bannedblocks = Banned Blocks -addall = Add All -configure.locked = [LIGHT_GRAY]Dosáhni vlny {0}\nk nastavení svého vybavení. -configure.invalid = Hodnota musí být mezi 0 a{0}. -zone.unlocked = [LIGHT_GRAY]{0} odemčeno. -zone.requirement.complete = Vlna {0} dosažena:\n{1} podmínky zóny splněny. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} -zone.resources = Suroviny detekovány: -zone.objective = [lightgray]Cíl: [accent]{0} +bannedblocks = Zakázané bloky +addall = Přidat vše +configure.locked = [lightgray]Dosáhni vlny {0},\naby sis mohl přizpůsobit vybavení pro mapu. +configure.invalid = Hodnota musí být číslo mezi 0 a {0}. +zone.unlocked = [lightgray]Mapa {0} byla odemknuta. +zone.requirement.complete = Bylo dosaženo vlny {0},\nčímž byla splněna podmínka pro mapu {1}. +zone.config.unlocked = Odemknuto přizpůsobení vybavení pro mapu:[lightgray]\n{0}[] +zone.resources = [lightgray]Byly detekovány tyto suroviny:[] +zone.objective = [lightgray]Úkol: [][accent]{0}[] zone.objective.survival = Přežij zone.objective.attack = Znič nepřátelské jádro -add = Přidat -boss.health = Životy bosse -connectfail = [crimson]Nepovedlo se připojení k serveru:\n\n[accent]{0} -error.unreachable = Server je nedostupný.\nJe adresa napsaná správně? -error.invalidaddress = Neplatná adresa. -error.timedout = Čas vypršel!\nUjisti se že hostitel má nastavené přesměrování portů a adresa je napsaná správně! -error.mismatch = Chyba Packetu:\nKlient/Verze serveru se neshodují.\nUjisti se že máš nejnovější verzi Mindustry! -error.alreadyconnected = Již připojeno. -error.mapnotfound = Soubor mapy nebyl nalezen! -error.io = Chyba I/O sítě. -error.any = neznámá chyba sítě. -error.bloom = Chyba inicializace bloomu.\nTvé zařízení ho nemusí podporovat. -zone.groundZero.name = Zóna dopadu -zone.desertWastes.name = Pouštní Odpady +add = Přidat... +boss.health = Životy Záporáka + +connectfail = [crimson]Nepovedlo se připojení k serveru:\n\n[accent]{0}[] +error.unreachable = Server je nedostupný.\nJe IP adresa napsaná správně (XXX.XXX.XXX.XXX)? +error.invalidaddress = Neplatná IP adresa. +error.timedout = Čas pro spojení se serverem vypršel!\nUjisti se, že IP adresa je napsaná správně. Zkus také zjistit, zda má hostitel správně nastavené přesměrování portů. +error.mismatch = Chyba při komunikaci se serverem:\nVerze klienta a serveru se možná neshodují.\nUjisti se, že máš nejnovější verzi Mindustry, a když to nevyřeší problém, kontaktuj správce serveru. +error.alreadyconnected = Připojeni k serveru. +error.mapnotfound = Soubor s mapou nebyl nalezen! +error.io = Vstupně/výstupní (I/O) chyba sítě. +error.any = Ueznámá chyba sítě. +error.bloom = Chyba inicializace filtru Bloom.\nTvé zařízení ho nejspíš nepodporuje. + +zone.groundZero.name = Základní tábor +zone.desertWastes.name = Pouštní pustiny zone.craters.name = Krátery -zone.frozenForest.name = Zmrzlý les -zone.ruinousShores.name = Zničující pobřeží -zone.stainedMountains.name = Poskvrněné hory -zone.desolateRift.name = Trhlina pustoty -zone.nuclearComplex.name = Komplex nukleární produkce -zone.overgrowth.name = Porost -zone.tarFields.name = Tarová pole +zone.frozenForest.name = Zamrzlý les +zone.ruinousShores.name = Zničené pobřeží +zone.stainedMountains.name = Skvrnité pohoří +zone.desolateRift.name = Bezútěšná trhlina +zone.nuclearComplex.name = Komplex jaderné výroby +zone.overgrowth.name = Džungle +zone.tarFields.name = Dehtová pole zone.saltFlats.name = Solné nížiny -zone.impact0078.name = Dopad 0078 -zone.crags.name = Praskliny -zone.fungalPass.name = Houbový průsmyk -zone.groundZero.description = Optimální lokace kde znovu začít. Nízký výskyt nepřátel. Pár surovin.\nPosbírej co nejvíce olova a mědi.\nBěž dál. -zone.frozenForest.description = Dokonce tady, blíž k horám se spóry dokázaly rozrůst. Tyto mrazivé teploty je nemohou zadržet navěky.\n\nZačni pracovat s pomocí energie. Stav spalovací generátory. Nauč se jak používat opravovací věže. -zone.desertWastes.description = Tyto odpadní zóny jsou rozsáhlé, nepředvídatelné a skrz naskrz se hemží opuštěnými budovami.\nV této oblasti se hojně vyskytuje uhlí. Spal ho v generátorech na energii nebo syntetizuj na Grafit.\n\n[lightgray]Tato výsadková zóna není garantovaná. -zone.saltFlats.description = Na okraji pouště leží Solné nížiny. V této lokaci se nachází nemnoho surovin.\n\nNepřítel zde vybudoval zásobovací komplex. Znič jeho jádro. Nenechej kámen na kameni. -zone.craters.description = V těchto kráterech jenž jsou relikvie starých válek,se nahromadilo velké množství vody. Zmocni se této oblasti. Sbírej písek. Vyrob z něj sklo. Použij vodu k chlazení svých vrtů a střílen. -zone.ruinousShores.description = Za odpadní zónou se nachází pobřeží. Kdysi tuto oblast obýval pobřežní obranný sytém. Moc z něj nezbylo. Jen ty nejprimitivnější struktůry zůstaly nerozprášeny, zbytek padl jen v kusy oceli.\nPokračuj ve své expanzi hlouběji. Objev ztracenou technologii. -zone.stainedMountains.description = Dále ve vnitrozemí leží hory, dosud neposkvrněny spóry.\nVytěž tuto oblast oplývající titániem. Nauč se ho používat.\n\nPřítomnost nepřátelských jednotek je zde větší. Nedej jim čas na vytasení jejich největšího kalibru. -zone.overgrowth.description = Tato přerostlá džungle se nachází blíže ke zdroji spór.\nNepřítel zde zbudoval základnu. Postav jednotky Dagger a znič ji. Získej to co mělo být dávno ztraceno. -zone.tarFields.description = Hranice produkční ropné oblasti mezi horami a pouští. Jedna z mála oblastí kde se stále nachází Tar.\nAčkoliv se oblast zdá opuštěná, stále se zde nachází nepřátelské jednotky s velkou silou. Není radno je podcenit.\n\n[lightgray]Vyzkoumej technologii na produkci surovin z ropy. -zone.desolateRift.description = Extrémně nebezpečná zóna. Za cenu prostoru se zde nachází přehršel surovin. Vysoká šance na sebedestrukci. Opusť tuto oblast co nejdříve to půjde. Nenech se zmást dlouhými prodlevami mezi vlnami nepřátel. -zone.nuclearComplex.description = Bývalá továrna na zpracování thoria, dnes leží v troskách.\n[lightgray]Objev thorium a jeho široké využití.\n\nNepřátelské jednotky se zde nacházejí v hojném počtu, neustále prohledává okolí kvůli útočníkůn. -zone.fungalPass.description = Přechodová oblast mezi vysokými horami a spóry nasycenou zemí. Nachází se zde malá průzkumná základna tvého nepřítele.\nZnič ji.\nPoužij Dagger a Crawler jednotky. Znič obě nepřátelské já. -zone.impact0078.description = -zone.crags.description = +zone.impact0078.name = Zóna dopadu 0078 +zone.crags.name = Skalní útesy +zone.fungalPass.name = Plísňový průsmyk + +zone.groundZero.description = Optimální místo, kde znovu začít. Nízký výskyt nepřátel. Několik málo surovin.\nPosbírej co nejvíce olova a mědi.\nBěž dál. +zone.frozenForest.description = Dokonce až sem, blízko hor, se dokázaly spóry rozrůst. Mráz je však nemůže zadržet navěky.\n\nPusť se do práce za pomocí energie. Stav spalovací generátory. Nauč se, jak používat opravovací věže. +zone.desertWastes.description = Tyto pustiny jsou rozsáhlé, nepředvídatelné a skrz naskrz se hemží opuštěnými budovami.\nV této oblasti nalezneš uhlí. Spal ho v generátorech na energii nebo syntetizuj na grafit.\n\n[lightgray]Tato výsadková zóna není zaručena[] +zone.saltFlats.description = Na okraji pouště leží Solné nížiny. V této lokaci se nachází jen několik málo surovin.\n\nNepřítel zde vybudoval zásobovací komplex. Znič jádro v jeho základně. Nenechej kámen na kameni. +zone.craters.description = V těchto relikviích starých válek se nahromadilo velké množství vody. Znovu získej tuto oblast. Sbírej písek. Vyrob z něj metasklo. Použij vodu k chlazení svých vrtů a střílen. +zone.ruinousShores.description = Za pustinou se nachází pobřeží. Kdysi zde stál obranný pobřežní systém. Moc z něj už dneska nezbylo. Jen základní stavby zůstaly ušetřeny, zbytek se rozpadl na šrot.\nPokračuj ve své expanzi hlouběji. Objev ztracenou technologii. +zone.stainedMountains.description = Dále ve vnitrozemí leží hory, dosud neposkvrněny spórami.\nVytěž titánium, kterým tato oblast oplývá. Nauč se jej používat.\n\nPřítomnost nepřátelských jednotek je zde větší. Radši jim nedej moc času na vyslání jejich nejsilnějších jednotech. +zone.overgrowth.description = Tato přerostlá džungle se nachází blíže ke zdroji spór.\nNepřítel zde zbudoval předsunutou hlídku. Stav jednotky Dagger a znič s jejich pomocí jádro základny. Získej znovu to, co bylo již dávno ztraceno. +zone.tarFields.description = Rozhraní produkční ropné oblasti mezi horami a pouští. Jedna z mála oblastí, kde se stále nachází dehet.\nAčkoliv je oblast opuštěná, stále se v jejím okolí nachází nebezpečné nepřátelské síly. Není radno je podcenit.\n\n[lightgray]Vyzkoumej technologii na zpracování ropy.[] +zone.desolateRift.description = Extrémně nebezpečná zóna. Na úkor prostoru se zde nachází přehršel surovin. Vysoká pravděpodobnost zničení. Opusť tuto oblast co nejdříve to půjde. Nenech se zmást dlouhými prodlevami mezi vlnami nepřátel. +zone.nuclearComplex.description = Bývalá továrna na zpracování thoria, dnes v troskách.\n[lightgray]Objev thorium a jeho široké využití.[]\n\nNepřátelské jednotky se zde nacházejí v hojném počtu, a neustále prohledávají oblast. +zone.fungalPass.description = Přechodová oblast mezi vysokými horami a spórami nasycenou zemí. Nachází se zde malá průzkumná základna Tvého nepřítele.\nZnič ji.\nPoužij jednotky Dagger a Crawler. Znič obě nepřátelské jádra. +zone.impact0078.description = +zone.crags.description = + settings.language = Jazyk settings.data = Data hry -settings.reset = nastavit výchozí -settings.rebind = Přenastavit +settings.reset = Nastavit na původní hodnoty +settings.rebind = Přemapovat +settings.resetKey = Vrátit změny settings.controls = Ovládání settings.game = Hra -settings.sound = zvuky -settings.graphics = Zobrazení -settings.cleardata = Resetovat data hry... -settings.clear.confirm = Jsi si jistý že chceš resetovat obsah hry?\nTento krok je nevratný! -settings.clearall.confirm = [scarlet]Varování![]\nToto vyresetuje všechna data, včetně uložení, map, odemykatelných a nastavení ovládání.\nJakmile stiskneš 'ok' data se vymažou a hra se automaticky ukončí. -paused = [accent]< Pauza > -clear = Clear -banned = [scarlet]Banned +settings.sound = Zvuky +settings.graphics = Grafika +settings.cleardata = Vymazat data hry... +settings.clear.confirm = Jsi si jistý, že chceš vymazat Tvá data ve hře?\nTento krok je nevratný! +settings.clearall.confirm = [scarlet]Varování![]\nToto vyresetuje všechna Tvá data ve hře, včetně uložení hry, map, odemknutého postupu v kampani a nastavení ovládání.\nJakmile stiskneš "OK", všechna data se vymažou a hra se automaticky ukončí. +paused = [accent]< Pozastaveno >[] +clear = Vyčistit +banned = [scarlet]Zakázán[] yes = Ano no = Ne info.title = Informace -error.title = [crimson]Objevila se chyba +error.title = [crimson]Objevila se chyba[] error.crashtitle = Objevila se chyba blocks.input = Vstup blocks.output = Výstup -blocks.booster = Booster -block.unknown = [LIGHT_GRAY]??? +blocks.booster = Posilovač +block.unknown = [lightgray]???[] blocks.powercapacity = Kapacita energie -blocks.powershot = Energie na výstřel +blocks.powershot = Energie na 1 výstřel blocks.damage = Poškození blocks.targetsair = Zaměřuje vzdušné jednotky blocks.targetsground = Zaměřuje pozemní jednotky blocks.itemsmoved = Rychlost pohybu blocks.launchtime = Čas mezi vysláním blocks.shootrange = Dostřel -blocks.size = velikost +blocks.size = Velikost blocks.liquidcapacity = Kapacita tekutin blocks.powerrange = Rozsah energie -blocks.powerconnections = Max Connections -blocks.poweruse = Spotřebuje energie -blocks.powerdamage = Energie na poškození -blocks.itemcapacity = kapacita předmětů +blocks.powerconnections = Nejvyšší počet spojení +blocks.poweruse = Spotřeba energie +blocks.powerdamage = Energie na jednotku poškození +blocks.itemcapacity = Kapacita předmětů blocks.basepowergeneration = Základní generování energie blocks.productiontime = Čas produkce blocks.repairtime = Čas do úplné opravy blocks.speedincrease = Zvýšení rychlosti blocks.range = Dosah -blocks.drilltier = Vrtatelné +blocks.drilltier = Lze těžit blocks.drillspeed = Základní rychlost vrtu -blocks.boosteffect = Efekt boostu -blocks.maxunits = Max. počet jednotek +blocks.boosteffect = Účinek posílení +blocks.maxunits = Nejvýše aktivních jednotek blocks.health = Životy blocks.buildtime = Čas stavby blocks.buildcost = Cena stavby -blocks.inaccuracy = Nepřesnost/výchylka +blocks.inaccuracy = Nepřesnost blocks.shots = Střely -blocks.reload = Střely za sekundu +blocks.reload = Střel za 1s blocks.ammo = Střelivo + bar.drilltierreq = Je vyžadován lepší vrt bar.drillspeed = Rychlost vrtu: {0}/s bar.pumpspeed = Pump Speed: {0}/s @@ -544,6 +579,9 @@ bar.heat = Teplo bar.power = Energie bar.progress = Proces stavby bar.spawned = Jednotek: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] poškození bullet.splashdamage = [stat]{0}[lightgray] AOE ~[stat] {1}[lightgray] bloků bullet.incendiary = [stat]zápalné @@ -555,6 +593,7 @@ bullet.freezing = [stat]ledové bullet.tarred = [stat]tarové bullet.multiplier = [stat]{0}[lightgray]x násobič střeliva bullet.reload = [stat]{0}[lightgray]x nabití + unit.blocks = Bloky unit.powersecond = jednotek energie/sekunda unit.liquidsecond = jednotek tekutin/sekundu @@ -567,6 +606,8 @@ unit.persecond = /sek unit.timesspeed = x rychlost unit.percent = % unit.items = předměty +unit.thousands = k +unit.millions = mil category.general = Všeobecné category.power = Energie category.liquids = Tekutiny @@ -579,6 +620,7 @@ setting.shadows.name = Stíny setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Lineární filtrování setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animovaná voda setting.animatedshields.name = Animované štíty setting.antialias.name = Antialias[LIGHT_GRAY] (vyžaduje restart)[] @@ -601,12 +643,16 @@ setting.screenshake.name = Třes obrazu setting.effects.name = Zobrazit efekty setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Citlivost ovladače setting.saveinterval.name = Interval automatického ukládání setting.seconds = {0} Sekund +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Celá obrazovka setting.borderlesswindow.name = Bezokrajové okno[LIGHT_GRAY] (může vyžadovat restart) setting.fps.name = Ukázat snímky/sekundu +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = Vertikální synchronizace setting.pixelate.name = Pixelizovat [LIGHT_GRAY](může snížit výkon) setting.minimap.name = Ukázat minimapu @@ -635,16 +681,36 @@ category.multiplayer.name = Multiplayer command.attack = Útok command.rally = Rally command.retreat = Ústup +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Clear Building keybind.press = Stiskni klívesu... keybind.press.axis = Stiskni osu nebo klávesu... keybind.screenshot.name = Sníměk mapy +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Pohyb na X keybind.move_y.name = Pohyb na Y +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Sprint keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.schematic_menu.name = Šablona Menu +keybind.schematic_flip_x.name = Flip Šablona X +keybind.schematic_flip_y.name = Flip Šablona Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Toggle Fullscreen keybind.select.name = Vybrat/Střílet keybind.diagonal_placement.name = Diagonal Placement @@ -657,7 +723,6 @@ keybind.menu.name = Hlavní nabídka keybind.pause.name = pauza keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimapa -keybind.dash.name = Sprint keybind.chat.name = Chat keybind.player_list.name = Seznam hráčů keybind.console.name = Konzole @@ -671,23 +736,26 @@ keybind.drop_unit.name = Zahodit jednotku keybind.zoom_minimap.name = Přiblížit minimapu mode.help.title = Popis módů mode.survival.name = Survival -mode.survival.description = Normální mód .Limitované suroviny a automatické přepínání vln. +mode.survival.description = Normální mód. Limitované suroviny a automatické přepínání vln. mode.sandbox.name = Sandbox mode.sandbox.description = Nekonečné zdroje a žádný čas pro vlny nepřátel. mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Bojuj proti ostatním hráčům v lokální síti. mode.attack.name = Útok -mode.attack.description = Bez vln znič nepř@telsou základnu. +mode.attack.description = Znič nepřátelskou základnu.\n[gray]Vyžaduje přítomnost červeného jádra na mapě.[] mode.custom = Custom Rules + rules.infiniteresources = Nekonečno surovin +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Časovač vln -rules.waves = Wlny +rules.waves = Vlny rules.attack = Attack Mode rules.enemyCheat = Infinite AI Resources rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Hráčovy životy(multiplejer) rules.playerdamagemultiplier = Hráčův útok (multiplejer) rules.unitdamagemultiplier = Demič jedmotek (Multiplejer) @@ -706,9 +774,13 @@ rules.title.resourcesbuilding = surovyny & Stavby rules.title.player = Hráči rules.title.enemy = Nepřátelé rules.title.unit = Jednotky +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Předměty content.liquid.name = Tekutiny -content.unit.name = jednotky +content.unit.name = Jednotky content.block.name = Blocks content.mech.name = Mechy item.copper.name = Měď @@ -725,8 +797,8 @@ item.spore-pod.name = Spore Pod item.sand.name = Písek item.blast-compound.name = Výbušná směs item.pyratite.name = Pyratite -item.metaglass.name = Tvrzené sklo -item.scrap.name = Scrap +item.metaglass.name = Metasklo +item.scrap.name = Šrot liquid.water.name = Voda liquid.slag.name = Rostavené železo liquid.oil.name = Ropa @@ -738,20 +810,21 @@ mech.delta-mech.name = Delta mech.delta-mech.weapon = Obloukový generátor mech.delta-mech.ability = Průtok mech.tau-mech.name = Tau -mech.tau-mech.weapon = Restruktní Laser +mech.tau-mech.weapon = Restruktní laser mech.tau-mech.ability = Opravná dávka mech.omega-mech.name = Omega mech.omega-mech.weapon = Rojové střely -mech.omega-mech.ability = Obrněná Konfigurace +mech.omega-mech.ability = Obrněná konfigurace mech.dart-ship.name = Šipka mech.dart-ship.weapon = Opakovač mech.javelin-ship.name = Oštěp -mech.javelin-ship.weapon = Dávka Raket -mech.javelin-ship.ability = Výbojový Posilovač +mech.javelin-ship.weapon = Dávka raket +mech.javelin-ship.ability = Výbojový posilovač mech.trident-ship.name = Trojzubec mech.trident-ship.weapon = Bombová zátoka mech.glaive-ship.name = Glaiva -mech.glaive-ship.weapon = Plamenný Opakovač +mech.glaive-ship.weapon = Plamenný opakovač +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [LIGHT_GRAY]Výbušnost: {0}% item.flammability = [LIGHT_GRAY]Zápalnost: {0}% item.radioactivity = [LIGHT_GRAY]Radioaktivita: {0}% @@ -767,34 +840,35 @@ mech.buildspeed = [LIGHT_GRAY]Rychlost stavění: {0}% liquid.heatcapacity = [LIGHT_GRAY]Kapacita teploty: {0} liquid.viscosity = [LIGHT_GRAY]Viskozita: {0} liquid.temperature = [LIGHT_GRAY]Teplota: {0} -block.sand-boulder.name = Sand Boulder + +block.sand-boulder.name = Balvan písku block.grass.name = Tráva -block.salt.name = sůl +block.salt.name = Sůl block.saltrocks.name = Solný kámen -block.pebbles.name = Pebbles +block.pebbles.name = Oblázky block.tendrils.name = Tendrils block.sandrocks.name = Písečný kámen -block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock +block.spore-pine.name = Spórová borovice +block.sporerocks.name = Spórové kamení +block.rock.name = Kámen block.snowrock.name = Sněhový kámen -block.snow-pine.name = Snow Pine -block.shale.name = Shale -block.shale-boulder.name = Shale Boulder +block.snow-pine.name = Sněžná borovice +block.shale.name = Břidlice +block.shale-boulder.name = Břidličný balvan block.moss.name = Mech -block.shrubs.name = Shrubs -block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shrubs.name = Křoví +block.spore-moss.name = Spórový mech +block.shalerocks.name = Břidlicové kamení block.scrap-wall.name = Stará zeď block.scrap-wall-large.name = Velá stará zeď -block.scrap-wall-huge.name = obří stará zeď +block.scrap-wall-huge.name = Obří stará zeď block.scrap-wall-gigantic.name = Gigantická stará zeď block.thruster.name = Thruster -block.kiln.name = Kiln +block.kiln.name = Pec block.graphite-press.name = Graphitový lis -block.multi-press.name = Všětraný lys -block.constructing = {0} [LIGHT_GRAY](Constructing) -block.spawn.name = Nepřátelský Spawn +block.multi-press.name = Všětraný lis +block.constructing = {0} [LIGHT_GRAY](Ve výstavbě) +block.spawn.name = Nepřátelský spawn block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus @@ -836,14 +910,14 @@ block.dark-panel-6.name = Dark Panel 6 block.dark-metal.name = Dark Metal block.ignarock.name = Igna Rock block.hotrock.name = Hot Rock -block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs +block.magmarock.name = Magmatický kámen +block.cliffs.name = Útesy block.copper-wall.name = Měděná zeď block.copper-wall-large.name = Velká měděná zeď -block.titanium-wall.name = Titanium Zeď -block.titanium-wall-large.name = Velká Titanium Zeď -block.plastanium-wall.name = Plastanium Zeď -block.plastanium-wall-large.name = Velká Plastanium Zeď +block.titanium-wall.name = Titaniová zeď +block.titanium-wall-large.name = Velká titaniová zeď +block.plastanium-wall.name = Plastaniová zeď +block.plastanium-wall-large.name = Velká plastaniová zeď block.phase-wall.name = Fázová stěna block.phase-wall-large.name = Velká fázová stěna block.thorium-wall.name = Thoriová stěna @@ -857,14 +931,16 @@ block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Dopravník block.titanium-conveyor.name = Titániový dopravník -block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors. +block.armored-conveyor.name = Obrněný dopravník +block.armored-conveyor.description = Přepravuje předměty stejně rychle jako titaniový přepravník. Je obrněný a déle vydrží, avšak nepřijímá předměty z boku z ničeho jiného než jiných přepravníků. block.junction.name = Křižovatka block.router.name = Směrovač block.distributor.name = Distributor block.sorter.name = Dělička -block.inverted-sorter.name = Inverted Sorter -block.message.name = Message +block.inverted-sorter.name = Obrácená třídička +block.message.name = Zpráva +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Brána přetečení block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Tkalcovna pro fázovou tkaninu @@ -878,6 +954,7 @@ block.coal-centrifuge.name = Coal Centrifuge block.power-node.name = Energetický uzel block.power-node-large.name = Velký energetický uzel block.surge-tower.name = Surge Tower +block.diode.name = Battery Diode block.battery.name = Baterie block.battery-large.name = Velká baterie block.combustion-generator.name = Spalovací generátor @@ -901,6 +978,7 @@ block.mechanical-pump.name = Mechanická pumpa block.item-source.name = Zdroj předmětů block.item-void.name = Prázdnota pro předměty block.liquid-source.name = Zdroj tekutin +block.liquid-void.name = Liquid Void block.power-void.name = Prázdnota pro energii block.power-source.name = Nekonečný zdroj energie block.unloader.name = Odbavovač @@ -911,48 +989,49 @@ block.salvo.name = Salva block.ripple.name = Vlnění block.phase-conveyor.name = Fázový přepravník block.bridge-conveyor.name = Mostový přepravník -block.plastanium-compressor.name = Kompresor na Plastanium +block.plastanium-compressor.name = Kompresor na plastanium block.pyratite-mixer.name = Pyratit mixér block.blast-mixer.name = Výbušninový mixér block.solar-panel.name = 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 = Řídící středisko block.draug-factory.name = Draug Miner Drone Factory -block.spirit-factory.name = Továrna na Spirit Drony -block.phantom-factory.name = Továrna na Fantom Drony +block.spirit-factory.name = Továrna na Spirit drony +block.phantom-factory.name = Továrna na Fantom drony block.wraith-factory.name = Továrna na Wraithy -block.ghoul-factory.name = Továrna na Ghůl Bombardéry -block.dagger-factory.name = Továrna na Dagger Mechy -block.crawler-factory.name = Crawler Mech Factory -block.titan-factory.name = Továrna na Titán Mechy -block.fortress-factory.name = Továrna na Fortress Mechy +block.ghoul-factory.name = Továrna na Ghůl bombardéry +block.dagger-factory.name = Továrna na Dagger mechy +block.crawler-factory.name = Továrna na Crawler mechy +block.titan-factory.name = Továrna na Titán mechy +block.fortress-factory.name = Továrna na Fortress mechy block.revenant-factory.name = Továrna na Revenanty -block.repair-point.name = Opravný Bod +block.repair-point.name = Opravný bod block.pulse-conduit.name = Pulzní potrubí +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Fázové potrubí block.liquid-router.name = Směrovač tekutin block.liquid-tank.name = Nádrž na tekutiny block.liquid-junction.name = Křižovatka tekutin block.bridge-conduit.name = Mostové potrubí block.rotary-pump.name = Rotační pumpa -block.thorium-reactor.name = Thoriový Reaktor -block.mass-driver.name = Hromadný Distributor +block.thorium-reactor.name = Thoriový reaktor +block.mass-driver.name = Hromadný distributor block.blast-drill.name = Tlakovzdušný vrt block.thermal-pump.name = Termální pumpa -block.thermal-generator.name = Termální Generátor +block.thermal-generator.name = Termální generátor block.alloy-smelter.name = Slitinová pec block.mender.name = Mender block.mend-projector.name = Opravný projektor block.surge-wall.name = Impulzní stěna -block.surge-wall-large.name = Velká Impulzní stěna +block.surge-wall-large.name = Velká impulzní stěna block.cyclone.name = Cyklón block.fuse.name = Fůze block.shock-mine.name = Šoková mina block.overdrive-projector.name = Vysokorychlostní projektor block.force-projector.name = Silový projektor block.arc.name = Oblouk -block.rtg-generator.name = RTG Generátor +block.rtg-generator.name = RTG generátor block.spectre.name = Spektr block.meltdown.name = Meltdown block.container.name = Kontejnér @@ -965,14 +1044,14 @@ team.orange.name = oranžová team.derelict.name = derelict team.green.name = zelená team.purple.name = fialová -unit.spirit.name = Spirit Dron +unit.spirit.name = Spirit dron unit.draug.name = Draug Miner Drone -unit.phantom.name = Fantom Dron +unit.phantom.name = Fantom dron unit.dagger.name = Dagger unit.crawler.name = Crawler unit.titan.name = Titán -unit.ghoul.name = Ghůl Bombardér -unit.wraith.name = Bojovník Wraith +unit.ghoul.name = Ghůl bombardér +unit.wraith.name = Wraith unit.fortress.name = Pevnost unit.revenant.name = Revenant unit.eruptor.name = Eruptor @@ -980,31 +1059,32 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.next = [lightgray] -tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.drill = Manuální těžba je neefektivní.\n[accent]Vrty []budou těžit automaticky.\npolož jeden na měděnou rudu. -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.conveyor = [accent]Dopravníky[] jsou zapotřebí k dopravě materiálu k jádru.\nVytvoř řadu dopravníku od vrtu až k jádru. -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.next = [lightgray] +tutorial.intro = Vítej ve [scarlet]výuce Mindustry.[]\nZačni [accent] těžením mědi[] - klikni na měděnou žílu v blízkosti jádra.\n\n[accent]{0}/{1} copper +tutorial.intro.mobile = Vítej ve [scarlet]výuce Mindustry.[]\nPohybuj se táhnutím do stran.\nPřibližuj a oddaluj [accent]2 prsty [].\nZačni [accent] těžením mědi[] - přibliž se k měděné žíle v blízkosti jádra a klepni na ni.\n\n[accent]{0}/{1} mědi +tutorial.drill = Manuální těžba je neefektivní.\n[accent]Vrty []budou těžit automaticky.\nPostav jeden na měděnou rudu. +tutorial.drill.mobile = Manuální těžba je neefektivní.\n[accent]Vrty []budou těžit automaticky.\nKlepni na vrt v záložce dole vpravo.\nVyber [accent] mechanický vrt[].\nPolož ho klepnutím na měděnou žílu a následně potvrď [accent] fajfkou[] níže.\nStiskni [accent] X [] pro zrušení stavby. +tutorial.blockinfo = Každý blok má jiné vlastnosti. Každý vrt může těžit pouze některé suroviny.\nNa tyto vlastnosti se můžeš podívat [accent] klepnutím na "?" ve stavebním menu.[]\n\n[accent] Nyní se podívej na vlastnosti mechanického vrtu.[] +tutorial.conveyor = [accent]Dopravníky[] jsou zapotřebí k dopravě materiálu k jádru.\nVytvoř řadu dopravníků od vrtu až k jádru +tutorial.conveyor.mobile = [accent]Dopravníky[] jsou zapotřebí k dopravě materiálu k jádru.\nVytvoř řadu dopravníku od vrtu až k jádru.\n[accent] Pokládej dopravníky v řadě dlouhým stiskem prstu[] a táhnutím v požadovaném směru.\n\n[accent]{0}/{1} přepravníků položeno v řadě\n[accent]0/1 předmětů doručeno tutorial.turret = Defenzivní stavby musí být postaveny za účelem obrany vůči[LIGHT_GRAY] nepříteli[].\nPostav střílnu Duo blízko svého jádra. -tutorial.drillturret = Duo střílny požadují[accent] měd jako střelivo []ke střelbě.\nPolož vrt blízko střílny pro zásobování mědí. -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.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.unpause = Now press space again to unpause. -tutorial.unpause.mobile = Now press it again to unpause. -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.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.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.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.waves = [LIGHT_GRAY] nepřítel[] je přibližuje.\n\nBraň své jádro po dobu dvou vln, postav více střílen. -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.drillturret = Duo střílny požadují[accent] měděnou munici []jako střelivo.\nPolož mechanický vrt blízko střílny pro zásobování mědí. +tutorial.pause = Během boje můžeš[accent] pauznout hru.[]\nBěhem pauzy je možné plánovat stavbu budov.\n\n[accent]Pauzni mezerníkem. +tutorial.pause.mobile = Během boje můžeš[accent] pauznout hru.[]\nBěhem pauzy je možné plánovat stavbu budov.\n\n[accent]Pauzu dáš tímhle tlačítkem vlevo nahoře. +tutorial.unpause = Teď zmáčkni mezerník znova a odpauzuj hru. +tutorial.unpause.mobile = Teď ho zmáčkni znova a odpauzuj hru. +tutorial.breaking = Často je nutné bloky i ničit.\n[accent]Drž pravé tlačítko[] a táhni pro výběr oblasti bloků ke zničení.[]\n\n[accent]Znič všechny bloky šrotu vlevo od Tvého jádra. +tutorial.breaking.mobile = Často je nutné bloky i ničit.\n[accent]Vyber rozebírací mód[] a klepni na blok, který chceš zničit.\nZnič celou oblast delším stiskem prstu[] a táhnutím v nějakém směru.\nZmáčkni fajfku pro potvrzení zničení.\n\n[accent]Znič všechny bloky šrotu vlevo od Tvého jádra. +tutorial.withdraw = Někdy je třeba odebírat předměty přímo z bloků.\n[accent]Klikni na blok[], ve kterém jsou předměty a pak [accent]klikni na předmět[] z jeho inventáře.\nVícero předmětů může být odebráno [accent]kliknutím a držením[].\n\n[accent]Odeber nějakou měď z jádra.[] +tutorial.deposit = Vložit předměty dovnitř bloku můžeš přetažením z Tvé lodi na cílový blok.\n\n[accent]Vlož svou měď zpět do jádra.[] +tutorial.waves = [LIGHT_GRAY] Nepřítel[] se přibližuje.\n\nUbraň své jádro po dobu 2 vln, postav více střílen. +tutorial.waves.mobile = [lightgray] Nepřítel[] se přibližuje.\n\nUbraň své jádro po dobu 2 vln. Tvá loď bude automaticky střílet po nepřátelských jednotkách.\nPostav více střílen a vrtů. Natěž více mědi. +tutorial.launch = Jakmile dosáhneš určité vlny, budeš moci [accent]vyslat své jádro zpět[]. Opustíš tím svou základnu a [accent]získáš suroviny uložené v jádře[].\nZískané suroviny mohou být použity pro výzkum nových technologií.\n\n[accent]Stiskni tlačítko pro vyslání jádra. + item.copper.description = Užitečný strukturální materiál. Používá se rozsáhle v ostatních typech bloků. item.lead.description = Základní počáteční materiál. Požívá se rozsáhle v elektronice a v blocích pro transport tekutin. -item.metaglass.description = Vemi důležitá suočást všeho so se týká tekutin -item.graphite.description = Stlačený uhlík nedílná součást většiny infrastruktur +item.metaglass.description = Velmi důležitá součást všeho, co se týká tekutin +item.graphite.description = Stlačený uhlík, používaný v elektronických komponentách a též jako munice. item.sand.description = Běžný materiál rozšířeně používaný v spalování slitin. item.coal.description = Běžné a snadno dostupné palivo, pochází z Ostravy. item.titanium.description = Vzácný, velice lehký kov, používá se rozsáhle v trasportu tekutin, vrtech a letounech. @@ -1022,29 +1102,29 @@ liquid.slag.description = Rostavený scrap pou žívá se k vírobě olova mědi liquid.oil.description = Může být spálen, vybouchnout nebo použit jako chlazení. liquid.cryofluid.description = Nejefektivnější tekutina pro chlazení. mech.alpha-mech.description = Standartní mech. Má slušnou rychlost a poškození; Může vytvořit až 3 drony Pro zvýšenou ofenzivní způsobilost. -mech.delta-mech.description = Rychlý, Lehce obrněný mech vytvořený pro udeř a uteč akce. Působí malé poškození vůči struktůrám, ale může zneškodnit velkou skupinu nepřátelských jednotek velmi rychle svýmy elektro-obloukovými zbraněmi +mech.delta-mech.description = Rychlý, lehce obrněný mech vytvořený pro udeř a uteč akce. Působí malé poškození vůči struktůrám, ale může zneškodnit velkou skupinu nepřátelských jednotek velmi rychle svýmy elektro-obloukovými zbraněmi mech.tau-mech.description = Podpůrný mech. Léčí spojenecké stavby a jednotky střelbou do nich. Může léčit i spojence ve svém poli působení. mech.omega-mech.description = Objemný a velice dovře obrněný mech, určen pro útok v přední linii. Jeho schopnost obrnění blokuje až 90% příchozího poškození. -mech.dart-ship.description = Standartní loď. Poměrně rychlý a lehký, má malou ofenzívu a pomalou rychlost těžení. +mech.dart-ship.description = Standartní loď. Poměrně rychlá a lehká, má malou ofenzívu a pomalou rychlost těžení. mech.javelin-ship.description = Loď stylu udeř a uteč. Zpočátku pomalý ale umí akcelerovat do obrovské rychlosti a létat u nepřátelských základen a působit značné škody svými elektrickými zbraněmi a raketami. mech.trident-ship.description = Těžký bombardér. Docela dobře obrněný. -mech.glaive-ship.description = Obrovská, Dobře obrněná střelecká loď. Vybavena zápalným opakovačem. Dobrá akcelerace a maximální rychlost. -unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. Automatically mines copper and lead in the vicinity. Delivers mined resources to the closest core. -unit.spirit.description = Startovní dron. Standartně se objevuje u jádra. Automaticky těží rudy a opravuje stavby. +mech.glaive-ship.description = Obrovská, dobře obrněná střelecká loď. Vybavena zápalným opakovačem. Dobrá akcelerace a maximální rychlost. +unit.draug.description = Jednoduchý těžící dron. Levný a postradatelný. Automaticky těží měď a olovo v blízkosti. Natěžené suroviny donese do nejbližšího jádra. +unit.spirit.description = Startovní dron. Standardně se objevuje u jádra. Automaticky těží rudy a opravuje stavby. unit.phantom.description = Pokročilý dron. Automaticky těží rudy a opravuje stavby. Podstatně víc efektivní než Spirit dron. unit.dagger.description = Základní pozemní jednotka. Efektivní ve velkém počtu. -unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies. +unit.crawler.description = Pozemní jednotka zkonstruovaná z okřesané železné kostry a připlácnutých výbušnin. Vydrží málo a exploduje při kontaktu. unit.titan.description = Pokročilá, obrněná pozemní jednotka. Útočí jak na pozemní tak vzdušné nepřátelské jednotky. unit.fortress.description = Težká, pozemní artilérní jednotka. -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 = Těžký protibudovní mech. Střílí proud žhavé kapaliny na nepřátelské budovy. Zapaluje a roztavuje vše v cestě. unit.wraith.description = Rychlý, udeř a uteč stíhací letoun. unit.ghoul.description = Těžký, kobercový bombardér. unit.revenant.description = A heavy, hovering missile array. -block.message.description = Stores a message. Used for communication between allies. -block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. -block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. +block.message.description = Ukládá zprávu. Používá se pro komunikaci mezi spojenci. +block.graphite-press.description = Přeměňuje neforemné kusy uhlí do ušlechtilých výlisků graphitu. +block.multi-press.description = Vylepšená verze graphitového lisu. Využívá vodu a energii k rychlejšímu a efektivnějšímu zpracování uhlí. block.silicon-smelter.description = Redukuje písek s vysoce čistým koksem za účelem výroby křemíku. -block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. +block.kiln.description = Přetavuje písek a olovo do metaskla. Vyžaduje malé množství energie. block.plastanium-compressor.description = Produkuje plastánium za pomocí titánia a ropy. block.phase-weaver.description = Produkuje fázovou tkaninu z radioaktivního thoria a velkého množství písku. block.alloy-smelter.description = Produkuje impulzní slitinu z titánia, olova, křemíku a mědi. @@ -1053,7 +1133,7 @@ block.blast-mixer.description = Používá ropu k přeměně pyratitu do méně block.pyratite-mixer.description = Míchá uhlí, olovo a písek do velice hořlavého pyratitu. block.melter.description = Taví kámen při velice vysokých teplotách na lávu. block.separator.description = Vystaví kámen velkému tlaku vody k získání různých materiálů obsažené v kameni. -block.spore-press.description = Compresses spore pods into oil. +block.spore-press.description = Vylisuje ze spórů ropu. block.pulverizer.description = Drtí kámen na písek. Užitečné když se v oblasti nenalézá písek. block.coal-centrifuge.description = Solidifes oil into chunks of coal. block.incinerator.description = Zbaví tě přebytku předmětů. @@ -1062,27 +1142,28 @@ block.power-source.description = Nekonečný zdroj energie. Jen pro Sandbox. block.item-source.description = Nekonečný zdroj předmětů. Jen pro Sandbox. block.item-void.description = Likviduje jakéhokoliv vstupní předmět bež použití energie. Jen pro Sandbox. block.liquid-source.description = Nekonečný zdroj tekutin. Jen pro Sandbox. -block.copper-wall.description = Levný defenzivní blok.\nUžitečný k obraně tvého jádra a střílen v prvotních vlnách nepřátel. -block.copper-wall-large.description = Levný defenzivní blok.\nUžitečný k obraně tvého jádra a střílen v prvotních vlnách nepřátel.\nZabírá více polí. -block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. -block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.liquid-void.description = Removes any liquids. Sandbox only. +block.copper-wall.description = Levný defenzivní blok.\nUžitečný k obraně Tvé základny a střílen v prvotních vlnách nepřátel. +block.copper-wall-large.description = Levný defenzivní blok.\nUžitečný k obraně Tvé základny a střílen v prvotních vlnách nepřátel.\nZabírá více polí. +block.titanium-wall.description = Středně dobrý obranný blok.\nPoskytuje středně dobrou obranu proti nepřátelům. +block.titanium-wall-large.description = Středně dobrý obranný blok.\nPoskytuje středně dobrou obranu proti nepřátelům.\nZabírá více polí. +block.plastanium-wall.description = Speciální typ zdi, která je schopná absorbovat elektrické oblouky a blokuje energetické připojení. +block.plastanium-wall-large.description = Speciální typ zdi, která je schopná absorbovat elektrické oblouky a blokuje energetické připojení.\nZabírá více polí. block.thorium-wall.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům. block.thorium-wall-large.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům..\nZabírá více polí. -block.phase-wall.description = Né tak silná jako zeď Thoria ale odráží nepřátelské projektily dokud nejsou moc silné. -block.phase-wall-large.description = Né tak silná jako zeď Thoria ale odráží nepřátelské projektily dokud nejsou moc silné.\nZabírá více polí. +block.phase-wall.description = Není tak silná, jako zeď Thoria, ale odráží nepřátelské projektily dokud nejsou moc silné. +block.phase-wall-large.description = Není tak silná, jako zeď Thoria, ale odráží nepřátelské projektily dokud nejsou moc silné.\nZabírá více polí. block.surge-wall.description = Nejsilnější defenzivní blok.\nMá malou šanci vystřelit elektrický paprsek vůči útočníkovi. block.surge-wall-large.description = Nejsilnější defenzivní blok.\nMá malou šanci vystřelit elektrický paprsek vůči útočníkovi.\nZabírá více polí. block.door.description = Malé dveře, které se dají otevřít nebo zavřít kliknutím na ně.\nKdyž otevřené nepřátelé mohou střílet a dostat se skrz. block.door-large.description = Velké dveře, které se dají otevřít nebo zavřít kliknutím na ně.\nKdyž otevřené nepřátelé mohou střílet a dostat se skrz.\nZabírá více polí. -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 = Pravidelně opravuje bloky ve svém okolí. Mezi vlnami opraví zátarasy.\nVolitelně lze využít křemíku pro posílení dosahu a efektivity. block.mend-projector.description = Kontinuálně léčí bloky v poli svého působení. block.overdrive-projector.description = Zrychluje funkce blízkých struktůr jako jsou vrty a dopravníky. block.force-projector.description = Vytvoří okolo sebe šestihrané silové pole, chrání jednotky a budovy uvnitř sebe vůči střelám. block.shock-mine.description = Působí poškození nepřátelským jednotkám při sešlápnutí. Skoro neviditelné nepřáteli. block.conveyor.description = Základní blok přepravy předmětů. Nese předměty kupředu a automaticky plní střílny nebo bloky výroby do kterých směřují. dá se otáčet do různých směrů. -block.titanium-conveyor.description = Pokročilý blok přepravy předmětů. Nese předměty rychleji jak standartní dopravníky. +block.titanium-conveyor.description = Pokročilý blok přepravy předmětů. Nese předměty rychleji jak standardní dopravníky. block.junction.description = Chová se jako most pro dva křížící se pásy dopravníků. Užitečný při situaci kdy dva rozdílné dopravníky dopravují dva rozdílné materiálny na rozdílné místa. block.bridge-conveyor.description = Pokročilý blok přepravy předmětů. Dovoluje transport předmětů až přez tři pole jakéhokoliv terénu nebo budovy. block.phase-conveyor.description = Pokročilý blok přepravy předmětů. Využívá energii k přepravě od jednoho bodu k druhému po velice dlouhé vzdálenosti. @@ -1096,24 +1177,26 @@ block.mechanical-pump.description = Levná pumpa s pomalým tokem, ale nevyžadu block.rotary-pump.description = Pokročilá pumpa která, zdvojnásobuje přísun tekutin za použití energie. block.thermal-pump.description = Ultimátní pumpa. Trojnásobně rychlejší než mechanická pumpa a jediná pumpa která dokáže pracovat s lávou. block.conduit.description = Základní blok přepravy tekutin. Funguje jako dopravník, ale na tekutiny, chápeš ne ? Užívá se s extraktory, pumpami nebo jiným potrubím. -block.pulse-conduit.description = Pokročilý blok přepravy tekutin. Přepravuje tekutiny rychleji a více než standartní potrubí. +block.pulse-conduit.description = Pokročilý blok přepravy tekutin. Přepravuje tekutiny rychleji a více než standardní potrubí. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Příjmá tekutiny z jednoho směru a vypouští je rovnoměrně do zbylých tří směrů. Dokáže uložit na krátkou dobu nějaký obsah tekutin. Užitečný při rozdělení jednoho zdroje směřující do různých cílů. block.liquid-tank.description = Uloží velké množství tekutin. Použíj ho pro vyrovnávací zásoby vody když je příděl nestabilní nebo jako záložní chlazení pro generátory. block.liquid-junction.description = Chová se jako most pro dvě křížící se potrubí. Užitečný v situacích když dvě rozdílné potrubí nesou rozdílný obsah na rozdílná místa. block.bridge-conduit.description = Pokročilý blok přepravy tekutin. Dovoluje transportovat tekutiny až přez tři pole jakéhokoliv terénu nebo budovy. block.phase-conduit.description = Pokročilý blok přepravy tekutin. Používá energii k teleportu tekutin do druhého bodu přez několik polí. block.power-node.description = Vysílá energii mezi propojenými uzly. Dokáže se propojit až se čtyřmi uzly či stavbami najednou. Uzel bude dostávat zásobu energie a bude ji distribuovat mezi připojené bloky. -block.power-node-large.description = Má větší dosah než standartní energetický uzel and a dokáže propojit až 6 staveb nebo uzly. -block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.power-node-large.description = Má větší dosah než standardní energetický uzel and a dokáže propojit až 6 staveb nebo uzly. +block.surge-tower.description = Energetický uzel s extrémním dosahem, ale méně dostupnými přípojkami. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Ukládá energii kdykoliv kdy je nadbytek ,poskytuje energii kdykolik když je pokles energie v síti, tak dlouho doku zbývá kapacita. -block.battery-large.description = Uloží více energie než standartní baterie. +block.battery-large.description = Uloží více energie než standardní baterie. block.combustion-generator.description = Generuje energii spalováním ropy nebo jinných hořlavých materiálů. block.thermal-generator.description = Generuje obrovské množství energie z lávy. block.turbine-generator.description = Více efektivní než spalovací generátor, ale vyžaduje dodatečný přísun vody. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. +block.differential-generator.description = Generuje velké množství energie. Využívá teplotního rozdílu mezi chladící kapalinou a hořícím pyratitem. block.rtg-generator.description = Rádioizotopní Termoelektrický Generátor nevyžaduje chlazení, za to generuje méně energie než Thoriový generátor. block.solar-panel.description = Poskytuje malé množství energie ze slunce. -block.solar-panel-large.description = Poskytuje mnohem lepší zdroj energie než standartní solární panel, za to je mnohem nákladnější na stavbu. +block.solar-panel-large.description = Poskytuje mnohem lepší zdroj energie než standardní solární panel, za to je mnohem nákladnější na stavbu. block.thorium-reactor.description = Generuje obrovské množství energie z radioaktivního thoria. Vyžaduje konstantní chlazení. Způsobí velikou explozi je-li zásobován nedostatečným množstvím chlazení. Výstup energie závisí na plnosti obsahu generátoru, základní generování energie se aktivuje při poloviční kapacitě. block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. block.mechanical-drill.description = Levný vrt. Při položení na vhodné pole, natrvalo a pomalu produkuje materiál na který byl položen. @@ -1123,17 +1206,17 @@ block.blast-drill.description = Ultimátní vrt, vyžaduje velké množství ene block.water-extractor.description = Extrahuje vodu ze země. Vhodný k použití když se v oblasti nenachází zdroj vody. block.cultivator.description = Kultivuje půdu vodou za účelem získání biohmoty. block.oil-extractor.description = Vyžaduje velké množství energie na extrakci ropy z písku. Použíj ho když se v oblasti nenachází žádný zdroj ropy. -block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen. -block.core-foundation.description = The second version of the core. Better armored. Stores more resources. -block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources. -block.vault.description = Ukládá velké množství předmětů každého typu. Připojené kontejnéry, trezory nebo jádra se budou chovat jako samostatné skladovací jednotky. [LIGHT_GRAY] Odbavovač[] lže použít pro odbavení předmětů z trezoru. -block.container.description = Ukládá malé množství předmětů každého typu. Připojené kontejnéry, trezory nebo jádra se budou chovat jako samostatné skladovací jednotky. [LIGHT_GRAY] Odbavovač[] lze použít pro odbavení předmětů z kontejnéru. -block.unloader.description = Vykládá předměty z kontejnéru, trezoru nebo jádra na dopravník nebo přímo do produktivních bloků. Druh předmětu pro vykládání lze měti kliknutím na odbavovač. -block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. +block.core-shard.description = První verze jádra. V případě, že je zničeno, veškerý kontakt s regionem je ztracen. Nedopusťte aby se to stalo. +block.core-foundation.description = Druhá, lépe obrněná verze jádra. Pojme více surovin. +block.core-nucleus.description = Třetí a finální iterace vývoje jádra. Extrémně obrněná, extrémně prostorná. +block.vault.description = Ukládá velké množství předmětů každého typu. Připojené kontejnéry, trezory nebo jádra se budou chovat jako samostatné skladovací jednotky. [LIGHT_GRAY]Odbavovač[] lze použít pro odbavení předmětů z trezoru. +block.container.description = Ukládá malé množství předmětů každého typu. Připojené kontejnéry, trezory nebo jádra se budou chovat jako samostatné skladovací jednotky. [LIGHT_GRAY]Odbavovač[] lze použít pro odbavení předmětů z kontejnéru. +block.unloader.description = Vykládá předměty z kontejnéru, trezoru nebo jádra na dopravník nebo přímo do produktivních bloků. Druh předmětu pro vykládání lze změnit kliknutím na odbavovač. +block.launch-pad.description = Posílá dávky předmětů do vesmíru bez nutnosti vysílat jádro. Nedokončený. +block.launch-pad-large.description = Vylepšený Launch Pad. Větší úložný prostor, častěji vysílán do vesmíru. block.duo.description = Malá, levná střílna. -block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. -block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. +block.scatter.description = Protivzdušná střílna střední velikosti. Střílí hrstky olova nebo šrotu. +block.scorch.description = Spálí nepřátele v blízkosti na prach. Velmi efektivní na malé vzdálenosti. block.hail.description = Malá artilérní střílna. block.wave.description = Středně vělká, rychle pálící střílna, která střílí krystalizované bubliny. block.lancer.description = Středně velká střílna, která střílí nabité elektrické paprsky. @@ -1145,22 +1228,22 @@ block.ripple.description = Velká artilérní střílna, která vystřelí něko 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.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.command-center.description = Umožňuje zadávat příkazy k pohybu spojeneckých jednotek po mapě.\nUmožňuje výběr mezi patrolováním, útokem na nepřítele, či návratem k jádru nebo továrně. Pokud se na mapě nenachází nepřátelské jádro, jednotky budou patrolovat v útočném režimu. +block.draug-factory.description = Produkuje těžící Draug drony. 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.wraith-factory.description = Produkuje rychlé, udeř a uteč stíhače. block.ghoul-factory.description = Produkuje těžké kobercové bombardéry. block.revenant-factory.description = Produkuje vzdušné, težké laserové stíhače.. -block.dagger-factory.description = Produkuje standartní pozemní jednotky. +block.dagger-factory.description = Produkuje standardní pozemní jednotky. block.crawler-factory.description = Produces fast self-destructing swarm units. block.titan-factory.description = Produkuje pokročilé, orněné pozemní jednotky. block.fortress-factory.description = Produkuje těžké artilérní, pozmení jednotky. block.repair-point.description = Kontinuálně léčí nejbližší budovy a jednotky. -block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. -block.delta-mech-pad.description = Zanech zde své aktuální plavidlo a změn ho na rychlého, lehce obrněného mecha určeného pro udeř a uteč operace.\nPoužíj ho poklikáním když se nacházíš nad ním. -block.tau-mech-pad.description = Zanech zde své aktuální plavidlo a změn ho na na podpůrného mecha, který léčí spojenecké budovy a jednotky.\nPoužíj ho poklikáním když se nacházíš nad ním. -block.omega-mech-pad.description = Zanech zde své aktuální plavidlo a změn ho na objemného dobře obrněného mecha, určeného pro útok v přední linii.\nPoužíj ho poklikáním když se nacházíš nad ním. -block.javelin-ship-pad.description = Zanech zde své aktuální plavidlo a změn ho na silný a rychlý stíhač s bleskovými zbraněmi.\nPoužíj ho poklikáním když se nacházíš nad ním. -block.trident-ship-pad.description = Zanech zde své aktuální plavidlo a změň ho do docela dobře obrněného těžkého bombardéru.\nPoužíj ho poklikáním když se nacházíš nad ním. -block.glaive-ship-pad.description = Zanech zde své aktuální plavidlo a změn ho na velkou, dobře obrněnou střeleckou loď.\nPoužíj ho poklikáním když se nacházíš nad ním. +block.dart-mech-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za základního útočného mecha.\nAktivuj kliknutím, když se nacházíš nad platformou. +block.delta-mech-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za rychlého, lehce obrněného mecha určeného pro udeř a uteč operace.\nAktivuj kliknutím, když se nacházíš nad platformou. +block.tau-mech-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za na podpůrného mecha, který léčí spojenecké budovy a jednotky.\nAktivuj kliknutím, když se nacházíš nad platformou. +block.omega-mech-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za objemného dobře obrněného mecha, určeného pro útok v přední linii.\nAktivuj kliknutím, když se nacházíš nad platformou. +block.javelin-ship-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za silný a rychlý stíhač s bleskovými zbraněmi.\nAktivuj kliknutím, když se nacházíš nad platformou. +block.trident-ship-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za docela dobře obrněného těžkého bombardéru.\nAktivuj kliknutím, když se nacházíš nad platformou. +block.glaive-ship-pad.description = Zanech zde své aktuální plavidlo a vyměň ho za velkou, dobře obrněnou střeleckou loď.\nAktivuj kliknutím, když se nacházíš nad platformou. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index ac831aaa77..b0a3cd5953 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1,8 +1,8 @@ credits.text = Entwickelt von [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY] credits = Danksagungen contributors = Übersetzer und Mitwirkende -discord = Trete dem Mindustry Discord bei! -link.discord.description = Der offizielle Mindustry Discord-Chatroom +discord = Tritt dem Mindustry Discord bei! +link.discord.description = Der offizielle Mindustry Discord-Server link.reddit.description = Der Mindustry Subreddit link.github.description = Quellcode des Spiels link.changelog.description = Liste der Änderungen @@ -10,36 +10,49 @@ link.dev-builds.description = Entwicklungs-Builds (instabil) link.trello.description = Offizielles Trello Board für geplante Features link.itch.io.description = itch.io-Seite mit Downloads und der Web-Version des Spiels link.google-play.description = Google Play Store Seite +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Offizelles Mindustry Wiki +link.feathub.description = Suggest new features linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert. screenshot = Screenshot gespeichert nach {0} screenshot.invalid = Karte zu groß! Eventuell nicht ausreichend Arbeitsspeicher für Screenshot. gameover = Der Kern wurde zerstört. gameover.pvp = Das[accent] {0}[] Team ist siegreich! highscore = [YELLOW] Neuer Highscore! -copied = Copied. +copied = Kopiert. + load.sound = Sounds -load.map = Maps -load.image = Images -load.content = Content +load.map = Karten +load.image = Bilder +load.content = Inhalt load.system = System load.mod = Mods -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. -schematic.delete.confirm = This schematic will be utterly eradicated. -schematic.rename = Rename Schematic -schematic.info = {0}x{1}, {2} blocks +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + +schematic = Entwürfe +schematic.add = Entwurf speichern... +schematics = Entwürfe +schematic.replace = Ein anderer Entwurf hat bereits diesen Namen. Diesen Ersetzen? +schematic.import = Entwurf importieren... +schematic.exportfile = Entwurf exportieren +schematic.importfile = Detei importieren +schematic.browseworkshop = Workshop erkunden +schematic.copy = In Zwischenablage speichern +schematic.copy.import = Aus Zwischenablage ziehen +schematic.shareworkshop = Im Workshop teilen +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Entwurf umkehren +schematic.saved = Entwurf gespeichert. +schematic.delete.confirm = Dieser Entwurf wird absolut ausgelöscht. +schematic.rename = Entwurf umbenennen +schematic.info = {0}x{1}, {2} Blöcke + stat.wave = Wellen besiegt:[accent] {0} stat.enemiesDestroyed = Gegner zerstört:[accent] {0} stat.built = Gebäude gebaut:[accent] {0} @@ -47,15 +60,16 @@ stat.destroyed = Gebäude zerstört:[accent] {0} stat.deconstructed = Gebäude abgebaut:[accent] {0} stat.delivered = Übertragene Ressourcen: stat.rank = Finaler Rang: [accent]{0} -launcheditems = [accent]Übertragene Items -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. + +launcheditems = [accent]Abgefeuerte Items +launchinfo = [unlaunched][[LAUNCH] deine Basis um blau markierte Items zu erhalten. map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? level.highscore = Highscore: [accent]{0} level.select = Level-Auswahl level.mode = Spielmodus: showagain = Nächstes Mal nicht mehr anzeigen coreattack = < Die Basis wird angegriffen! > -nearpoint = [[ [scarlet]SOFORT DEN DROPPOINT VERLASSEN[] ]\nVernichtung droht +nearpoint = [[ [scarlet]SOFORT DEN SPAWNPUNKT VERLASSEN[] ]\nVernichtung droht database = Kern-Datenbank savegame = Spiel speichern loadgame = Spiel laden @@ -70,40 +84,49 @@ website = Website quit = Verlassen save.quit = Speichern & Beenden maps = Karten -maps.browse = Browse Maps +maps.browse = Karten durschsuchen continue = Weiter maps.none = [LIGHT_GRAY]Keine Karten gefunden! -invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes -done = Done -feature.unsupported = Your device does not support this feature. -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. +invalid = ungültig +pickcolor = Pick Color +preparingconfig = Konfiguration vorbereiten +preparingcontent = Inhalte vorbereiten +uploadingcontent = Inhalte hochladen +uploadingpreviewfile = Vorschau hochladen +committingchanges = Veränderungen bestätigen +done = Fertig +feature.unsupported = Dein System unsterstützt dieses Feature nicht. + +mods.alphainfo = Vergiss nicht, dass Mods in der Alpha sind, und sehr Fehlerhaft sein [scarlet]könnten[].\nSende alle Probleme an den Mindustry Github oder Discord. mods.alpha = [accent](Alpha) mods = Mods -mods.none = [LIGHT_GRAY]No mods found! -mods.guide = Modding Guide -mods.report = Report Bug +mods.none = [LIGHT_GRAY]Keine Mods gefunden! +mods.guide = Modding Anleitung +mods.report = Problem senden mods.openfolder = Mod Verzeichnis öffnen -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = Disable -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -mod.enable = Enable -mod.requiresrestart = The game will now close to apply the mod changes. -mod.reloadrequired = [scarlet]Reload Required +mod.enabled = [lightgray]Aktiviert +mod.disabled = [scarlet]Deaktiviert +mod.disable = Deaktivieren +mod.delete.error = Unfähig Mod zu löschen; Datei könnte in Benutzung sein. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.missingdependencies = [scarlet]Fehldene Abhängigkeiten: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. +mod.nowdisabled = [scarlet]Mod '{0}' fehlt Abhängigkeiten:[accent] {1}\n[lightgray]Diese Mods müssen erst installiert werden.\nDieser Mod wird automatisch deaktiviert. +mod.enable = Aktivieren +mod.requiresrestart = Das Spiel schließt nun, um Modänderungen wirksam zu machen. +mod.reloadrequired = [scarlet]Neuladen benötigt mod.import = Mod importieren mod.import.github = GitHub Mod importieren -mod.remove.confirm = This mod will be deleted. +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. +mod.remove.confirm = Dieser Mod wird gelöscht. mod.author = [LIGHT_GRAY]Author:[] {0} -mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.missing = Dieser Spielstand enthält Mods, welche nicht mehr vorhanden oder aktualisiert wurden. Spielstandfehler könnten passieren. Bist du dir sicher, das du ihn laden möchtest?\n[lightgray]Mods:\n{0} +mod.preview.missing = Bevor du diesen Mod hochladen kannst, musst du eine Bildvorschau einbinden.\nLade ein Bild namens[accent] preview.png[] in den Modordner und versuchs nochmal. +mod.folder.missing = Nur Mods in Ordnerform können in den Workshop hochgeladen werden.\nUm einen Mod in einen Ordner zu konvertieren, extrahiere einfach die .zip und lösche die alte .zip danach. Starte dann das Spiel neu. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Info name = Name: noname = Wähle zuerst einen[accent] Spielernamen[]. @@ -118,28 +141,29 @@ players = {0} Spieler online players.single = {0} Spieler online server.closing = [accent]Schließe den Server ... server.kicked.kick = Du wurdest vom Server gekickt! -server.kicked.whitelist = You are not whitelisted here. +server.kicked.whitelist = Du bist nicht auf der Whitelist. server.kicked.serverClose = Server geschlossen. -server.kicked.vote = You have been vote-kicked. Goodbye. +server.kicked.vote = Es wurde abgestimmt, dich zu kicken. Tschüss. server.kicked.clientOutdated = Veralteter Client! Aktualisiere dein Spiel! server.kicked.serverOutdated = Veralteter Server! Bitte den Host um ein Update! server.kicked.banned = Du wurdest vom Server verbannt. -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.typeMismatch = Der Server ist nicht mit deinem Versionstyp kompatibel. +server.kicked.playerLimit = Der Server ist voll.\nWarte für einen freien Platz. 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.nameEmpty = Dein Name muss mindestens einen Buchstaben oder eine Zahl enthalten. server.kicked.idInUse = Du bist bereits auf dem Server! Anmeldungen mit zwei Accounts sind nicht gestattet. server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindustry. Lade dir die offizielle Version herunter. server.kicked.gameover = Game Over! +server.kicked.serverRestarting = The server is restarting. server.versions = Deine Version:[accent] {0}[]\nServerversion:[accent] {1}[] host.info = Der [accent]Server hosten[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du anderen die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat. join.info = Hier kannst du eine [accent]Server-IP[] eingeben um dich zu verbinden oder Server im [accent]lokalen Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemandem per IP verbinden willst, musst du den Host nach seiner IP fragen. hostserver = Server hosten -invitefriends = Invite Friends +invitefriends = Freunde einladen hostserver.mobile = Host\nSpiel -host = Server hosten -hosting = [accent] Server wird geöffnet ... +host = Server eröffnen +hosting = [accent] Server wird eröffnet ... hosts.refresh = Aktualisieren hosts.discovering = Suche nach LAN-Spielen hosts.discovering.any = Suche nach Spielen @@ -152,7 +176,7 @@ trace.ip = IP: [accent]{0} trace.id = Eindeutige ID: [accent]{0} trace.mobile = Mobiler Client: [accent]{0} trace.modclient = Gemoddeter Client: [accent]{0} -invalidid = Ungültige Client-ID! Berichte den Bug. +invalidid = Ungültige Client-ID! Berichte den Fehler. server.bans = Bans server.bans.none = Keine gebannten Spieler gefunden! server.admins = Admins @@ -166,18 +190,18 @@ server.version = [lightgray]Version: {0} server.custombuild = [yellow]Benutzerdefinierter Build confirmban = Bist du sicher, dass du diesen Spieler verbannen möchtest? confirmkick = Bist du sicher, dass du diesen Spieler kicken willst? -confirmvotekick = Are you sure you want to vote-kick this player? +confirmvotekick = Willst du wirklich eine Abstimmung zum kicken des spielers machen? confirmunban = Bist du sicher, dass du die Verbannung des Spielers rückgängig machen willst? confirmadmin = Bist du sicher, dass du diesen Spieler zu einem Admin machen möchtest? confirmunadmin = Bis du sicher, dass dieser Spieler kein Admin mehr sein soll? joingame.title = Spiel beitreten joingame.ip = IP: disconnect = Verbindung unterbrochen. -disconnect.error = Connection error. -disconnect.closed = Connection closed. -disconnect.timeout = Timed out. +disconnect.error = Verbindungsfehler. +disconnect.closed = Verbindung geschlossen. +disconnect.timeout = Zu langer Verbindungsversuch. disconnect.data = Fehler beim Laden der Welt! -cantconnect = Unable to join game ([accent]{0}[]). +cantconnect = Unfähig, dem Spiel beizutreten ([accent]{0}[]). connecting = [accent] Verbinde... connecting.data = [accent] Welt wird geladen... server.port = Port: @@ -216,8 +240,8 @@ save.playtime = Spielzeit: {0} warning = Warnung. confirm = Bestätigen delete = Löschen -view.workshop = View In Workshop -workshop.listing = Edit Workshop Listing +view.workshop = Im Workshop betrachten +workshop.listing = Workshop Auflistung bearbeiten ok = OK open = Öffnen customize = Anpassen @@ -227,20 +251,20 @@ copylink = Kopiere Link back = Zurück data.export = Daten exportieren data.import = Daten importieren -data.exported = Data exported. -data.invalid = This isn't valid game data. -data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. -classic.export = Export Classic Data -classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? +data.exported = Daten exportiert. +data.invalid = Das sind ungültige Spieldateien. +data.import.confirm = Externe Spielstände zu importieren löscht[scarlet] all[] deine jetzigen Spielstände.\n[accent]Dies kann nicht rückgängig gemacht werden![]\n\nSobald die Daten importiert sind, schließt das Spiel. +classic.export = Klassische Dateien exportieren +classic.export.text = [accent]Mindustry[] Mindustry hatte gerade ein rießiges Update.\nKlassische (v3.5 build 40) Spielstand oder Karten-Daten wurden gefunden. Willst du sie in den home-Ordner deines Smartphones exportieren, um sie für die Mindustry-Klassik App zu verwenden? quit.confirm = Willst du wirklich aufhören? quit.confirm.tutorial = Willst du das Tutorial wirklich abbrechen?\nDu kannst es unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen. loading = [accent]Wird geladen... -reloading = [accent]Reloading Mods... +reloading = [accent]Mods neuladen... saving = [accent]Speichere... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][] um Plan zu löschen +selectschematic = [accent][[{0}][] zum Auswählen+Kopieren +pausebuilding = [accent][[{0}][] zum Pausieren des Bauens +resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen wave = [accent]Welle {0} wave.waiting = Welle in {0} wave.waveInProgress = [LIGHT_GRAY]Welle im Gange @@ -259,18 +283,19 @@ map.nospawn = Diese Karte hat keine Kerne in denen die Spieler beginnen können! map.nospawn.pvp = Diese Karte hat keine gegnerischen Kerne wo Gegner starten könnten! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu. map.nospawn.attack = Diese Karte hat keine gengnerischen Kerne, die Spieler angreifen können! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu. map.invalid = Fehler beim Laden der Karte: Beschädigtes oder ungültige Karten Datei. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {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! -workshop.menu = Select what you would like to do with this item. +workshop.update = Item aktualisieren +workshop.error = Fehler beim laden von Workshop-Daten: {0} +map.publish.confirm = Willst du wirklich diese Map hochladen?\n\n[lightgray]Vergewissere dich die, der Workshop-EULA zugestimmt zu haben, sonst tauch deine Map nicht auf! +workshop.menu = Wähle aus, was du mit diesem Item machen willst. workshop.info = Item Info changelog = Changelog (optional): eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +missing = Dieses Item wurde verschoben oder gelöscht.\n[lightgray]Die Workshop-Auflistung wird nun automatisch ungekoppelt. +publishing = [accent]Veröffentlichen... +publish.confirm = Bist du sicher, dies zu veröffentlichen?\n\n[lightgray]Vergewissere dich die, der Workshop-EULA zugestimmt zu haben, sonst tauch deine Karte nicht auf! +publish.error = Fehler beim veröffentlichen des Items: {0} +steam.error = Fehler beim laden der Steam-Dienste.\nError: {0} + editor.brush = Pinsel editor.openin = Öffne im Editor editor.oregen = Erze generieren @@ -278,12 +303,12 @@ editor.oregen.info = Erze generiert: editor.mapinfo = Karten Info editor.author = Autor: editor.description = Beschreibung: -editor.nodescription = A map must have a description of at least 4 characters before being published. +editor.nodescription = Eine Karte benötigt mindestens 4 Buchstaben in der Beschreibung, bevor sie veröffentlich werden kann. editor.waves = Wellen: editor.rules = Regeln: editor.generation = Generator: editor.ingame = Im Spiel Bearbeiten -editor.publish.workshop = Publish On Workshop +editor.publish.workshop = Im Workshop veröffentlichen editor.newmap = Neue Karte workshop = Workshop waves.title = Wellen @@ -312,7 +337,7 @@ editor.errorload = Fehler beim Laden der Datei:\n[accent]{0} editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0} editor.errorimage = Das ist ein Bild, keine Karte. Wechsel nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine alte Karte importieren möchtest, benutze den 'Importiere Terrain Bild' Knopf in dem Editor. editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Karten Format, das nicht mehr unterstützt wird. -editor.errornot = This is not a map file. +editor.errornot = Dies ist keine Kartendatei editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt. editor.errorname = Karte hat keinen Namen. editor.update = Aktualisieren @@ -347,6 +372,7 @@ editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Karte. editor.overwrite.confirm = [scarlet]Warnung![] Eine Karte mit diesem Namen existiert bereits. Bist du sicher, dass du sie überschreiben willst? editor.exists = A map with this name already exists. editor.selectmap = Wähle eine Karte zum Laden: + toolmode.replace = Ersetzen toolmode.replace.description = Zeichnet nur auf festen Blöcken. toolmode.replaceall = Alles Ersetzen @@ -361,6 +387,7 @@ toolmode.fillteams = Teams Ausfüllen toolmode.fillteams.description = Füllt Teams aus anstatt Blöcke. toolmode.drawteams = Teams Zeichnen toolmode.drawteams.description = Zeichnet Teams anstatt Blöcke. + filters.empty = [LIGHT_GRAY]Keine Filter! Füge einen mit dem unteren Knopf hinzu. filter.distort = Verzerren filter.noise = Rauschen @@ -392,6 +419,7 @@ filter.option.floor2 = Sekundärer Boden filter.option.threshold2 = Sekundärer Grenzwert filter.option.radius = Radius filter.option.percentile = Perzentil + width = Breite: height = Höhe: menu = Menü @@ -407,36 +435,38 @@ tutorial = Tutorial tutorial.retake = Tutorial wiederholen editor = Editor mapeditor = Karten Editor + abandon = Aufgeben abandon.text = Diese Zone sowie alle Ressourcen werden dem Gegner überlassen. locked = Gesperrt complete = [LIGHT_GRAY]Abschließen: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.wave = Erreiche {0} in {1} +requirement.core = Zerstöre Gegnerbasis in {0} +requirement.unlock = Schalte {0} freo resume = Zu Zone zurückkehren:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Beste Welle: {0} launch = Abschluss launch.title = Abschluss erfolgreich launch.next = [LIGHT_GRAY]Nächste Möglichkeit bei Welle {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] +launch.unable2 = [scarlet]Unfähig abzuschließen.[] launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kannst nicht wieder zu dieser Karte zurückkehren. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. +launch.skip.confirm = Wenn du jetzt überspringst, kannst du nicht vor späteren Wellen abschließen. uncover = Freischalten configure = Startitems festlegen bannedblocks = Gesperrte Blöcke addall = Alle hinzufügen configure.locked = [LIGHT_GRAY]Erreiche Welle {0}\n, um Startitems festlegen zu können. -configure.invalid = Amount must be a number between 0 and {0}. +configure.invalid = Anzahl muss zwischen 0 und {0} sein. zone.unlocked = [LIGHT_GRAY]{0} freigeschaltet. zone.requirement.complete = Welle {0} erreicht:\n{1} Anforderungen der Zone erfüllt. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.config.unlocked = Konfiguration:[lightgray]\n{0} zone.resources = Ressourcen entdeckt: zone.objective = [lightgray]Ziel: [accent]{0} zone.objective.survival = Überlebe zone.objective.attack = Zerstöre den feindlichen Kern add = Hinzufügen... boss.health = Boss Lebenskraft + connectfail = [crimson] Verbindung zum Server konnte nicht hergestellt werden: [accent]{0} error.unreachable = Server nicht erreichbar. error.invalidaddress = Ungültige Adresse. @@ -447,6 +477,7 @@ error.mapnotfound = Kartendatei nicht gefunden! error.io = Netzwerk-Ein-/Ausgabe-Fehler. error.any = Unbekannter Netzwerkfehler. error.bloom = Bloom konnte nicht initialisiert werden.\nEs kann sein, dass dein Gerät es nicht unterstützt. + zone.groundZero.name = Ground Zero zone.desertWastes.name = Schrottwüste zone.craters.name = Krater @@ -456,11 +487,12 @@ zone.stainedMountains.name = Gefleckte Berge zone.desolateRift.name = Trostloser Riss zone.nuclearComplex.name = Kernkraftwerk zone.overgrowth.name = Überwucherung -zone.tarFields.name = Teerfelder -zone.saltFlats.name = Salzebenen +zone.tarFields.name = Ölfelder +zone.saltFlats.name = Salztiefen zone.impact0078.name = Auswirkung 0078 zone.crags.name = Felsen -zone.fungalPass.name = Fungal Pass +zone.fungalPass.name = Sporenpass + zone.groundZero.description = Der optimale Ort, um anzufangen. Niedrige Bedrohung durch Gegner. Wenige Ressourcen.\nSammel so viel Kupfer und Blei wie möglich.\nMach weiter! zone.frozenForest.description = Sogar hier, näher an den Bergen, haben sich die Sporen verbreitet. Die kalten Temperaturen können sie nicht für immer im Schach halten.\n\nStarte das Wagnis in Strom. Baue Verbrennungsgeneratoren. Lerne Heiler zu benutzen. zone.desertWastes.description = Diese Abfälle sind riesig, unberechenbar, und durchzogen von verfallenen Sektorstrukturen.\nKohle ist in dieser Region vorhanden. Verbrenne es für Strom, oder synthetisiere Graphit.\n\n[lightgray]Dieser Landeort kann nicht garantiert werden. @@ -472,13 +504,15 @@ zone.overgrowth.description = Dieser Bereich ist bewachsen, näher an der Quelle zone.tarFields.description = Der Rand einer Ölförderzone, zwischen Bergen und Wüste. Eine der wenigen Plätze mit nutzbare Teer Reserven.\nObwohl es aufgegeben wurde, hat dieses Gebiet einige gefährliche feindliche Kräfte in der Nähe. Unterschätze sie nicht.\n\n[lightgray]Wenn möglich, erforsche Technologien zur Ölverarbeitung. zone.desolateRift.description = Eine extrem gefährliche Zone. Reichlich Ressourcen, aber wenig Platz. Hohe Zerstörungsgefahr. Verlasse es so schnell wie möglich. Lassen Sie sich nicht von den großen Abständen zwischen feindlichen Angriffen in die Irre führen. zone.nuclearComplex.description = Eine ehemalige Anlage zur Herstellung und Verarbeitung von Thorium, die in Trümmern liegt.\n[lightgray]Erforsche das Thorium und seine vielen Verwendungsmöglichkeiten.\n\nDer Feind ist hier in großer Zahl präsent und sucht ständig nach Angreifern. -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 = Ein Übergangsgebiet zwischen hohen Bergen und tieferen, sporengeplagter Länder. Eine kleine Späherbasis ist hier angelegt.\nZerstöre sie.\nNutze Dagger und Crawler. Zerstöre die zwei Basen. zone.impact0078.description = zone.crags.description = + settings.language = Sprache settings.data = Spieldaten settings.reset = Auf Standard zurücksetzen settings.rebind = Zuweisen +settings.resetKey = Reset settings.controls = Steuerung settings.game = Spiel settings.sound = Audio @@ -509,13 +543,13 @@ blocks.shootrange = Reichweite blocks.size = Größe blocks.liquidcapacity = Flüssigkeitskapazität blocks.powerrange = Stromreichweite -blocks.powerconnections = Max Connections +blocks.powerconnections = Maximale Stromverbindungen blocks.poweruse = Stromverbrauch blocks.powerdamage = Stromverbrauch/Schadenspunkt blocks.itemcapacity = Materialkapazität blocks.basepowergeneration = Basis-Stromerzeugung blocks.productiontime = Produktionszeit -blocks.repairtime = Block volle Reparaturzeit +blocks.repairtime = Zeit zur vollständigen Heilung blocks.speedincrease = Geschwindigkeitserhöhung blocks.range = Reichweite blocks.drilltier = Abbaubare Erze @@ -529,14 +563,15 @@ blocks.inaccuracy = Ungenauigkeit blocks.shots = Schüsse blocks.reload = Schüsse/Sekunde blocks.ammo = Munition -bar.drilltierreq = besserer Bohrer benötigt + +bar.drilltierreq = Besserer Bohrer benötigt bar.drillspeed = Bohrgeschwindigkeit: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Effizienz: {0}% bar.powerbalance = Strom: {0} bar.powerstored = Stored: {0}/{1} bar.poweramount = Strom: {0} -bar.poweroutput = Strom Output: {0} +bar.poweroutput = Stromgeneration: {0} bar.items = Items: {0} bar.capacity = Capacity: {0} bar.liquid = Flüssigkeit @@ -544,17 +579,21 @@ bar.heat = Hitze bar.power = Strom bar.progress = Baufortschritt bar.spawned = Einheiten: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] Schaden bullet.splashdamage = [stat]{0}[lightgray] Flächenschaden ~[stat] {1}[lightgray] Kacheln bullet.incendiary = [stat]entzündend -bullet.homing = [stat]verfolgend +bullet.homing = [stat]zielsuchend bullet.shock = [stat]schock bullet.frag = [stat]explosiv bullet.knockback = [stat]{0}[lightgray] zurückstoßend -bullet.freezing = [stat]gefrierend -bullet.tarred = [stat]geteert +bullet.freezing = [stat]frierend +bullet.tarred = [stat]teerent bullet.multiplier = [stat]{0}[lightgray]x Munition Multiplikator bullet.reload = [stat]{0}[lightgray]x Feuerrate + unit.blocks = Blöcke unit.powersecond = Stromeinheiten/Sekunde unit.liquidsecond = Flüssigkeitseinheiten/Sekunde @@ -563,22 +602,25 @@ unit.liquidunits = Flüssigkeitseinheiten unit.powerunits = Stromeinheiten unit.degrees = Grad unit.seconds = Sekunden -unit.persecond = /sec +unit.persecond = /s unit.timesspeed = x Geschwindigkeit unit.percent = % unit.items = Materialeinheiten +unit.thousands = k +unit.millions = mil category.general = Allgemeines category.power = Strom category.liquids = Flüssigkeiten category.items = Materialien category.crafting = Erzeugung category.shooting = Schießen -category.optional = Optionale Verbesserungen +category.optional = Zusätze setting.landscape.name = Landschaft sperren setting.shadows.name = Schatten -setting.blockreplace.name = Automatic Block Suggestions +setting.blockreplace.name = Automatische Blockvorschläge setting.linear.name = Lineare Filterung -setting.hints.name = Hints +setting.hints.name = Tipps +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animiertes Wasser setting.animatedshields.name = Animierte Schilde setting.antialias.name = Antialias[LIGHT_GRAY] (Neustart erforderlich)[] @@ -597,10 +639,11 @@ setting.difficulty.normal = Normal setting.difficulty.hard = Schwer setting.difficulty.insane = Unmöglich setting.difficulty.name = Schwierigkeit -setting.screenshake.name = Bildschirmwackeln +setting.screenshake.name = Wackeleffekt setting.effects.name = Effekte anzeigen setting.destroyedblocks.name = Zerstörte Blöcke anzeigen setting.conveyorpathfinding.name = Automatische Wegfindung beim Bau von Förderbändern +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Controller-Empfindlichkeit setting.saveinterval.name = Autosave Häufigkeit setting.seconds = {0} Sekunden @@ -625,8 +668,8 @@ setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Deckkraft setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Chat im Spiel anzeigen -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. +public.confirm = Willst du dein Spiel öffentlich zugänglich machen?\n[accent]Jeder kann deinem Spiel beitreten.\n[lightgray]Dies kann später in den Einstellung->Spielt->Öffentliches Spiel geändert werden. +public.beta = Bemerke: Beta-Versionen des Spiels können keine öffentlichen Spiele machen. 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.cancel = Abbrechen & Beenden setting.bloom.name = Bloom @@ -643,12 +686,15 @@ keybind.clear_building.name = Clear Building keybind.press = Drücke eine Taste... keybind.press.axis = Drücke eine Taste oder bewege eine Achse... keybind.screenshot.name = Karten Screenshot +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = X-Achse keybind.move_y.name = Y-Achse +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Bindestrich keybind.schematic_select.name = Bereich auswählen keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.schematic_flip_x.name = Entwurf umdrehen X +keybind.schematic_flip_y.name = Entwurf umdrehn Y keybind.category_prev.name = Vorige Kategorie keybind.category_next.name = Nächste Kategorie keybind.block_select_left.name = Block-Auswahl nach links @@ -675,9 +721,8 @@ keybind.shoot.name = Schießen keybind.zoom.name = Zoomen keybind.menu.name = Menü keybind.pause.name = Pause -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Pausieren/Fortsetzen Bauen keybind.minimap.name = Minimap -keybind.dash.name = Bindestrich keybind.chat.name = Chat keybind.player_list.name = Spielerliste keybind.console.name = Konsole @@ -700,7 +745,9 @@ mode.pvp.description = Kämpfe gegen andere Spieler lokal. mode.attack.name = Angriff mode.attack.description = Keine Wellen, das Ziel ist es die gegnerische Basis zu zerstören. mode.custom = Angepasste Regeln + rules.infiniteresources = Unbegrenzte Ressourcen +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wellen Timer rules.waves = Wellen rules.attack = Angriff-Modus @@ -708,6 +755,7 @@ rules.enemyCheat = Unbegrenzte Ressourcen für KI rules.unitdrops = Einheiten-Drops rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Spieler-Lebenspunkte Multiplikator rules.playerdamagemultiplier = Spieler-Schaden Multiplikator rules.unitdamagemultiplier = Schaden-Einheit Multiplikator @@ -726,6 +774,10 @@ rules.title.resourcesbuilding = Ressourcen & Gebäude rules.title.player = Spieler rules.title.enemy = Gegner rules.title.unit = Einheiten +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Materialien content.liquid.name = Flüssigkeiten content.unit.name = Einheiten @@ -748,7 +800,7 @@ item.pyratite.name = Pyratit item.metaglass.name = Metaglass item.scrap.name = Schrott liquid.water.name = Wasser -liquid.slag.name = Asche +liquid.slag.name = Schlacke liquid.oil.name = Öl liquid.cryofluid.name = Kryoflüssigkeit mech.alpha-mech.name = Alpha @@ -788,6 +840,7 @@ mech.buildspeed = [LIGHT_GRAY]Baugeschwindigkeit: {0}% liquid.heatcapacity = [LIGHT_GRAY]Wärmekapazität: {0} liquid.viscosity = [LIGHT_GRAY]Viskosität: {0} liquid.temperature = [LIGHT_GRAY]Temperatur: {0} + block.sand-boulder.name = Sandbrocken block.grass.name = Gras block.salt.name = Salz @@ -823,7 +876,7 @@ block.deepwater.name = Tiefes Wasser block.water.name = Wasser block.tainted-water.name = Unreines Wasser block.darksand-tainted-water.name = Dunkler Sand in unreinem Wasser -block.tar.name = Teer +block.tar.name = Öl block.stone.name = Stein block.sand.name = Sand block.darksand.name = Dunkler Sand @@ -886,6 +939,8 @@ block.distributor.name = Großer Verteiler block.sorter.name = Sortierer block.inverted-sorter.name = Inverted Sorter block.message.name = Message +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Überlauftor block.silicon-smelter.name = Silizium-Schmelzer block.phase-weaver.name = Phasenweber @@ -899,6 +954,7 @@ block.coal-centrifuge.name = Kohlenzentrifuge block.power-node.name = Stromknoten block.power-node-large.name = Großer Stromknoten block.surge-tower.name = Schwall-Turm +block.diode.name = Battery Diode block.battery.name = Batterie block.battery-large.name = Große Batterie block.combustion-generator.name = Verbrennungsgenerator @@ -922,6 +978,7 @@ block.mechanical-pump.name = Mechanische Pumpe block.item-source.name = Materialquelle block.item-void.name = Materialschlucker block.liquid-source.name = Flüssigkeitsquelle +block.liquid-void.name = Liquid Void block.power-void.name = Stromsenke block.power-source.name = Unendliche Stromquelle block.unloader.name = Entlader @@ -951,6 +1008,7 @@ block.fortress-factory.name = Fortress Mech-Fabrik block.revenant-factory.name = Revenant Fighter-Fabrik block.repair-point.name = Reparaturpunkt block.pulse-conduit.name = Impulskanal +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Phasenkanal block.liquid-router.name = Flüssigkeits-Router block.liquid-tank.name = Flüssigkeitstank @@ -1022,6 +1080,7 @@ tutorial.deposit = Materialien können in Blöcke abgelegt werden, indem du sie tutorial.waves = Der [LIGHT_GRAY]Gegner[] greift an.\n\nVerteidige deinen Kern 2 Wellen lang. Baue mehr Türme. tutorial.waves.mobile = Der[lightgray] Gegner[] greift an.\n\nVerteidige deinen Kern 2 Wellen lang. Dein Schiff feuert automatisch auf Gegner.\nBaue mehr Geschütztürme und Bohrer. Baue mehr Kupfer ab. tutorial.launch = Sobald du eine bestimmte Welle erreicht hast, kannst du die [accent]Mission abschließen[]. Dadurch lässt du deine Basis zurück[accent] und überträgst alle Ressourcen in deinen Kern.[]\nDiese Ressourcen können zur Erforschung neuer Technologien eingesetzt werden.\n\n[accent]Drücke nun den Abschluss-Button. + item.copper.description = Ein nützliches Material. Wird in allen Arten von Blöcken verwendet. item.lead.description = Ein grundlegendes Material. Häufig in Elektronik und Flüssigkeits-Transport-Blöcken verwendet. item.metaglass.description = Eine extrem harte Glasmischung. Wird zur Verteilung und Lagerung von Flüssigkeiten benutzt. @@ -1083,6 +1142,7 @@ block.power-source.description = Erzeugt unendlich viel Strom. Nur im Sandkasten block.item-source.description = Produziert unendlich items. Nur im Sandkasten-Modus verfügbar. block.item-void.description = Zerstört Materialien, die hereingegeben werden, ohne Strom zu verbrauchen. Nur im Sandkasten-Modus verfügbar. block.liquid-source.description = Produziert unendlich Flüssigkeiten. Nur im Sandkasten-Modus verfügbar. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = Ein günstiger Verteidigungsblock.\nNützlich, um die Basis und Türme in den ersten Wellen zu beschützen. block.copper-wall-large.description = Ein günstiger Verteidigungsblock.\nNützlich, um die Basis und Türme in den ersten Wellen zu beschützen.\nBenötigt mehrere Kacheln. block.titanium-wall.description = Ein mittel starker Verteidigungsblock.\nBietet mäßigen Schutz vor Feinden. @@ -1118,6 +1178,7 @@ block.rotary-pump.description = Eine fortgeschrittene Pumpe, die mithilfe von St block.thermal-pump.description = Die ultimative Pumpe, dreimal so schnell wie eine mechanische Pumpe und die einzige Pumpe, die Lava fördern kann. block.conduit.description = Standard Flüssigkeits-Transportblock. Funktioniert wie ein Förderband, nur für Flüssigkeiten. Wird am Besten mit Extraktoren, Pumpen oder anderen Kanälen benutzt. block.pulse-conduit.description = Verbesserter Flüssigkeits-Transportblock. Transportiert Flüssigkeiten schneller und speichert mehr als Standard Kanäle. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Akzeptiert Flüssigkeiten aus einer Richtung und verteilt sie an bis zu drei andere Richtungen weiter. Nützlich, um Flüssigkeiten aus einer Quelle an mehrere Empfänger zu verteilen. block.liquid-tank.description = Speichert eine große Menge an Flüssigkeiten. Verwende es als Puffer, wenn Angebot und Nachfrage an einer Flüssigkeit schwanken. block.liquid-junction.description = Fungiert als Brücke über zwei kreuzende Kanäle. Nützlich in Situationen, in denen sich zwei Kanäle mit verschiedenen Flüssigkeiten kreuzen. @@ -1126,6 +1187,7 @@ block.phase-conduit.description = Verbesserter Flüssigkeits-Transportblock. Ver block.power-node.description = Überträgt Strom zu verbundenen Knoten. Bis zu vier Stromquellen, -verbraucher oder -knoten können verbunden werden. Der Knoten erhält Strom von benachbarten Knoten und gibt Strom an benachbarte Blöcke weiter. block.power-node-large.description = Hat einen größeren Radius als der normale Stromknoten und verbindet bis zu sechs Stromquellen, -verbraucher oder -knoten. block.surge-tower.description = Ein extrem weitreichender Netzknoten mit weniger verfügbaren Verbindungen. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Speichert Strom, solange ein Überschuss besteht, und gibt ihn bei Knappheit ab, solange Kapazität vorhanden ist. block.battery-large.description = Speichert sehr viel mehr Strom als eine normale Batterie. block.combustion-generator.description = Generiert Strom, indem Öl oder entzündliche Materialien verbrannt werden. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 38f9696ea3..602e48455c 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -10,36 +10,49 @@ link.dev-builds.description = Versiones de desarrollo inestables link.trello.description = Tablero de Trello oficial para las características planificadas link.itch.io.description = itch.io es la página donde podes descargar las versiones para PC y web link.google-play.description = Ficha en la Google Play Store +link.f-droid.description = F-Droid listado del catálogo link.wiki.description = Wiki oficial de Mindustry +link.feathub.description = Sugerir nuevas funciones linkfail = ¡Error al abrir el enlace!\nLa URL ha sido copiada a su portapapeles. screenshot = Captura de pantalla guardada en {0} screenshot.invalid = Mapa demasiado grande, no hay suficiente memoria para la captura de pantalla. gameover = Tu núcleo ha sido destruido. gameover.pvp = ¡El equipo[accent] {0}[] ha ganado! highscore = [accent]¡Nueva mejor puntuación! -copied = Copied. +copied = Copiado. + load.sound = Sonidos load.map = Mapas load.image = Imágenes load.content = Contenido load.system = Sistema load.mod = Mods -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. -schematic.delete.confirm = This schematic will be utterly eradicated. -schematic.rename = Rename Schematic -schematic.info = {0}x{1}, {2} blocks +load.scripts = Scripts + +be.update = Una nueva versión de Bleeding Edge está disponible: +be.update.confirm = Descargar y reiniciar ahora? +be.updating = Actualizando... +be.ignore = Ignorar +be.noupdates = No se encontraron actualizaciones. +be.check = Revisando actualizaciones + +schematic = Esquemático +schematic.add = Guardada esquemática... +schematics = Esquemáticas +schematic.replace = Una esquemática con ese nombre ya existe. ¿Deseas remplazarlo? +schematic.import = Importar esquemática... +schematic.exportfile = Exportar archivo +schematic.importfile = Importar archivo +schematic.browseworkshop = Buscar en el taller +schematic.copy = Copiar al portapapeles. +schematic.copy.import = Importar desde el portapapeles. +schematic.shareworkshop = Compartir en la Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar esquemática +schematic.saved = Esquemática guardada. +schematic.delete.confirm = Esta esquemática será completamente erradicado. +schematic.rename = Renombrar esquemática +schematic.info = {0}x{1}, {2} bloques + stat.wave = Oleadas Derrotadas:[accent] {0} stat.enemiesDestroyed = Enemigos Destruidos:[accent] {0} stat.built = Estructuras Construidas:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = Estructuras Destruidas:[accent] {0} stat.deconstructed = Estructuras Desconstruidas:[accent] {0} stat.delivered = Recursos Lanzados: stat.rank = Rango final: [accent]{0} + launcheditems = [accent]Recursos Lanzados launchinfo = [unlaunched][[LAUNCH] tu núcleo core obtenga los objetos indicados en azul. map.delete = ¿Estás seguro que quieres borrar el mapa "[accent]{0}[]"? @@ -64,7 +78,7 @@ customgame = Partida personalizada newgame = Nueva Partida none = minimap = Minimapa -position = Position +position = Posición close = Cerrar website = Sitio web quit = Salir @@ -74,36 +88,45 @@ maps.browse = Navegar por los Mapas continue = Continuar maps.none = [LIGHT_GRAY]¡No se han encontrado mapas! invalid = Invalido -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes +pickcolor = Pick Color +preparingconfig = Preparando Configuración +preparingcontent = Preparando Contenido +uploadingcontent = Subiendo Contenido +uploadingpreviewfile = Subiendo Archivo de Vista Previa +committingchanges = Cometiendo Cambios done = Hecho -feature.unsupported = Your device does not support this feature. -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. +feature.unsupported = Tu dispositivo no soporta esta función. + +mods.alphainfo = Ten en cuenta que los mods estan en versión Alpha, y[scarlet] pueden tener varios problemas[].\nReporta cualquier error que encuentres en la página de GitHub de Mindustry o Discord. mods.alpha = [accent](Alpha) mods = Mods -mods.none = [LIGHT_GRAY]No mods found! -mods.guide = Modding Guide -mods.report = Report Bug -mods.openfolder = Open Mod Folder -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = Disable -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -mod.enable = Enable -mod.requiresrestart = The game will now close to apply the mod changes. -mod.reloadrequired = [scarlet]Reload Required -mod.import = Import Mod -mod.import.github = Import GitHub Mod -mod.remove.confirm = This mod will be deleted. -mod.author = [LIGHT_GRAY]Author:[] {0} -mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mods.none = [LIGHT_GRAY]No se encontraron Mods! +mods.guide = Guia de Modding +mods.report = Reportar Error +mods.openfolder = Abrir carpeta de mods +mod.enabled = [lightgray]Activado +mod.disabled = [scarlet]Desactivado +mod.disable = Desactivar +mod.delete.error = Fallo al elminar el mod. Quizás el archivo esta en uso. +mod.requiresversion = [scarlet]Requiere mínima versión del juego: [accent]{0} +mod.missingdependencies = [scarlet]Dependencias faltantes: {0} +mod.erroredcontent = [scarlet]Errores de contenido +mod.errors = Ocurrieron fallos al cargar el contenido. +mod.noerrorplay = [scarlet]Tienes mods con fallos.[]Deshabilita las modificaciones afectadas o arregla los errores antes de jugar. +mod.nowdisabled = [scarlet]Al/Los Mod/s '{0}'le esta/n faltando dependencias:[accent] {1}\n[lightgray]Estos mods necesitan descargarse primero.\nEste mod será automaticamente desactivado. +mod.enable = Activar +mod.requiresrestart = El juego se cerrará para aplicar los mods. +mod.reloadrequired = [scarlet]Se requiere actualizar +mod.import = Importar mod +mod.import.github = Importar Mod de Github +mod.item.remove = Este objeto es parte del[accent] '{0}'[] mod. Para removerlo, desisntala ese mod. +mod.remove.confirm = Este mod va a ser eliminado.\n¿Quieres continuar? +mod.author = [LIGHT_GRAY]Autor:[] {0} +mod.missing = Este guardado contiene modificaciones que has actualizado recientemente o que ya no has instalado. Guardar corrupción puede ocurrir. ¿Estás seguro de que quieres cargarlo?\n[lightgray]Mods:\n{0} +mod.preview.missing = Antes de publicar este mod en el taller, debe agregar una vista previa de la imagen.\nColoque una imagen llamada[accent] preview.png[] en la carpeta del mod e intente nuevamente. +mod.folder.missing = Solo las modificaciones en forma de carpeta se pueden publicar en el taller.\nPara convertir cualquier mod en una carpeta, simplemente descomprima su archivo en una carpeta y elimine el zip anterior, luego reinicie su juego o vuelva a cargar sus mods. +mod.scripts.unsupported = Su dispositivo no admite scripts mod. Algunas modificaciones no funcionarán correctamente. + about.button = Acerca de name = Nombre: noname = Elige un[accent] nombre de jugador[] primero. @@ -118,31 +141,32 @@ players = {0} jugadores online players.single = {0} jugador online server.closing = [accent]Cerrando servidor... server.kicked.kick = ¡Has sido expulsado del servidor! -server.kicked.whitelist = You are not whitelisted here. +server.kicked.whitelist = No estas en la lista blanca aqui. server.kicked.serverClose = El servidor ha cerrado. -server.kicked.vote = You have been vote-kicked. Goodbye. +server.kicked.vote = Te han expulsado por voto. Adiós! server.kicked.clientOutdated = ¡Cliente desactualizado! ¡Actualiza tu juego! server.kicked.serverOutdated = ¡Servidor desactualizado! ¡Pídele al anfitrión que lo actualice! -server.kicked.banned = Has sido baneado del servidor. -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.banned = Has sido expulsado del servidor. +server.kicked.typeMismatch = Este servidor no es compatible con su tipo de compilación. +server.kicked.playerLimit = Este servidor está lleno. Espera un espacio vacío. server.kicked.recentKick = Has sido expulsado recientemente.\nEspera para poder conectarte de nuevo. server.kicked.nameInUse = Ya hay alguien con ese\nnombre en el servidor. server.kicked.nameEmpty = Tu nombre debe por lo menos contener un carácter o número. server.kicked.idInUse = ¡Ya estás en el servidor! Conectarse con dos cuentas no está permitido. server.kicked.customClient = Este servidor no soporta versiones personalizadas. Descarga una versión oficial. server.kicked.gameover = ¡Fin del juego! -server.versions = Your version:[accent] {0}[]\nVersión del servidor:[accent] {1}[] -host.info = El botón [accent]host[] hostea un servidor en el puerto [scarlet]6567[]. \nCualquier persona en la misma [LIGHT_GRAY]wifi o red local[] debería poder ver tu servidor en la lista de servidores.\n\nSi quieres que cualquier persona se pueda conectar de cualquier lugar por IP, la [accent]asignación de puertos[] es requerida.\n\n[LIGHT_GRAY]Nota: Si alguien experimenta problemas conectándose a tu partida LAN, asegúrate de permitir a Mindustry acceso a tu red local mediante la configuración de tu firewall. +server.kicked.serverRestarting = Se esta reiniciando el servidor. +server.versions = Tu versión:[accent] {0}[]\nVersión del servidor:[accent] {1}[] +host.info = El botón [accent]host[] crea un servidor en el puerto [scarlet]6567[]. \nCualquier persona en la misma [LIGHT_GRAY]wifi o red local[] debería poder ver tu servidor en la lista de servidores.\n\nSi quieres que cualquier persona se pueda conectar de cualquier lugar por IP, la [accent]asignación de puertos[] es requerida.\n\n[LIGHT_GRAY]Nota: Si alguien experimenta problemas conectándose a tu partida LAN, asegúrate de permitir a Mindustry acceso a tu red local mediante la configuración de tu firewall. join.info = Aquí, puedes escribir la [accent]IP de un server[] para conectarte, o descubrir servidores de [accent]red local[] para conectarte.\nLAN y WAN es soportado para jugar en multijugador.\n\n[LIGHT_GRAY]Nota: No hay una lista automática global de servidores; si quieres conectarte por IP, tendrás que preguntarle al anfitrión por la IP. -hostserver = Hostear Servidor +hostserver = Crear Servidor invitefriends = Invitar Amigos -hostserver.mobile = Hostear\nJuego +hostserver.mobile = Crear\nJuego host = Servidor hosting = [accent]Abriendo servidor... hosts.refresh = Actualizar hosts.discovering = Descubrir partidas LAN -hosts.discovering.any = Discovering games +hosts.discovering.any = Descubrir juegos server.refreshing = Actualizando servidor... hosts.none = [lightgray]¡No se han encontrado partidas LAN! host.invalid = [scarlet]No se ha podido conectar al anfitrión. @@ -150,11 +174,11 @@ trace = Rastrear Jugador trace.playername = Nombre de jugador: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID Única: [accent]{0} -trace.mobile = Mobile Client: [accent]{0} +trace.mobile = Cliente de movíl: [accent]{0} trace.modclient = Cliente Personalizado: [accent]{0} invalidid = ¡ID de cliente inválida! Envía un informe del error. -server.bans = Baneos -server.bans.none = ¡Ningún usuario ha sido baneado! +server.bans = Expulsiones +server.bans.none = ¡Ningún usuario ha sido expulsado! server.admins = Administradores server.admins.none = ¡Ningún administrador ha sido encontrado! server.add = Agregar Servidor @@ -166,7 +190,7 @@ server.version = [lightgray]Versión: {0} server.custombuild = [yellow]Versión personalizada confirmban = ¿Estás seguro de querer banear este jugador? confirmkick = ¿Estás seguro de querer expulsar este jugador? -confirmvotekick = Are you sure you want to vote-kick this player? +confirmvotekick = ¿Estás seguro de querer hechar por votación a este jugador? confirmunban = ¿Estás seguro de querer desbanear este jugador? confirmadmin = ¿Estás seguro de querer hacer administrador a este jugador? confirmunadmin = ¿Estás seguro de querer quitar los permisos de administrador a este jugador? @@ -175,7 +199,7 @@ joingame.ip = IP: disconnect = Desconectado. disconnect.error = Error en la conexión. disconnect.closed = Conexión cerrada. -disconnect.timeout = Timed out. +disconnect.timeout = Desconectado. disconnect.data = ¡Se ha fallado la carga de datos del mundo! cantconnect = No es posible unirse a la partida ([accent]{0}[]). connecting = [accent]Conectando... @@ -183,7 +207,7 @@ connecting.data = [accent]Cargando datos del mundo... server.port = Puerto: server.addressinuse = ¡La dirección ya está en uso! server.invalidport = ¡El número de puerto es invalido! -server.error = [crimson]Error hosteando el servidor: error [accent]{0} +server.error = [crimson]Error creando el servidor: error [accent]{0} save.new = Nuevo Punto de Guardado save.overwrite = ¿Estás seguro de querer sobrescribir\neste punto de guardado? overwrite = Sobrescribir @@ -216,8 +240,8 @@ save.playtime = Tiempo de juego: {0} warning = Aviso. confirm = Confirmar delete = Borrar -view.workshop = View In Workshop -workshop.listing = Edit Workshop Listing +view.workshop = Ver en el taller +workshop.listing = Editar el listado del taller ok = OK open = Abrir customize = Personalizar @@ -228,19 +252,19 @@ back = Atrás data.export = Exportar Datos data.import = Importar Datos data.exported = Datos exportados. -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. +data.invalid = Esta data del juego no es valida. +data.import.confirm = Importando los datos externos borrará[scarlet] todo[] tu progreso.\n[accent]Esto no se puede rehacer![]\n\nUna vez que los datos hayan sido importados, el juego saldrá automaticamente. 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[] acaba de tener una actualización importante.\nClásica (v3.5 build 40) guardado o mapa se han detectado. ¿Desea exportar estos archivos guardados a la carpeta de inicio de su teléfono para usarlos en la aplicación Mindustry Classic? quit.confirm = ¿Estás seguro de querer salir de la partida? quit.confirm.tutorial = ¿Estás seguro de que sabes qué estas haciendo?\nSe puede hacer el tutorial de nuevo in[accent] Ajustes->Juego->Volver a hacer tutorial.[] loading = [accent]Cargando... -reloading = [accent]Reloading Mods... +reloading = [accent]Recargando mods... saving = [accent]Guardando... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][] para impiar el plan +selectschematic = [accent][[{0}][] para seleccionar+copiar +pausebuilding = [accent][[{0}][] para pausar la construcción +resumebuilding = [scarlet][[{0}][] para resumir la construcción wave = [accent]Oleada {0} wave.waiting = Oleada en {0} wave.waveInProgress = [LIGHT_GRAY]Oleada en progreso @@ -259,18 +283,19 @@ map.nospawn = ¡Este mapa no tiene ningún núcleo en el cual pueda aparecer el map.nospawn.pvp = ¡Este mapa no tiene ningún núcleo enemigo para que aparezca el jugador! Añade un núcleo[SCARLET] red[] a este mapa en el editor. map.nospawn.attack = ¡Este mapa no tiene núcleos para que el jugador ataque! Añade núcleos[SCARLET] red[] a este mapa en el editor. map.invalid = Error cargando el mapa: archivo corrupto o inválido. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {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! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): -eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +workshop.update = Actualizar artículo +workshop.error = Error al obtener detalles del taller: {0} +map.publish.confirm = ¿Estás seguro de que deseas publicar este mapa?\n\n[lightgray]¡Asegúrese de aceptar primero el EULA del taller, o sus mapas no aparecerán! +workshop.menu = Seleccione lo que le gustaría hacer con este artículo. +workshop.info = Información del artículo +changelog = Lista de cambios (optional): +eula = EULA de Steam +missing = Este artículo ha sido movido o removido.\n[lightgray]La lista del taller ahora se ha desvinculado automáticamente. +publishing = [accent]Publicando... +publish.confirm = ¿Estás seguro de que quieres publicar esto?\n\n[lightgray]¡Asegúrese de aceptar primero el EULA del taller, o sus artículos no aparecerán! +publish.error = Error publicando el artículo: {0} +steam.error = Error al inicializar los servicios de Steam.\nError: {0} + editor.brush = Pincel editor.openin = Abrir en el Editor editor.oregen = Generación de Minerales @@ -278,14 +303,14 @@ editor.oregen.info = Generación de Minerales: editor.mapinfo = Info del Mapa editor.author = Autor: editor.description = Descripción: -editor.nodescription = A map must have a description of at least 4 characters before being published. +editor.nodescription = Un mapa debe tener una descripción de al menos 4 caracteres antes de ser publicado. editor.waves = Oleadas: editor.rules = Normas: editor.generation = Generación: editor.ingame = Editar dentro del juego -editor.publish.workshop = Publish On Workshop +editor.publish.workshop = Publicar en el taller editor.newmap = Nuevo Mapa -workshop = Workshop +workshop = Taller waves.title = Oleadas waves.remove = Borrar waves.never = @@ -305,7 +330,7 @@ editor.default = [LIGHT_GRAY] details = Detalles... edit = Editar... editor.name = Nombre: -editor.spawn = Spawn Unit +editor.spawn = Aparecer unidad editor.removeunit = Borrar Unidad editor.teams = Equipos editor.errorload = Error cargando el archivo:\n[accent]{0} @@ -345,8 +370,9 @@ editor.resizemap = Cambiar Tamaño del Mapa editor.mapname = Nombre del Mapa: editor.overwrite = [accent]¡Advertencia!\nEsto sobrescribe un mapa ya existente. editor.overwrite.confirm = [scarlet]¡Advertencia![] Un mapa con ese nombre ya existe. ¿Estás seguro de querer sobrescribirlo? -editor.exists = A map with this name already exists. +editor.exists = Un mapa con estre nombre ya existe. editor.selectmap = Selecciona un mapa para cargar: + toolmode.replace = Sustituir toolmode.replace.description = Solo dibuja en bloques sólidos. toolmode.replaceall = Sustituir Todo @@ -361,15 +387,16 @@ toolmode.fillteams = Llenar Equipos toolmode.fillteams.description = Llena equipos en vez de bloques. toolmode.drawteams = Dibujar Equipos toolmode.drawteams.description = Dibuja equipos en vez de bloques. + filters.empty = [LIGHT_GRAY]¡No hay filtros! Añade uno con el botón de abajo. filter.distort = Distorsionar filter.noise = Ruido filter.median = Median -filter.oremedian = Ore Median +filter.oremedian = Veta Median filter.blend = Mezcla filter.defaultores = Vetas por defecto filter.ore = Vetas -filter.rivernoise = River Noise +filter.rivernoise = Ruido de rio filter.mirror = Espejo filter.clear = Despejar filter.option.ignore = Ignorar @@ -381,17 +408,18 @@ filter.option.mag = Magnitud filter.option.threshold = Umbral filter.option.circle-scale = Escala del círculo filter.option.octaves = Octaves -filter.option.falloff = Falloff +filter.option.falloff = Caída filter.option.angle = Ángulo filter.option.block = Bloque filter.option.floor = Suelo -filter.option.flooronto = Target Floor +filter.option.flooronto = Suelo objetivo filter.option.wall = Muro filter.option.ore = Veta -filter.option.floor2 = Secondary Floor -filter.option.threshold2 = Secondary Threshold +filter.option.floor2 = Piso secundario +filter.option.threshold2 = Umbral secundario filter.option.radius = Radio filter.option.percentile = Porcentaje + width = Ancho: height = Alto: menu = Menú @@ -401,19 +429,20 @@ load = Cargar save = Guardar fps = FPS: {0} ping = Ping: {0} ms -language.restart = Por favor reinicie el juego para que los cambios del lenguaje surjan efecto. +language.restart = Por favor reinicia el juego para que los cambios de idioma tengan efecto. settings = Ajustes tutorial = Tutorial tutorial.retake = Volver a hacer tutorial editor = Editor mapeditor = Editor de Mapa + abandon = Abandonar abandon.text = Esta zona y sus recursos se perderán ante el enemigo. locked = Bloqueado complete = [LIGHT_GRAY]Completado: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.wave = Alcanzar la oleada{0} en {1} +requirement.core = Destruir el núcleo enemigo en {0} +requirement.unlock = Desbloquear {0} resume = Continuar Zona:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Récord: {0} launch = Lanzar @@ -424,19 +453,20 @@ launch.confirm = Esto lanzará todos los recursos al núcleo.\nNo podrás volver launch.skip.confirm = Si saltas la oleada ahora, no podrás lanzar recursos hasta unas oleadas después. uncover = Descubrir configure = Configurar carga inicial -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Bloques prohibidos +addall = Añadir todo configure.locked = [LIGHT_GRAY]Alcanza la oleada {0}\npara configurar la carga inicial. configure.invalid = La cantidad debe estar entre 0 y {0}. zone.unlocked = [LIGHT_GRAY]{0} desbloqueado. zone.requirement.complete = Oleada {0} alcanzada:\nrequerimientos de la zona {1} cumplidos. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.config.unlocked = Carga desbloqueada:[lightgray]\n{0} zone.resources = Recursos Detectados: zone.objective = [lightgray]Objetivo: [accent]{0} zone.objective.survival = Sobrevivir zone.objective.attack = Destruir Núcleo Enemigo add = Añadir... boss.health = Salud del Jefe + connectfail = [crimson]Ha fallado la conexión con el servidor: [accent]{0} error.unreachable = Servidor inaccesible. error.invalidaddress = Dirección inválida. @@ -446,22 +476,24 @@ error.alreadyconnected = Ya estás conectado. error.mapnotfound = ¡Archivo de mapa no encontrado! error.io = Error I/O de conexión. error.any = Error de red desconocido. -error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.bloom = Error al cargar el bloom.\nPuede que tu dispositivo no soporte esta característica. + zone.groundZero.name = Terreno Cero zone.desertWastes.name = Ruinas del Desierto zone.craters.name = Los Cráteres zone.frozenForest.name = Bosque Congelado zone.ruinousShores.name = Costas Ruinosas -zone.stainedMountains.name = Stained Mountains +zone.stainedMountains.name = Montañas Manchadas zone.desolateRift.name = Grieta Desolada zone.nuclearComplex.name = Complejo de Producción Nuclear -zone.overgrowth.name = Overgrowth +zone.overgrowth.name = Crecimiento Excesivo zone.tarFields.name = Campos de Alquitrán zone.saltFlats.name = Salinas zone.impact0078.name = Impacto 0078 zone.crags.name = Riscos zone.fungalPass.name = Fungal Pass -zone.groundZero.description = La zona óptima para empear una vez más. Riesgo bajo de los enemigos. Pocos recursos.\nConsigue tanto plomo y cobre como puedas.\nSigue avanzando. + +zone.groundZero.description = La zona óptima para empezar una vez más. Riesgo bajo de los enemigos. Pocos recursos.\nConsigue tanto plomo y cobre como puedas.\nSigue avanzando. zone.frozenForest.description = Incluso aquí, cerca de las montañas, las esporas se han expandido. Las temperaturas gélidas no pueden contenerlas para siempre.\n\nEmpieza a investigar sobre energía. Cnstruye generadores de combustión. Aprende a usar reparadores. zone.desertWastes.description = Estas ruinas son vastas, impredecibles y entrecruzadas con sectores de estructuras abandonadas.\nHay carbñon presente en la región. Quémalo para energía, o sintetiza grafito.\n\n[lightgray]La zona de aparición no puede ser garantizada. zone.saltFlats.description = A las afueras del desierto se encuentran las Salinas. Pocos recursos pueden ser encontrados en esta ubicación.\n\nEl enemigo ha erigido un complejo de almacén de recursos aquí. Erradica su núcleo. No dejes nada. @@ -475,20 +507,22 @@ zone.nuclearComplex.description = Una antigua facilidad para la producción y el zone.fungalPass.description = Una zona transitoria entre alta montaña y zonas más bajas con esporas. Una base enemiga pequeña de reconocimiento se ubica aquí.\nDestrúyela.nUsa Dagas y Orugas. Destruye los dos núcleos. zone.impact0078.description = zone.crags.description = + settings.language = Idioma settings.data = Datos del Juego settings.reset = Reiniciar por los de defecto settings.rebind = Reasignar +settings.resetKey = Reiniciar settings.controls = Controles settings.game = Juego settings.sound = Sonido settings.graphics = Gráficos settings.cleardata = Limpiar Datos del Juego... -settings.clear.confirm = ¿Estas seguro de querer limpiar estos datos?\n¡Esta acción no puede deshacerse! +settings.clear.confirm = ¿Estas seguro de querer purificar estos datos?\n¡Esta acción no puede deshacerse! settings.clearall.confirm = [scarlet]ADVERTENCIA![]\nEsto va a eliminar todos tus datos, incluyendo guardados, mapas, desbloqueos y atajos de teclado.\nUna vez presiones 'ok', el juego va a borrrar todos tus datos y saldrá del juego automáticamente. paused = [accent] < Pausado > -clear = Clear -banned = [scarlet]Banned +clear = Purificar +banned = [scarlet]Baneado yes = Sí no = No info.title = [accent]Información @@ -509,7 +543,7 @@ blocks.shootrange = Rango de Disparo blocks.size = Tamaño blocks.liquidcapacity = Capacidad de Líquidos blocks.powerrange = Rango de Energía -blocks.powerconnections = Max Connections +blocks.powerconnections = Conexiones maximas blocks.poweruse = Consumo de Energía blocks.powerdamage = Energía/Daño blocks.itemcapacity = Capacidad de Objetos @@ -529,9 +563,10 @@ blocks.inaccuracy = Imprecisión blocks.shots = Disparos blocks.reload = Recarga blocks.ammo = Munición + bar.drilltierreq = Se requiere un mejor taladro. bar.drillspeed = Velocidad del Taladro: {0}/s -bar.pumpspeed = Pump Speed: {0}/s +bar.pumpspeed = Velocidad de bombeado: {0}/s bar.efficiency = Eficiencia: {0}% bar.powerbalance = Energía: {0} bar.powerstored = Almacenados: {0}/{1} @@ -544,17 +579,21 @@ bar.heat = Calor bar.power = Energía bar.progress = Progreso de construcción bar.spawned = Unidades: {0}/{1} +bar.input = Entrada +bar.output = Salida + bullet.damage = [stat]{0}[lightgray] daño bullet.splashdamage = [stat]{0}[lightgray] daño de área ~[stat] {1}[lightgray] casillas -bullet.incendiary = [stat]incendiaria -bullet.homing = [stat]homing -bullet.shock = [stat]shock -bullet.frag = [stat]frag -bullet.knockback = [stat]{0}[lightgray] knockback -bullet.freezing = [stat]freezing -bullet.tarred = [stat]tarred +bullet.incendiary = [stat]Incendiaria +bullet.homing = [stat]Rastreadora +bullet.shock = [stat]Electrizante +bullet.frag = [stat]Explosiva +bullet.knockback = [stat]{0}[lightgray]Empuje +bullet.freezing = [stat]Congelación +bullet.tarred = [stat]Relantizado bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munición bullet.reload = [stat]{0}[lightgray]x recarga + unit.blocks = bloques unit.powersecond = unidades de energía/segundo unit.liquidsecond = unidades de líquido/segundo @@ -567,6 +606,8 @@ unit.persecond = /seg unit.timesspeed = x velocidad unit.percent = % unit.items = objetos +unit.thousands = k +unit.millions = mil category.general = General category.power = Energía category.liquids = Líquidos @@ -574,22 +615,23 @@ category.items = Objetos category.crafting = Fabricación category.shooting = Disparo category.optional = Mejoras Opcionales -setting.landscape.name = Lock Landscape +setting.landscape.name = Bloquear modo paisaje setting.shadows.name = Sombras -setting.blockreplace.name = Automatic Block Suggestions -setting.linear.name = Linear Filtering -setting.hints.name = Hints +setting.blockreplace.name = Sugerir bloques al construir +setting.linear.name = Filtrado Lineal +setting.hints.name = Pistas +setting.buildautopause.name = Auto-pausar construcción setting.animatedwater.name = Agua Animada setting.animatedshields.name = Escudos Animados setting.antialias.name = Antialias[LIGHT_GRAY] (necesita reiniciar)[] setting.indicators.name = Indicadores de Aliados setting.autotarget.name = Auto apuntado setting.keyboard.name = Controles de Ratón+Teclado -setting.touchscreen.name = Touchscreen Controls +setting.touchscreen.name = Controles táctiles setting.fpscap.name = Máx FPS setting.fpscap.none = Nada setting.fpscap.text = {0} FPS -setting.uiscale.name = Escala de IU[lightgray] (necesita reiniciar)[] +setting.uiscale.name = Escala de UI[lightgray] (necesita reiniciar)[] setting.swapdiagonal.name = Siempre Colocar Diagonalmente setting.difficulty.training = entrenamiento setting.difficulty.easy = fácil @@ -599,15 +641,19 @@ setting.difficulty.insane = locura setting.difficulty.name = Dificultad: setting.screenshake.name = Movimiento de la Pantalla setting.effects.name = Mostrar Efectos -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = Mostrar bloques destruidos +setting.conveyorpathfinding.name = Colocación del transportador en búsqueda de caminos +setting.coreselect.name = Permitir núcleos esquemáticos setting.sensitivity.name = Sensibilidad del Control setting.saveinterval.name = Intervalo del Autoguardado setting.seconds = {0} Segundos +setting.blockselecttimeout.name = Tiempo de espera de selección de bloque +setting.milliseconds = {0} milisegundos setting.fullscreen.name = Pantalla Completa setting.borderlesswindow.name = Ventana sin Bordes[LIGHT_GRAY] (podría requerir un reinicio) setting.fps.name = Mostrar FPS -setting.vsync.name = SincV +setting.blockselectkeys.name = Mostrar teclas de selección de bloque +setting.vsync.name = Vsync (Limita los fps a los Hz de tu pantalla) setting.pixelate.name = Pixelar [LIGHT_GRAY](podría reducir el rendimiento) setting.minimap.name = Mostrar Minimapa setting.position.name = Show Player Position @@ -617,70 +663,91 @@ setting.mutemusic.name = Silenciar Musica setting.sfxvol.name = Volumen de los efectos de sonido setting.mutesound.name = Silenciar Sonido setting.crashreport.name = Enviar informes de fallos anónimos -setting.savecreate.name = Auto-Create Saves -setting.publichost.name = Public Game Visibility +setting.savecreate.name = Crear puntos de guardado automáticamente +setting.publichost.name = Visibilidad del juego público setting.chatopacity.name = Opacidad del Chat -setting.lasersopacity.name = Power Laser Opacity -setting.playerchat.name = Display In-Game Chat -public.confirm = Do you want to make your game public?\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. -uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... +setting.lasersopacity.name = Opacidad de los rayos láser +setting.playerchat.name = Mostrar el chat in-game +public.confirm = ¿Quieres hacer público tu juego?\n[lightgray]Esto se puede cambiar más tarde en Configuración->Juego->Visibilidad pública del juego. +public.beta = Recuerda que en las versiones beta del juego no puedes crear partidas públicas. +uiscale.reset = La escala de la interfaz ha sido modificada con éxito.\nPulsa "OK" para conservar esta escala.\n[scarlet]Deshaciendo los cambios y saliendo al menu en [accent] {0}[]segundos... uiscale.cancel = Cancelar & Salir -setting.bloom.name = Bloom +setting.bloom.name = Brillo keybind.title = Cambiar accesos de teclado -keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. +keybinds.mobile = [scarlet]Los accesos del teclado aquí mostrados no estan disponible en Móviles o Tablets. Solo aceptan movimiento básico. category.general.name = General category.view.name = Visión category.multiplayer.name = Multijugador command.attack = Atacar -command.rally = Rally +command.rally = Patrullar command.retreat = Retirarse -keybind.clear_building.name = Clear Building +placement.blockselectkeys = \n[lightgray]Key: [{0}, +keybind.clear_building.name = Limpiar construcción keybind.press = Presiona una tecla... keybind.press.axis = Pulsa un eje o botón... keybind.screenshot.name = Captura de pantalla de Mapa +keybind.toggle_power_lines.name = Activar láser de potencia keybind.move_x.name = Mover x keybind.move_y.name = Mover y -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.mouse_move.name = Seguír al ratón +keybind.dash.name = Correr +keybind.schematic_select.name = Seleccionar región +keybind.schematic_menu.name = Menu de esquémas +keybind.schematic_flip_x.name = Girar esquemática desde X +keybind.schematic_flip_y.name = Girar esquemática desde Y +keybind.category_prev.name = Categoría anterior +keybind.category_next.name = Siguiente categoría +keybind.block_select_left.name = Seleccionar bloque a la izquierda +keybind.block_select_right.name = Seleccionar bloque a la derecha +keybind.block_select_up.name = Seleccionar bloque hacia arriba +keybind.block_select_down.name = Seleccionar bloque hacia abajo +keybind.block_select_01.name = Seleccionar categoría / bloque 1 +keybind.block_select_02.name = Seleccionar categoría / bloque 2 +keybind.block_select_03.name = Seleccionar categoría / bloque 3 +keybind.block_select_04.name = Seleccionar categoría / bloque 4 +keybind.block_select_05.name = Seleccionar categoría / bloque 5 +keybind.block_select_06.name = Seleccionar categoría / bloque 6 +keybind.block_select_07.name = Seleccionar categoría / bloque 7 +keybind.block_select_08.name = Seleccionar categoría / bloque 8 +keybind.block_select_09.name = Seleccionar categoría / bloque 9 +keybind.block_select_10.name = Seleccionar categoría / bloque 10 keybind.fullscreen.name = Intercambiar con Pantalla Completa keybind.select.name = Seleccionar keybind.diagonal_placement.name = Construcción Diagonal -keybind.pick.name = Pick Block +keybind.pick.name = Elegir bloque keybind.break_block.name = Destruir Bloque keybind.deselect.name = Deseleccionar keybind.shoot.name = Disparar keybind.zoom.name = Zoom keybind.menu.name = Menú keybind.pause.name = Pausa -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Pausar/Resumir construcción keybind.minimap.name = Minimapa -keybind.dash.name = Correr keybind.chat.name = Chat keybind.player_list.name = Lista de jugadores keybind.console.name = Consola keybind.rotate.name = Rotar -keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.rotateplaced.name = Rotar existente (mantener) keybind.toggle_menus.name = Alternar menús keybind.chat_history_prev.name = Historial de chat anterior keybind.chat_history_next.name = Historial de chat siguiente -keybind.chat_scroll.name = Chat scroll -keybind.drop_unit.name = drop unit +keybind.chat_scroll.name = Desplazamiento de chat +keybind.drop_unit.name = Caida de la unidad keybind.zoom_minimap.name = Zoom minimapa mode.help.title = Descripción de modos mode.survival.name = Supervivencia mode.survival.description = El modo normal. Recursos limitados y oleadas automáticas. -mode.sandbox.name = Sandbox +mode.sandbox.name = Caja de arena mode.sandbox.description = Recursos ilimitados y sin temporizador para las oleadas. mode.editor.name = Editor -mode.pvp.name = PvP +mode.pvp.name = JcJ mode.pvp.description = Pelea contra otros jugadores localmente. mode.attack.name = Ataque mode.attack.description = No hay oleadas, el objetivo es destruir la base enemiga. mode.custom = Normas personalizadas + rules.infiniteresources = Recursos Infinitos +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Temportzador de Oleadas rules.waves = Oleadas rules.attack = Modo de Ataque @@ -688,16 +755,17 @@ rules.enemyCheat = Recursos infinitos de la IA rules.unitdrops = REcursos de las Unidades rules.unitbuildspeedmultiplier = Multiplicador de velocidad de creación de unidades rules.unithealthmultiplier = Multiplicador de la vida de las unidades +rules.blockhealthmultiplier = Multiplicador de salud de bloque rules.playerhealthmultiplier = Multiplicador de la vida del jugador rules.playerdamagemultiplier = Multiplicador del daño del jugador rules.unitdamagemultiplier = Multiplicador del daño de unidades rules.enemycorebuildradius = Radio de No-Construcción del Núcleo Enemigo:[LIGHT_GRAY] (casillas) -rules.respawntime = Tiempo de reaparición:[LIGHT_GRAY] (sec) -rules.wavespacing = Tiempo entre oleadas:[LIGHT_GRAY] (sec) +rules.respawntime = Tiempo de reaparición:[LIGHT_GRAY] (seg) +rules.wavespacing = Tiempo entre oleadas:[LIGHT_GRAY] (seg) rules.buildcostmultiplier = Multiplicador de coste de construcción rules.buildspeedmultiplier = Multiplicador de velocidad de construcción rules.waitForWaveToEnd = Las oleadas esperan a los enemigos -rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles) +rules.dropzoneradius = Radio de zona de caída:[LIGHT_GRAY] (casillas) rules.respawns = Reapariciones máximas por oleada rules.limitedRespawns = Límite de reapariciones rules.title.waves = Oleadas @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = Recursos y Construcción rules.title.player = Jugadores rules.title.enemy = Enemigos rules.title.unit = Unidades +rules.title.experimental = Experimental +rules.lighting = Iluminación +rules.ambientlight = Iluminación ambiental + content.item.name = Objetos content.liquid.name = Líquidos content.unit.name = Unidades @@ -717,18 +789,18 @@ item.coal.name = Carbón item.graphite.name = Grafito item.titanium.name = Titanio item.thorium.name = Torio -item.silicon.name = Silicio +item.silicon.name = Silicona item.plastanium.name = Plastanio item.phase-fabric.name = Tejido de fase item.surge-alloy.name = Aleación Eléctrica -item.spore-pod.name = Spore Pod +item.spore-pod.name = Vaina de esporas item.sand.name = Arena item.blast-compound.name = Compuesto Explosivo item.pyratite.name = Pirotita item.metaglass.name = Metacristal item.scrap.name = Chatarra liquid.water.name = Agua -liquid.slag.name = Escoria +liquid.slag.name = Fundido liquid.oil.name = Petróleo liquid.cryofluid.name = Criogénico mech.alpha-mech.name = Alpha @@ -749,9 +821,10 @@ mech.javelin-ship.name = Jabalina mech.javelin-ship.weapon = Ráfaga de misiles mech.javelin-ship.ability = Potenciador de descarga mech.trident-ship.name = Tridente -mech.trident-ship.weapon = Bomb Bay +mech.trident-ship.weapon = Bahía de bombardeo mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Repetidor de Llamas +item.corestorable = [lightgray]Guardable en el núcleo: {0} item.explosiveness = [LIGHT_GRAY]Explosividad: {0} item.flammability = [LIGHT_GRAY]Inflamabilidad: {0} item.radioactivity = [LIGHT_GRAY]Radioactividad: {0} @@ -762,23 +835,24 @@ mech.health = [LIGHT_GRAY]Vida: {0} mech.itemcapacity = [LIGHT_GRAY]Capacidad de objetos: {0} mech.minespeed = [LIGHT_GRAY]Velocidad de minado: {0} mech.minepower = [LIGHT_GRAY]Potencia de minado: {0} -mech.ability = [LIGHT_GRAY]Hablidad: {0} +mech.ability = [LIGHT_GRAY]Habilidad: {0} mech.buildspeed = [LIGHT_GRAY]Velocidad de Construcción: {0}% liquid.heatcapacity = [LIGHT_GRAY]Capacidad Térmica: {0} liquid.viscosity = [LIGHT_GRAY]Viscosidad: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} + block.sand-boulder.name = Piedra de Arena block.grass.name = Hierba block.salt.name = Sal block.saltrocks.name = Rocas de Sal -block.pebbles.name = Pebbles -block.tendrils.name = Tendrils +block.pebbles.name = Guijarros +block.tendrils.name = Zarcillos block.sandrocks.name = Rocas de arena -block.spore-pine.name = Spore Pine +block.spore-pine.name = Pino de esporas block.sporerocks.name = Rocas de espora block.rock.name = Roca -block.snowrock.name = Snow Rock -block.snow-pine.name = Snow Pine +block.snowrock.name = Roca de nieve +block.snow-pine.name = Pino de nieve block.shale.name = Pizarra block.shale-boulder.name = Piedra de Pizarra block.moss.name = Musgo @@ -789,7 +863,7 @@ block.scrap-wall.name = Muro de Chatarra block.scrap-wall-large.name = Muro de Chatarra grande block.scrap-wall-huge.name = Muro de Chatarra muy grande block.scrap-wall-gigantic.name = Muro de Chatarra gigante -block.thruster.name = Thruster +block.thruster.name = Propulsor block.kiln.name = Horno block.graphite-press.name = Prensa de grafito block.multi-press.name = Multi-Prensa @@ -797,11 +871,11 @@ block.constructing = {0}\n[LIGHT_GRAY](Construyendo) block.spawn.name = Punto de generación block.core-shard.name = Núcleo: Fragmento block.core-foundation.name = Núcleo: Fundación -block.core-nucleus.name = Núcleo: Nucleus +block.core-nucleus.name = Núcleo: Núcleo block.deepwater.name = Aguas profundas block.water.name = Agua block.tainted-water.name = Agua Contaminada -block.darksand-tainted-water.name = Dark Sand Tainted Water +block.darksand-tainted-water.name = Agua Contaminada con Arena Oscura block.tar.name = Alquitrán block.stone.name = Piedra block.sand.name = Arena @@ -809,10 +883,10 @@ block.darksand.name = Arena Oscura block.ice.name = Hielo block.snow.name = Nieve block.craters.name = Cráteres -block.sand-water.name = Arena Agua -block.darksand-water.name = Agua Arena Oscura -block.char.name = Char -block.holostone.name = Holo stone +block.sand-water.name = Agua con Arena +block.darksand-water.name = Agua con Arena Oscura +block.char.name = Charbonizado +block.holostone.name = Piedra hologramatica block.ice-snow.name = Hielo Nieve block.rocks.name = Rocas block.icerocks.name = Rocas de hielo @@ -834,7 +908,7 @@ block.dark-panel-4.name = Panel Oscuro 4 block.dark-panel-5.name = Panel Oscuro 5 block.dark-panel-6.name = Panel Oscuro 6 block.dark-metal.name = Metal Oscuro -block.ignarock.name = Roca Igna +block.ignarock.name = Roca Ignea block.hotrock.name = Roca Caliente block.magmarock.name = Roca de Magma block.cliffs.name = Acantilados @@ -842,8 +916,8 @@ block.copper-wall.name = Muro de Cobre block.copper-wall-large.name = Muro de Cobre grande block.titanium-wall.name = Muro de Titanio block.titanium-wall-large.name = Muro de Titanio grande -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall +block.plastanium-wall.name = Muro de Plastanio +block.plastanium-wall-large.name = Muro de Plastanio grande block.phase-wall.name = Muro de Fase grande block.phase-wall-large.name = Muro de Fase grande block.thorium-wall.name = Pared de Torio @@ -851,22 +925,24 @@ block.thorium-wall-large.name = Muro de Torio grande block.door.name = Puerta block.door-large.name = Puerta Grande block.duo.name = Dúo -block.scorch.name = Scorch +block.scorch.name = Quemador block.scatter.name = Scatter block.hail.name = Granizo block.lancer.name = Lancero block.conveyor.name = Cinta Transportadora block.titanium-conveyor.name = Cinta Transportadora de Titanio -block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors. +block.armored-conveyor.name = Cinta Transportadora Acorazada +block.armored-conveyor.description = Mueve items a la misma veolcidad que una cinta de titanio, pero tiene mas armadura. No acepta entradas por los lados a menos que sean lineas transportadoras. block.junction.name = Cruce block.router.name = Enrutador block.distributor.name = Distribuidor block.sorter.name = Clasificador -block.inverted-sorter.name = Inverted Sorter -block.message.name = Message +block.inverted-sorter.name = Clasificador Invertido +block.message.name = Mensaje +block.illuminator.name = Iluminador +block.illuminator.description = Una fuente de luz pequeña, compacta y configurable. Requiere poder para funcionar. block.overflow-gate.name = Compuerta de Desborde -block.silicon-smelter.name = Horno para Silicio +block.silicon-smelter.name = Horno para Silicona block.phase-weaver.name = Tejedor de Fase block.pulverizer.name = Pulverizador block.cryofluidmixer.name = Mezclador de Criogénicos @@ -877,7 +953,8 @@ block.separator.name = Separador block.coal-centrifuge.name = Centrifugador de Carbón block.power-node.name = Nodo de Energía block.power-node-large.name = Nodo de Energía Grande -block.surge-tower.name = Surge Tower +block.surge-tower.name = Torre de sobretensión +block.diode.name = Diodo de batería block.battery.name = Batería block.battery-large.name = Batería Grande block.combustion-generator.name = Generador de Combustión @@ -889,7 +966,7 @@ block.pneumatic-drill.name = Taladro neumático block.laser-drill.name = Taladro Láser block.water-extractor.name = Extractor de Agua block.cultivator.name = Cultivador -block.dart-mech-pad.name = Pad de mecanoide Dart +block.dart-mech-pad.name = Pad de mecanoide Dardo block.delta-mech-pad.name = Pad de mecanoide Delta block.javelin-ship-pad.name = Pad de nave Jabalina block.trident-ship-pad.name = Pad de nave Tridente @@ -901,6 +978,7 @@ block.mechanical-pump.name = Bomba Mecánica block.item-source.name = Fuente de objetos block.item-void.name = Vacío de objetos block.liquid-source.name = Fuente de líquidos +block.liquid-void.name = Vacío de líquidos block.power-void.name = Vacío de energía block.power-source.name = Energía Infinita block.unloader.name = Descargador @@ -917,19 +995,20 @@ block.blast-mixer.name = Mezclador de Explosivos block.solar-panel.name = Panel Solar block.solar-panel-large.name = Panel Solar Grande block.oil-extractor.name = Extractor de Petróleo -block.command-center.name = Command Center -block.draug-factory.name = Fábrica de Drones Mineros Draug +block.command-center.name = Centro de Comando +block.draug-factory.name = Fábrica de Drones Mineros Primitivos block.spirit-factory.name = Fábrica de Drones Espíritu block.phantom-factory.name = Fábrica de Drones Fantasmales -block.wraith-factory.name = Fábrica de Wraith Fighter -block.ghoul-factory.name = Fábrica de Ghoul Bomber -block.dagger-factory.name = Fábrica de mecanoide Daga -block.crawler-factory.name = Fábrica de mecanoide Oruga -block.titan-factory.name = Fábrica de mecanoide Titán -block.fortress-factory.name = Fábrica de mecanoide Fortress -block.revenant-factory.name = Fábrica de Revenant Fighter +block.wraith-factory.name = Fábrica de Peleador Infernal +block.ghoul-factory.name = Fábrica de Bombardero Fantasmal +block.dagger-factory.name = Fábrica de Mecanoide Daga +block.crawler-factory.name = Fábrica de Mecanoide Oruga +block.titan-factory.name = Fábrica de Mecanoide Titán +block.fortress-factory.name = Fábrica de Mecanoide Fortress +block.revenant-factory.name = Fábrica de Peleador Revenante block.repair-point.name = Punto de Reparación block.pulse-conduit.name = Conducto de Pulso +block.plated-conduit.name = Conducto Chapado block.phase-conduit.name = Conducto de Fase block.liquid-router.name = Enrutador de Líquidos block.liquid-tank.name = Tanque de Líquidos @@ -941,23 +1020,23 @@ block.mass-driver.name = Teletransportador Masivo block.blast-drill.name = Taladro de explosión block.thermal-pump.name = Bomba Térmica block.thermal-generator.name = Generador Térmico -block.alloy-smelter.name = Alloy Smelter +block.alloy-smelter.name = Fundidor de Materia block.mender.name = Reparador block.mend-projector.name = Proyector de reparación -block.surge-wall.name = Muro de Surge -block.surge-wall-large.name = Muro de Surge grande +block.surge-wall.name = Muro de Sobretensión +block.surge-wall-large.name = Muro de Sobretensión grande block.cyclone.name = Ciclón -block.fuse.name = Fuse -block.shock-mine.name = Mina Shock +block.fuse.name = Fusible +block.shock-mine.name = Mina electrizante block.overdrive-projector.name = Proyector de sobremarcha block.force-projector.name = Proyector de fuerza block.arc.name = Arco block.rtg-generator.name = Generador RTG block.spectre.name = Espectro -block.meltdown.name = Meltdown +block.meltdown.name = Fusión de Reactor block.container.name = Contenedor block.launch-pad.name = Pad de Lanzamiento -block.launch-pad-large.name = Pad de Lanzammiento Grande +block.launch-pad-large.name = Pad de Lanzamiento Grande team.blue.name = Azul team.crux.name = rojo team.sharded.name = naranja @@ -966,32 +1045,32 @@ team.derelict.name = derelict team.green.name = Verde team.purple.name = Púrpura unit.spirit.name = Dron Espíritu -unit.draug.name = Dron Minero Draug +unit.draug.name = Dron Minero Primitivo unit.phantom.name = Dron Fantasmal unit.dagger.name = Daga unit.crawler.name = Oruga unit.titan.name = Titán -unit.ghoul.name = Ghoul Bomber -unit.wraith.name = Wraith Fighter -unit.fortress.name = Fortress -unit.revenant.name = Revenant -unit.eruptor.name = Eruptor -unit.chaos-array.name = Chaos Array +unit.ghoul.name = Bombardero Fantasmal +unit.wraith.name = Peleador Infernal +unit.fortress.name = Fortaleza +unit.revenant.name = Revenante +unit.eruptor.name = Erupcionador +unit.chaos-array.name = Matriz del caos unit.eradicator.name = Erradicador unit.lich.name = Lich -unit.reaper.name = Reaper +unit.reaper.name = Segador tutorial.next = [lightgray] tutorial.intro = Has entrado en el[scarlet]Tutorial de Mindustry.[]\nComienza[accent]minando cobre[]. Toca en una veta de cobre cercana al núcleo para hacer esto.\n\n[accent]{0}/{1} cobre -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.intro.mobile = Has entrado en el[scarlet] Tutorial de Mindustry.[]\nArrastra la pantalla para moverte.\n[accent]Pellizca con 2 dedos [] para alejar y hacercar la vista.\nComienza por[accent] minar cobre[]. Muevete cerca de el, luego toque una veta de mineral de cobre cerca de su núcleo para hacer esto.\n\n[accent]{0}/{1} cobre tutorial.drill = Minar manualmente es ineficiente.\nLos [accent]taladros pueden minar automáticamente.\nColoca uno en una veta de cobre. tutorial.drill.mobile = Minar manualmente es ineficiente.\nLos [accent]Taladros[] pueden minar automáticamente.\nToca la sección de taladros el la esquina de abajo a la derecha.\nSelecciona el[accent]taladro mecánico[].\nColócalo en una veta de cobre tocándola, después pulsa el [accent]botón de confirmación de debajo para confirmar tu selección.\nPulsa el[accent]botón "X" para cancelar la construcción. tutorial.blockinfo = Cada bloque tiene diferentes estadísticas. Cada taladro solo puede minar ciertos minerales.\nPara comprobar la información y estadísticas de un bloque,[accent] toca el botón "?" mientras lo tienes seleccionado en el menú de construcción.[]\n\n[accent]Accede a las estadísticas del Taladro Mecánico ahora.[] tutorial.conveyor = Las [accent]Cintas Transportadoras[] se usan para transportar recursos al núcleo.\nConstruye una línea de transportadores del taladro al núcleo. tutorial.conveyor.mobile = Las [accent]Cintas Transportadoras[] se usan para transportar recursos al núcleo.\nConstruye una línea de transportadores del taladro al núcleo.\n[accent] Construye una línea manteniendo el dedo unos segundos[] y arrastrando hacia una dirección.\n\n[accet]{0}/{1} cintas colocadas en línea\n[ccent]]0/1 recursos transportados. tutorial.turret = Se tiene que construir estructuras defensivas para repeler el [LIGHT_GRAY]enemy[].\nConstruye una torreta dúo cerca de tu base. -tutorial.drillturret = Los dúos requieren[accent] copper ammo[]para disparar.\nColoca un taladro junto a la torre para darle cobre. +tutorial.drillturret = Los dúos requieren[accent] munición de cobre[]para disparar.\nColoca un taladro junto a la torre para darle cobre. tutorial.pause = Durante la batalla, puedes[accent]pausar el juego.[]\nPuedes dejar estructuras en cola mientras pausas.\n\n[accent]Pulsa Espacio para pausar. -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 = Durante la batalla, puedes[accent] pausar el juego.[]\nPuedes dejar estructuras en cola mientras pausas.\n\n[accent]Pulsa este boton de arriba a la izquierda para pausar. tutorial.unpause = Ahora toca Espacio otra vez para dejar de pausar. tutorial.unpause.mobile = Ahora tócalo otra vez para dejar de pausar. tutorial.breaking = Muchas veces hace falta destruir bloques.\n[accent]Mantén el botón derecho[] para destruir todos los bloques en una selección.[]\n\n[accent]Destruye todos los bloques de chatarra de la izquierda de tu núcleo usando selección de área. @@ -1001,6 +1080,7 @@ tutorial.deposit = Deposita recursos en bloques arrastrándolos de tu nave al bl tutorial.waves = El[LIGHT_GRAY] enemigo[] se acerca.\n\nDefiende tu núcleo por 2 oleadas. Construye más torretas y taladros. Mina más cobre. tutorial.waves.mobile = El[lightgray] enemigo[] se acerca.\n\nDefiende tu núcleo por 2 oleadas. Tu nave disparará automáticamente a los enemigos.\nConstruye más torretas y taladros. Mina más cobre. tutorial.launch = Una vez llegues a cierta oleada, podrás[accent]lanzar el núcleo[], dejando atrás tus defensas y los recursos en tu núcleo.[]\nEstos recursos pueden ser usados para investigar nueva tecnología.\n\n[accent]Pulsa el botón de lanzamiento. + item.copper.description = Un útil material estructural. Usado extensivamente en todo tipo de bloques. item.lead.description = Un material básico. Usado extensivamente en electrónicos y bloques de transferencia de líquidos. item.metaglass.description = Un compuesto muy duro de cristal. Usado extensivamente para almacenamiento y distribución de líquidos. @@ -1030,7 +1110,7 @@ mech.javelin-ship.description = Una nave de ataque y retirada. Aunque inicialmen mech.trident-ship.description = Un bombardero pesado. Razonablemente bien equipado. mech.glaive-ship.description = Una nave pistolera grande y bien armada. Equipada con un repetidor incendiario. Buena aceleración y velocidad máxima. unit.draug.description = Un dron minero primitivo. Barato de producir. Reciclable. Mina cobre y plomo cercanos automáticamente. Transporta los recursos minados al núcleo más cercano. -unit.spirit.description = Un dron draug modificaado, diseñado para reparar en vez de minar. Repara automáticamente cualquier bloque dañado en la zona. +unit.spirit.description = Un dron minero primitivo modificado, diseñado para reparar en vez de minar. Repara automáticamente cualquier bloque dañado en la zona. unit.phantom.description = Un dron avanzado. Mina automáticamente minerales, recoge objetos y repra bloques. Bastante más efectivo que un dron normal. unit.dagger.description = Una unidad terrestre. Útil con enjambres. unit.crawler.description = Una unidad terrestre que consiste en un marco desmontado con una gran cantidad de explosivos en la parte superior. No es muy duradero. Explota en contacto enemigo. @@ -1040,14 +1120,14 @@ unit.eruptor.description = Un mecanoide pesado diseñado para destruir estructur unit.wraith.description = Una unidad interceptora rápida. unit.ghoul.description = Una unidad bombardera pesada. Usa compuesto explosivo o pirotita como munición. unit.revenant.description = Una unidad aérea pesada con misiles. -block.message.description = Stores a message. Used for communication between allies. +block.message.description = Almacena un mensaje. Se utiliza para comunicarse entre aliados. block.graphite-press.description = Comprime carbón en piezas de grafito puro. block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente. -block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio. +block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicicona. block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía. block.plastanium-compressor.description = Produce plastanio con aceite y titanio. block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena. -block.alloy-smelter.description = Produce "surge alloy" con titanio, plomo, silicio y cobre. +block.alloy-smelter.description = Produce "surge alloy" con titanio, plomo, silicicona y cobre. block.cryofluidmixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar. block.blast-mixer.description = Usa aceite para transformar pirotita en un objeto menos inflamable pero más explosivo: compuesto explosivo. block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable. @@ -1057,17 +1137,18 @@ block.spore-press.description = Comprime esporas en petróleo. block.pulverizer.description = Despedaza la piedra en arena. Útil cuando no hay arena natural. block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón. block.incinerator.description = Se deshace de cualquier líquido o material excesivo. -block.power-void.description = Elimina toda la energía que se le da. Solo en sandbox. -block.power-source.description = Da energía infinita. Solo en sandbox. -block.item-source.description = Da objetos infinitos. Solo en sandbox. -block.item-void.description = Destruye cuanquier objeto que va a él sin necesitar energía. Solo en sandbox. -block.liquid-source.description = Da líquido infinito. Solo en sandbox. +block.power-void.description = Elimina toda la energía que se le da. Solo en Caja de Arena. +block.power-source.description = Da energía infinita. Solo en Caja de Arena. +block.item-source.description = Da objetos infinitos. Solo en Caja de Arena. +block.item-void.description = Destruye cuanquier objeto que va a él sin necesitar energía. Solo en Caja de Arena. +block.liquid-source.description = Da líquido infinito. Solo en Caja de Arena. +block.liquid-void.description = Elimina cualquier liquido que entra sin necesitar energía. Solo en Caja de Arena. block.copper-wall.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas. block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas. block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos. block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas. -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.. +block.plastanium-wall-large.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.\nOcupa múltiples casillas. block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos. block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas. block.phase-wall.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes. @@ -1087,7 +1168,7 @@ block.junction.description = Actúa como puente para dos transportadores que se block.bridge-conveyor.description = Bloque avanado de transporte. Puede transportar objetos por encima hasta 3 casillas de cualquier terreno o construcción. block.phase-conveyor.description = Bloque de transporte avanzado. Usa energía para transportar objetos a otro transportador de fase conectado por varias casillas. block.sorter.description = Clasifica objetos. Si un objeto es igual al seleccionado, pasará al frente. Si no, el objeto saldrá por la izquierda y la derecha. -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Procesa elementos como un clasificador estándar, pero en su lugar genera elementos seleccionados a los lados. block.router.description = Acepta objetos de una dirección y deja objetos equitativamente en hasta 3 direcciones diferentes. Útil para dividir los materiales de una fuente de recursos a múltiples objetivos. block.distributor.description = Un enrutador avanzado que distribuye objetos equitativamente en hasta otras 7 direcciones. block.overflow-gate.description = Un enrutador que solo saca por la izquierda y la derecha si la cinta del frente está llena. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = Una bomba avanzada. Bombea más líquido, pero r block.thermal-pump.description = La mejor bomba. block.conduit.description = Bloque de transporte de líquidos básico. Funciona como un transportador, pero con líquidos. Usado con bombas, extractores u otros conductos. block.pulse-conduit.description = Bloque de transporte de líquidos avanzado. Transporta líquidos más rápidamente y almacena más que los conductos estándar. +block.plated-conduit.description = Mueve líquidos a la misma velocidad que los conductos de pulso, pero posee más armadura. No acepta líquidos de los lados por otra cosa que no sean conductos.\nGotea menos. block.liquid-router.description = Acepta líquidos de una dirección y los deja en hasta 3 direcciones equitativamente. También puede amacenar cierta capacidad de líquido. Útil para dividir los líquidos de una fuente a varios objetivos. block.liquid-tank.description = Almacena una gran cantidad de líquidos. Úsalo para crear almacenes cuando no hay una demanda constante de materiales o para asegurarse de enfriar bloques vitales. block.liquid-junction.description = Actúa como un puente para dos condusctos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares. @@ -1105,12 +1187,13 @@ block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Us block.power-node.description = Transmite energía a nodos conectados, conecta hasta cuatro fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente. block.power-node-large.description = Tiene un radio más amplio que el nodo de energía y conecta hasta seis fuentes de energía, edificios que usan energía o nodos. block.surge-tower.description = Un nodo con un gran alcance con menos conexiones disponibles. +block.diode.description = La energía de la batería puede fluir a través de este bloque en una sola dirección, pero solo si el otro lado tiene menos energía almacenada. block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía. block.battery-large.description = Almacena mucha más energía que una batería normal. block.combustion-generator.description = Genera energía quemando aceite o matteriales inflamables. block.thermal-generator.description = Genera una gran cantidad de energía con la lava. block.turbine-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. +block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de piratita. block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento pero proporciona menos energía que un reactor de torio. block.solar-panel.description = Proporciona una pequeña cantidad de energía procedente del sol. block.solar-panel-large.description = Genera un mucho mejor suministro de energía que un panel solar estándar, pero también es mucho más caro de construir. @@ -1145,8 +1228,8 @@ block.ripple.description = Una torre de artillería grande que dispara varios di block.cyclone.description = Una torre de disparo rápido grande. block.spectre.description = Una torre grande que dispara dos balas poderosas de una vez. block.meltdown.description = Una torre grande que dispara rayos poderosos de largo alcance. -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 = Producedrones mineros Draug. +block.command-center.description = Emite comandos de movimiento a las unidades aliadas en el mapa.\nHace que las unidades patrullen, ataquen un núcleo enemigo o se retiren al núcleo / fábrica. When no enemy core is present, units will default to patrolling under the attack command. +block.draug-factory.description = Producedrones mineros primitivos. block.spirit-factory.description = Produce drones ligeros que obtienen minerales y reparan bloques. block.phantom-factory.description = Produce drones avanzados que son significativamente más eficientes que un dron espíritu. block.wraith-factory.description = Produce unidades aéreas rápidas e interceptoras. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index c3e62686d2..ad7b8f5c05 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -10,7 +10,9 @@ link.dev-builds.description = Arendusversioonide ajalugu link.trello.description = Plaanitud uuenduste nimekiri link.itch.io.description = Kõik PC-platvormide versioonid link.google-play.description = Androidi versioon Google Play poes +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Mängu ametlik viki +link.feathub.description = Suggest new features linkfail = Lingi avamine ebaõnnestus!\nVeebiaadress kopeeriti. screenshot = Kuvatõmmis salvestati: {0} screenshot.invalid = Maailm on liiga suur: kuvatõmmise salvestamiseks ei pruugi olla piisavalt mälu. @@ -18,12 +20,22 @@ gameover = Mäng läbi! gameover.pvp = Võistkond[accent] {0}[] võitis! highscore = [accent]Uus rekord! copied = Copied. + load.sound = Helid load.map = Maailmad load.image = Pildid load.content = Sisu load.system = Süsteem load.mod = Mods +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -40,6 +52,7 @@ schematic.saved = Schematic saved. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks + stat.wave = Lahingulaineid läbitud:[accent] {0} stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0} stat.built = Ehitisi konstrueeritud:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = Ehitisi hävinenud:[accent] {0} stat.deconstructed = Ehitisi dekonstrueeritud:[accent] {0} stat.delivered = Kaasavõetud ressursid: stat.rank = Hinne:[accent] {0} + launcheditems = [accent]Kaasavõetud ressursid launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Kas oled kindel, et soovid kustutada\nmaailma "[accent]{0}[]"? @@ -74,6 +88,7 @@ maps.browse = Sirvi maailmu continue = Jätka maps.none = [lightgray]Ühtegi maailma ei leitud! invalid = Kehtetu +pickcolor = Pick Color preparingconfig = Konfiguratsiooni ettevalmistamine preparingcontent = Sisu ettevalmistamine uploadingcontent = Sisu üleslaadimine @@ -81,6 +96,7 @@ uploadingpreviewfile = Eelvaate faili üleslaadimine committingchanges = Muudatuste teostamine done = Valmis feature.unsupported = Your device does not support this feature. + mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. mods.alpha = [accent](Alpha) mods = Mods @@ -92,18 +108,25 @@ mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required mod.import = Import Mod mod.import.github = Import GitHub Mod +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = This mod will be deleted. mod.author = [LIGHT_GRAY]Author:[] {0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Info name = Nimi: noname = Valige kõigepealt [accent]nimi[]. @@ -132,6 +155,7 @@ server.kicked.nameEmpty = Sinu valitud nimi ei sobi. server.kicked.idInUse = Sa juba mängid selles serveris! Teist korda liitumine on keelatud. server.kicked.customClient = See server ei luba modifitseeritud mängu versioone. Lae alla ametlik versioon. server.kicked.gameover = Mäng läbi! +server.kicked.serverRestarting = The server is restarting. server.versions = Sinu versioon:[accent] {0}[]\nServeri versioon:[accent] {1}[] host.info = [accent]Hosti[] nupp avab serveri,\nkasutades porti [scarlet]6567[]. \nSamas [lightgray]kohtvõrgus[] olevad mängijad peaksid nägema sinu serverit enda serverite nimekirjas.\n\nKui sa tahad, et ka väljaspool kohtvõrku olevad mängijad saaksid serveriga ühineda, siis on vajalik\n[accent]portide edasisuunamine[].\n\n[lightgray]Märkus: Kui kellelgi on probleeme sinu kohtvõrgus avatud serveriga liitumisel, siis tee kindlaks, et tulemüüri sätetes on Mindustry'l lubatud pääseda ligi kohtvõrgule. join.info = Siin saad lisada [accent]IP-aadressi serverile[], millega soovid liituda, või leida [accent]kohtvõrgus[] olevaid servereid.\nMäng toetab nii LAN- kui ka WAN-mitmikmängu.\n\n[lightgray]Märkus: Ei ole olemas automaatset serverite nimekirja. Kui sa soovid liituda mänguga IP kaudu, on sul vaja teada serveri IP-aadressi. @@ -271,6 +295,7 @@ publishing = [accent]Publishing... publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.error = Error publishing item: {0} steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = Pintsel editor.openin = Ava redaktoris editor.oregen = Maakide genereerimine @@ -347,6 +372,7 @@ editor.overwrite = [accent]Hoiatus!\nSee asendab olemasoleva maailma. editor.overwrite.confirm = [scarlet]Hoiatus![] Sellise nimega maailm on juba olemas. Oled kindel, et soovid selle asendada? editor.exists = Sellise nimega maailm on juba olemas. editor.selectmap = Vali laetav maailm: + toolmode.replace = Asenda toolmode.replace.description = Joonista ainult tahkete blokkide peale. toolmode.replaceall = Asenda kõik @@ -361,6 +387,7 @@ toolmode.fillteams = Täida võistkondi toolmode.fillteams.description = Täida blokkide asemel võistkondi. toolmode.drawteams = Joonista võistkondi toolmode.drawteams.description = Joonista blokkide asemel võistkondi. + filters.empty = [lightgray]Filtrid puuduvad! Lisa filtreid alloleva nupuga. filter.distort = Moonutamine filter.noise = Müra @@ -392,6 +419,7 @@ filter.option.floor2 = Teine põrand filter.option.threshold2 = Teine lävi filter.option.radius = Raadius filter.option.percentile = Protsentiil + width = Laius: height = Kõrgus: menu = Menüü @@ -407,6 +435,7 @@ tutorial = Õpetus tutorial.retake = Korda õpetust editor = Redaktor mapeditor = Maailmaredaktor + abandon = Loobu abandon.text = See piirkond koos kõigi ressurssidega loovutatakse vaenlasele. locked = Lukus @@ -437,6 +466,7 @@ zone.objective.survival = Ellujäämine zone.objective.attack = Hävita vaenlaste tuumik add = Lisa... boss.health = Bossi elud + connectfail = [crimson]Ühenduse viga:\n\n[accent]{0} error.unreachable = Server ei ole kättesaadav.\nKas serveri aadress on õigesti sisestatud? error.invalidaddress = Vale aadress. @@ -447,6 +477,7 @@ error.mapnotfound = Maailmafaili ei leitud! error.io = Võrgu sisend-väljundi viga. error.any = Teadmata viga võrgus. error.bloom = Bloom-efekti lähtestamine ebaõnnestus.\nSinu seade ei pruugi seda efekti toetada. + zone.groundZero.name = Nullpunkt zone.desertWastes.name = Kõrbestunud tühermaa zone.craters.name = Kraatrid @@ -461,6 +492,7 @@ zone.saltFlats.name = Soolaväljad zone.impact0078.name = Kokkupõrge 0078 zone.crags.name = Kaljurünkad zone.fungalPass.name = Seenekuru + zone.groundZero.description = Optimaalne asukoht alustamiseks.\nMadal ohutase. Vähesel määral ressursse.\nKogu kokku nii palju vaske ja pliid kui võimalik. zone.frozenForest.description = Spoorid on levinud isegi mägede lähedale. Jäised temperatuurid ei suuda neid igavesti eemal hoida.\n\nAlusta esimeste katsetustega energia tootmises. Ehita põlemisgeneraatoreid.\nÕpi oma ehitisi parandama. zone.desertWastes.description = Need tühermaad on üüratud ja ettearvamatud. Siin-seal leidub mahajäetud ja räsitud tööstushooneid.\n\nSelles piirkonnas leidub sütt. Töötle seda grafiidiks või põleta energia saamiseks.\n\n[lightgray]Maandumispaik ei ole kindlaks määratud. @@ -475,10 +507,12 @@ zone.nuclearComplex.description = Endine tooriumi tootmise ja töötlemise rajat zone.fungalPass.description = Üleminekuala kõrgete mägede ja madalamate, spooridega ülekülvatud maade vahel. Siin asub väike vaenlaste luurebaas.\nHävita see.\nKasuta soldatite ja plahvatajate väeüksuseid. Hävita kaks vaenlaste tuumikut. zone.impact0078.description = zone.crags.description = + settings.language = Keel settings.data = Mänguandmed settings.reset = Vaikimisi sätted settings.rebind = Muuda +settings.resetKey = Reset settings.controls = Juhtnupud settings.game = Mäng settings.sound = Heli @@ -529,6 +563,7 @@ blocks.inaccuracy = Ebatäpsus blocks.shots = Laske blocks.reload = Lasku/s blocks.ammo = Laskemoon + bar.drilltierreq = Nõuab paremat puuri bar.drillspeed = Puurimise kiirus: {0}/s bar.pumpspeed = Pump Speed: {0}/s @@ -544,6 +579,9 @@ bar.heat = Kuumus bar.power = Energia bar.progress = Edenemine bar.spawned = Väeüksuseid: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] hävituspunkti bullet.splashdamage = [stat]{0}[lightgray] hävituspunkti ~[stat] {1}[lightgray] blokki bullet.incendiary = [stat]süttiv @@ -555,6 +593,7 @@ bullet.freezing = [stat]jäätav bullet.tarred = [stat]leekisüütav bullet.multiplier = [stat]{0}[lightgray]x laskemoona kordaja bullet.reload = [stat]{0}[lightgray]x tulistamise kiirus + unit.blocks = blokki unit.powersecond = energiaühikut/s unit.liquidsecond = vedelikuühikut/s @@ -567,6 +606,8 @@ unit.persecond = /s unit.timesspeed = x kiirus unit.percent = % unit.items = ressursiühikut +unit.thousands = k +unit.millions = mil category.general = Üldinfo category.power = Energia category.liquids = Vedelikud @@ -579,6 +620,7 @@ setting.shadows.name = Varjud setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Lineaarne tekstuurivastendus setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animeeritud vesi setting.animatedshields.name = Animeeritud kilbid setting.antialias.name = Sakitõrje[lightgray] (vajab mängu taaskäivitamist)[] @@ -601,12 +643,16 @@ setting.screenshake.name = Ekraani värisemine setting.effects.name = Näita visuaalefekte setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Kontrolleri tundlikkus setting.saveinterval.name = Salvestamise intervall setting.seconds = {0} sekundit +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Täisekraan setting.borderlesswindow.name = Äärteta ekraan[lightgray] (võib vajada mängu taaskäivitamist) setting.fps.name = Näita kaadrite arvu sekundis +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = Vertikaalne sünkroonimine setting.pixelate.name = Piksel-efekt[lightgray] (lülitab animatsioonid välja) setting.minimap.name = Näita kaarti @@ -635,16 +681,36 @@ category.multiplayer.name = Mitmikmäng command.attack = Ründa command.rally = Patrulli command.retreat = Põgene +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Clear Building keybind.press = Vajuta klahvi... keybind.press.axis = Liiguta juhtkangi või vajuta klahvi... keybind.screenshot.name = Kuvatõmmis +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Liigu X-teljel keybind.move_y.name = Liigu Y-teljel +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Söösta keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_y.name = Flip Schematic Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Täisekraan keybind.select.name = Vali/Tulista keybind.diagonal_placement.name = Diagonaalne paigutamine @@ -657,7 +723,6 @@ keybind.menu.name = Menüü keybind.pause.name = Paus keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Kaart -keybind.dash.name = Söösta keybind.chat.name = Vestle keybind.player_list.name = Mängijate nimekiri keybind.console.name = Konsool @@ -680,7 +745,9 @@ mode.pvp.description = Võitle teiste mängijate vastu. mode.attack.name = Rünnak mode.attack.description = Hävita vaenlaste baas. Lahingulaineid ei ole. mode.custom = Reeglid + rules.infiniteresources = Lõputult ressursse +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Kasuta taimerit rules.waves = Kasuta lahingulaineid rules.attack = Mänguviis "Rünnak" @@ -688,6 +755,7 @@ rules.enemyCheat = [scarlet]Vaenlastel[] on lõputult ressursse rules.unitdrops = Väeüksuste heitmine lubatud rules.unitbuildspeedmultiplier = Väeüksuste tootmiskiiruse kordaja rules.unithealthmultiplier = Väeüksuste elude kordaja +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Mängija elude kordaja rules.playerdamagemultiplier = Mängija hävitusvõime kordaja rules.unitdamagemultiplier = Väeüksuste hävitusvõime kordaja @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = Ressursid ja ehitamine rules.title.player = Mängijad rules.title.enemy = Vaenlased rules.title.unit = Väeüksused +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Ressursid content.liquid.name = Vedelikud content.unit.name = Väeüksused @@ -752,6 +824,7 @@ mech.trident-ship.name = Lembitu mech.trident-ship.weapon = Pommiheitja mech.glaive-ship.name = Vambola mech.glaive-ship.weapon = Kuulipildur +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [lightgray]Plahvatusohtlikkus: {0}% item.flammability = [lightgray]Tuleohtlikkus: {0}% item.radioactivity = [lightgray]Radioaktiivsus: {0}% @@ -767,6 +840,7 @@ mech.buildspeed = [lightgray]Ehitamise kiirus: {0}% liquid.heatcapacity = [lightgray]Soojusmahtuvus: {0} liquid.viscosity = [lightgray]Viskoossus: {0} liquid.temperature = [lightgray]Temperatuur: {0} + block.sand-boulder.name = Liivakamakas block.grass.name = Rohi block.salt.name = Sool @@ -865,6 +939,8 @@ block.distributor.name = Suur jaotur block.sorter.name = Sorteerija block.inverted-sorter.name = Inverted Sorter block.message.name = Sõnum +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Ülevooluvärav block.silicon-smelter.name = Ränisulatusahi block.phase-weaver.name = Faaskangakuduja @@ -878,6 +954,7 @@ block.coal-centrifuge.name = Söetsentrifuug block.power-node.name = Energiasõlm block.power-node-large.name = Suur energiasõlm block.surge-tower.name = Energiatorn +block.diode.name = Battery Diode block.battery.name = Aku block.battery-large.name = Suur aku block.combustion-generator.name = Põlemisgeneraator @@ -901,6 +978,7 @@ block.mechanical-pump.name = Harilik pump block.item-source.name = Ressursiallikas block.item-void.name = Ressursisuue block.liquid-source.name = Vedelikuallikas +block.liquid-void.name = Liquid Void block.power-void.name = Maandaja block.power-source.name = Energiaallikas block.unloader.name = Mahalaadija @@ -930,6 +1008,7 @@ block.fortress-factory.name = Koljatite tehas block.revenant-factory.name = Ülestõusnute tehas block.repair-point.name = Parandusjaam block.pulse-conduit.name = Titaantoru +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Faastoru block.liquid-router.name = Torujaotur block.liquid-tank.name = Mahuti @@ -1001,6 +1080,7 @@ tutorial.deposit = Ressursside mahalaadimiseks lohista ressursid oma mehhaanilt tutorial.waves = [scarlet]Vaenlane[] läheneb.\n\nKaitse oma tuumikut kahe lahingulaine vältel.[accent] Kliki hiirega[], et oma mehhaanist tulistada.\n[accent]Kaevanda juurde vaske. Ehita uusi puure ja kahureid. tutorial.waves.mobile = [scarlet]Vaenlane[] läheneb.\n\nKaitse oma tuumikut kahe lahingulaine vältel. Sinu mehhaan tulistab vaenlaseid automaatselt.\n[accent]Kaevanda juurde vaske. Ehita uusi puure ja kahureid. tutorial.launch = Kui oled kindla arvu lahingulaineid vastu pidanud, on sul võimalik[accent] tuumikuga lendu tõusta[], jättes maha kõik muud ehitised ja[accent] võttes kaasa kõik tuumikus olevad ressursid.[]\nNeid ressursse saab kasutada uute [accent]tehnoloogiate uurimiseks[].\n\n[accent]Vajuta lendu tõusmise nuppu. + item.copper.description = Peamine materjal, mida kasutatakse igat tüüpi konstruktsioonide ehitamiseks. item.lead.description = Peamine materjal, mida kasutatakse vedelike transportimise konstruktsioonide ja elektroonikaga seotud konstruktsioonide ehitamiseks. item.metaglass.description = Ülitugev klaasiühend, mida kasutatakse vedelike transportimise ja hoiustamise konstruktsioonide ehitamiseks. @@ -1062,6 +1142,7 @@ block.power-source.description = Väljastab piiramatult energiat. Olemas ainult block.item-source.description = Väljastab piiramatult ressursse. Olemas ainult mänguviisis "Liivakast". block.item-void.description = Hävitab kõik ressursid. Olemas ainult mänguviisis "Liivakast". block.liquid-source.description = Väljastab piiramatult vedelikke. Olemas ainult mänguviisis "Liivakast". +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = Odav kaitsekonstruktsioon.\nKasulik tuumiku ja kahurite kaitsmiseks esimeste lahingulainete ajal. block.copper-wall-large.description = Odav kaitsekonstruktsioon.\nKasulik tuumiku ja kahurite kaitsmiseks esimeste lahingulainete ajal.\nUlatub üle mitme bloki. block.titanium-wall.description = Mõõdukalt tugev kaitsekonstruktsioon.\nPakub keskmist kaitset vaenlaste eest. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = Täiustatud pump, mis pumpab paremini kui harili block.thermal-pump.description = Ülim pump, mis vajab töötamiseks palju energiat. block.conduit.description = Vedelike transportimise vahend, mis liigutab vedelikke edasi. Kasutatakse koos pumpade ja teiste torudega. block.pulse-conduit.description = Täiustatud toru, mis transpordib ja hoiustab vedelikke kiiremini kui algeline toru. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Jaotab vedelikke kuni kolmes väljuvas suunas võrdselt. Selle jaoturiga on võimalik teatud koguses ka vedelikku hoiustada. Kasulik olukordades, kus vedelikke on vaja korraga saata mitmesse kohta. block.liquid-tank.description = Hoiustab suures koguses vedelikke. Kasuta puhvrite loomiseks juhul, kui ressursside nõudlus pole püsiv, või ettevaatusabinõuna tähtsate konstruktsioonide jahutussüsteemides. block.liquid-junction.description = Toimib kui sild samal tasapinnal ristuvate torude vahel. Kasulik olukordades, kus kaks toru kannavad erinevaid vedelikke erinevatesse kohtadesse. @@ -1105,6 +1187,7 @@ block.phase-conduit.description = Täiustatud toru, mis kasutab energiat vedelik block.power-node.description = Edastab energiat ühendatud sõlmpunktidesse. Sõlmed varustavad energiaga kõiki piisavalt lähedal asuvaid ja sõlmega ühenduses olevaid konstruktsioone. block.power-node-large.description = Täiustatud energiasõlm, mis on suurema ulatuse ja suurema võimalike ühenduste arvuga. block.surge-tower.description = Kaugeleulatuv energiasõlm, mis on väiksema võimalike ühenduste arvuga. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Salvestab energiat puhvrina positiivse energiabilansi ehk ülejäägi korral. Negatiivse energiabilansi ehk defitsiidi korral laetakse salvestatud energiat maha. block.battery-large.description = Salvestab rohkem energiat kui tavaline aku. block.combustion-generator.description = Toodab energiat süttivate materjalide, näiteks söe, põletamisel. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 66d71a0dce..967bcc497a 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -10,7 +10,9 @@ link.dev-builds.description = Garapen konpilazio ezegonkorrak link.trello.description = Aurreikusitako ezaugarrien Trello ofiziala link.itch.io.description = PC deskargen itch.io orria link.google-play.description = Google Play dendako sarrera +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Mindustry wiki ofiziala +link.feathub.description = Suggest new features linkfail = Huts egin du esteka irekitzean!\nURL-a zure arbelera kopiatu da. screenshot = Pantaila-argazkia {0} helbidean gorde da screenshot.invalid = Mapa handiegia, baliteke pantaila-argazkirako memoria nahiko ez egotea. @@ -18,12 +20,22 @@ gameover = Partida amaitu da gameover.pvp = [accent] {0}[] taldeak irabazi du! highscore = [accent]Marka berria! copied = Kopiatuta. + load.sound = Soinuak load.map = Mapak load.image = Irudiak load.content = Edukia load.system = Sistema load.mod = Mod-ak +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Eskama schematic.add = Gorde eskema... schematics = Eskemak @@ -40,6 +52,7 @@ schematic.saved = Eskema gordeta. schematic.delete.confirm = Eskema hau behin betiko suntsituko da. schematic.rename = Aldatu izena eskemari schematic.info = {0}x{1}, {2} bloke + stat.wave = Garaitutako boladak:[accent] {0} stat.enemiesDestroyed = Suntsitutako etsaiak:[accent] {0} stat.built = Eraikitako eraikinak:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = Suntsitutako eraikinak:[accent] {0} stat.deconstructed = Deseraikitako eraikinak:[accent] {0} stat.delivered = Egotzitako baliabideak: stat.rank = Azken graduazioa: [accent]{0} + launcheditems = [accent]Egotzitako baliabideak launchinfo = [unlaunched][[EGOTZI] zure muina urdinez adierazitako baliabideak eskuratzeko. map.delete = Ziur al zaude "[accent]{0}[]" mapa ezabatu nahi duzula? @@ -74,6 +88,7 @@ maps.browse = Arakatu mapak continue = Jarraitu maps.none = [lightgray]Ez da maparik aurkitu! invalid = Baliogabea +pickcolor = Pick Color preparingconfig = Konfigurazioa prestatzen preparingcontent = Edukia prestatzen uploadingcontent = Edukia igotzen @@ -81,6 +96,7 @@ uploadingpreviewfile = Aurrebista fitxategia igotzen committingchanges = Aldaketak aplikatzen done = Egina feature.unsupported = Zure gailuak ez du ezaugarri hau onartzen. + mods.alphainfo = Kontuan izan mod-ak alfa egoeran daudela, eta [scarlet] akats ugari izan ditzakete[].\nEman arazoen berri Mindustry-ren GitHub or Discord zerbitzuetan. mods.alpha = [accent](Alfa) mods = Mod-ak @@ -92,18 +108,25 @@ mod.enabled = [lightgray]Gaituta mod.disabled = [scarlet]Desgaituta mod.disable = Desgaitu mod.delete.error = Ezin izan da mod-a ezabatu. Agian fitxategia erabilia izaten ari da. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Falta diren menpekotasunak: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]'{0}' mod-ak menpekotasunak ditu faltan:[accent] {1}\n[lightgray]Aurretik beste mod hauek deskargatu behar dira.\nMod hau automatikoki desgaituko da. mod.enable = Gaitu mod.requiresrestart = Jolasa itxi egingo da mod-aren aldaketak aplikatzeko. mod.reloadrequired = [scarlet]Birkargatu behar da mod.import = Importatu Mod-a mod.import.github = Inportatu GitHub Mod-a +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = Mod hau ezabatuko da. mod.author = [LIGHT_GRAY]Egilea:[] {0} mod.missing = Gordetako partida honek eguneratu dituzun edo jada instalatuta ez dituzun mod-ak ditu. Gordetako partida izorratu daiteke. Ziur kargatu nahi duzula?\n[lightgray]Mod-ak:\n{0} mod.preview.missing = Mod hau tailerrean argitaratu aurretik, aurrebista bat gehitu behar diozu.\nKokatu[accent] preview.png[] izeneko irudi bat mod-aren karpetan eta saiatu berriro. mod.folder.missing = Karpeta formatuko mod-ak besterik ezin dira argitaratu tailerrean.\nEdozein mod karpetara bihurtzeko, deskopnrimitu fitxategia eta ezabatu zip zaharra, gero berrabiarazi jolasa edo birkargatu zure mod-ak. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Honi buruz name = Izena: noname = Hautatu[accent] jokalari-izena[] aurretik. @@ -132,6 +155,7 @@ server.kicked.nameEmpty = Aukeratu duzun izena baliogabea da. server.kicked.idInUse = Bazaude zerbitzari honetan! Ezin zara bi kontu desberdinekin konektatu. server.kicked.customClient = Zerbitzari honek ez ditu konpilazio pertsonalizatuak onartzen. Deskargatu bertsio ofizial bat. server.kicked.gameover = Partida amaitu da! +server.kicked.serverRestarting = The server is restarting. server.versions = Zure bertsioa:[accent] {0}[]\nZerbitzariaren bertsioa:[accent] {1}[] host.info = [accent]Ostalaria[] botoiak zerbitzari bat abiatzen du [scarlet]6567[] atakan.\n[lightgray]wifi edo sare lokal[] berean dagoen edonor zure zerbitzaria ikusi ahal beharko luke.\n\nJendea edonondik IP-a erabilita konektatu ahal izatea nahi baduzu, [accent]ataka birbidaltzea[] ezinbestekoa da.\n\n[lightgray]Oharra: Inork zure sare lokalean partidara elkartzeko arazoak baditu, egiaztatu Mindustry-k baimena duela sare lokalera elkartzeko suebakiaren ezarpenetan. Kontuan izan sare publiko batzuk ez dutela zerbitzarien bilaketa baimentzen. join.info = Hemen, konektatzeko [accent]zerbitzari baten IP-a[] sartu dezakezu konektatzeko, edo [accent]sare lokaleko[] zerbitzariak bilatu.\nLAN zein WAN sareetan onartzen dira hainbat jokalarien partidak .\n\n[lightgray]Oharra: Ez dago zerbitzarien zerrenda global automatikorik, beste inorekin IP bidez konektatu nahi baduzu, ostalariari bere IP helbidea eskatu beharko diozu. @@ -271,6 +295,7 @@ publishing = [accent]Argitaratzen... publish.confirm = Ziur hau argitaratu nahi duzula?\n\n[lightgray]Egiaztatu tailerreko EULA lizentziarekin ados zaudela aurretik, bestela zure elementuak ez dira agertuko! publish.error = Errorea elementua argitaratzean: {0} steam.error = Huts egin du Steam zerbitzuak hasieratzean.\nErrorea: {0} + editor.brush = Brotxa editor.openin = Ireki editorean editor.oregen = Mea sorrera @@ -347,6 +372,7 @@ editor.overwrite = [accent]Abisua!\nHonek badagoen mapa bat gainidatziko du. editor.overwrite.confirm = [scarlet]Abisua![] Badago izen bereko beste mapa bat. Ziur gainidatzi nahi duzula? editor.exists = Badago izen bereko beste mapa bat. editor.selectmap = Hautatu mapa kargatzeko: + toolmode.replace = Ordeztu toolmode.replace.description = Marraztu bloke zurrunak bakarrik. toolmode.replaceall = Ordeztu denak @@ -361,6 +387,7 @@ toolmode.fillteams = Bete taldeak toolmode.fillteams.description = Bete taldeak blokeen ordez. toolmode.drawteams = Marraztu taldeak toolmode.drawteams.description = Marraztu taldeak blokeen ordez. + filters.empty = [lightgray]Iragazkirik ez! Gehitu bat beheko botoiarekin. filter.distort = Distortsioa filter.noise = Orbana @@ -392,6 +419,7 @@ filter.option.floor2 = Bigarren zorua filter.option.threshold2 = Bigarren atalasea filter.option.radius = Erradioa filter.option.percentile = Pertzentila + width = Zabalera: height = Altuera: menu = Menua @@ -407,6 +435,7 @@ tutorial = Tutoriala tutorial.retake = Berriro hasi tutoriala editor = Editorea mapeditor = Mapen editorea + abandon = Abandonatu abandon.text = Eremu hau eta bere baliabide guztiak etsaiaren esku geratuko dira. locked = Blokeatuta @@ -437,6 +466,7 @@ zone.objective.survival = Biziraupena zone.objective.attack = Suntsitu etsaiaren muina add = Gehitu boss.health = Nagusiaren osasuna + connectfail = [crimson]Konexio errorea:\n\n[accent]{0} error.unreachable = Zerbitzaria eskuraezin.\nHelbidea ondo idatzita dago? error.invalidaddress = Helbide baliogabea. @@ -447,6 +477,7 @@ error.mapnotfound = Ez da mapa-fitxategia aurkitu! error.io = Sareko irteera/sarrera errorea. error.any = Sareko errore ezezaguna. error.bloom = Ezin izan da distira hasieratu.\nAgian zure gailuak ez du onartzen. + zone.groundZero.name = Zero eremua zone.desertWastes.name = Basamortuak zone.craters.name = Kraterrak @@ -461,6 +492,7 @@ zone.saltFlats.name = Gatz zelaiak zone.impact0078.name = 0078 talka zone.crags.name = Harkaitzak zone.fungalPass.name = Onddo mendatea + zone.groundZero.description = Berriro hasteko kokaleku egokiena.\nBaliabide gutxi daude baina etsaien mehatxua ere txikia da.\nEskuratu ahal beste berun eta kobre.\nSegi aurrera. zone.frozenForest.description = Hemen ere, mendietatik hurbil, esporak sakabanatu dira. Tenperatura hotzek ez dituzte betirako geldiaraziko.\n\nHasi energia eskuratzeko abentura. Eraiki errekuntza sorgailuak. Ikasi konpontzaileak erabiltzen. zone.desertWastes.description = Basamortu hauen zabalak dira, ezustekoak, eta abandonaturiko sektore estrukturekin marratuak.\nBadago ikatza eskualde honetan. Erre energiarako, edo grafitoa sintetizatzeko.\n\n[lightgray]Ezin da lurreratze tokia bermatu. @@ -475,10 +507,12 @@ zone.nuclearComplex.description = Torioa ekoiztu eta prozesatzeko instalazio ohi zone.fungalPass.description = Mendi garaiak eta esporez jositako behe lautaden arteko transizio eremua. Etsaien araketa-base txiki bat dago hemen.\nSuntsitu ezazu.\nErabili Daga eta Ibilkari unitateak. Akabatu bi muinak. zone.impact0078.description = zone.crags.description = + settings.language = Hizkuntza settings.data = Jolasaren datuak settings.reset = Berrezarri lehenespenak settings.rebind = Aldatu +settings.resetKey = Reset settings.controls = Kontrolak settings.game = Jolasa settings.sound = Soinua @@ -529,6 +563,7 @@ blocks.inaccuracy = Zehazgabetasuna blocks.shots = Tiroak blocks.reload = Tiroak/segundoko blocks.ammo = Munizioa + bar.drilltierreq = Zulagailu hobea behar da bar.drillspeed = Ustiatze-abiadura: {0}/s bar.pumpspeed = Ponpatze abiadura: {0}/s @@ -544,6 +579,9 @@ bar.heat = Beroa bar.power = Energia bar.progress = Eraikitze egoera bar.spawned = Unitateak: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] kalte bullet.splashdamage = [stat]{0}[lightgray] ingurune-kaltea ~[stat] {1}[lightgray] lauza bullet.incendiary = [stat]su-eragilea @@ -555,6 +593,7 @@ bullet.freezing = [stat]hozkirri bullet.tarred = [stat]mundrunduta bullet.multiplier = [stat]{0}[lightgray]x munizio-biderkatzailea bullet.reload = [stat]{0}[lightgray]x tiro tasa + unit.blocks = bloke unit.powersecond = energia unitate/segundoko unit.liquidsecond = likido unitate/segundoko @@ -567,6 +606,8 @@ unit.persecond = /seg unit.timesspeed = x abiadura unit.percent = % unit.items = elementu +unit.thousands = k +unit.millions = mil category.general = Orokorra category.power = Energia category.liquids = Likidoak @@ -579,6 +620,7 @@ setting.shadows.name = Itzalak setting.blockreplace.name = Bloke proposamen automatikoak setting.linear.name = Iragazte lineala setting.hints.name = Pistak +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animatutako ura setting.animatedshields.name = Animatutako ezkutuak setting.antialias.name = Antialias[lightgray] (berrabiarazi behar da)[] @@ -601,12 +643,16 @@ setting.screenshake.name = Pantailaren astindua setting.effects.name = Bistaratze-efektuak setting.destroyedblocks.name = Erakutsi suntsitutako blokeak setting.conveyorpathfinding.name = Garraio-zintak kokatzeko bide-bilaketa +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Kontrolagailuaren sentikortasuna setting.saveinterval.name = Gordetzeko tartea setting.seconds = {0} segundo +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Pantaila osoa setting.borderlesswindow.name = Ertzik gabeko leihoa[lightgray] (berrabiaraztea behar lezake) setting.fps.name = Erakutsi FPS +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelatu[lightgray] (animazioak desgaitzen ditu) setting.minimap.name = Erakutsi mapatxoa @@ -635,16 +681,36 @@ category.multiplayer.name = Hainbat jokalari command.attack = Eraso command.rally = Batu command.retreat = Erretreta +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Garrbitu eraikina keybind.press = Sakatu tekla bat... keybind.press.axis = Sakatu ardatza edo tekla... keybind.screenshot.name = Maparen pantaila-argazkia +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Mugitu x keybind.move_y.name = Mugitu y +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Arrapalada keybind.schematic_select.name = Hautatu eskualdea keybind.schematic_menu.name = Eskema menua keybind.schematic_flip_x.name = Itzulbiratu X keybind.schematic_flip_y.name = Itzulbiratu Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Txandakatu pantaila osoa keybind.select.name = Hautatu/Tirokatu keybind.diagonal_placement.name = Kokatze diagonala @@ -657,7 +723,6 @@ keybind.menu.name = Menua keybind.pause.name = Pausatu keybind.pause_building.name = Pausatu/berrekin eraikiketa keybind.minimap.name = Mapatxoa -keybind.dash.name = Arrapalada keybind.chat.name = Txata keybind.player_list.name = Jokalarien zerrenda keybind.console.name = Kontsola @@ -680,7 +745,9 @@ mode.pvp.description = Borrokatu beste jokalari batzuk lokalean.\n[gray]Gutxiene mode.attack.name = Erasoa mode.attack.description = Suntsitu etsaiaren basea. Boladarik ez.\n[gray]Kono gorria behar da mapan jolasteko. mode.custom = Arau pertsonalizatuak + rules.infiniteresources = Baliabide amaigabeak +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Boladen denboragailua rules.waves = Boladak rules.attack = Eraso modua @@ -688,6 +755,7 @@ rules.enemyCheat = IA-k (talde gorriak) baliabide amaigabeak ditu rules.unitdrops = Unitate-sorrerak rules.unitbuildspeedmultiplier = Unitateen sorrerarako abiadura-biderkatzailea rules.unithealthmultiplier = Unitateen osasun-biderkatzailea +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Jokalariaren osasun-biderkatzailea rules.playerdamagemultiplier = Jokalariaren kalte-biderkatzailea rules.unitdamagemultiplier = Unitateen kalte-biderkatzailea @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = Baliabideak eta eraikuntza rules.title.player = Jokalariak rules.title.enemy = Etsaiak rules.title.unit = Unitateak +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Solidoak content.liquid.name = Likidoak content.unit.name = Unitateak @@ -752,6 +824,7 @@ mech.trident-ship.name = Hiruhortz mech.trident-ship.weapon = Bonba jaregilea mech.glaive-ship.name = Guja mech.glaive-ship.weapon = Sugar errepika-fusila +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [lightgray]Lehergarritasuna: {0}% item.flammability = [lightgray]Sukoitasuna: {0}% item.radioactivity = [lightgray]Erradioaktibitatea: {0}% @@ -767,6 +840,7 @@ mech.buildspeed = [lightgray]Eraikitze abiadura: {0}% liquid.heatcapacity = [lightgray]Bero edukiera: {0} liquid.viscosity = [lightgray]Likatasuna: {0} liquid.temperature = [lightgray]Tenperatura: {0} + block.sand-boulder.name = Hondar harkaitza block.grass.name = Belarra block.salt.name = Gatza @@ -865,6 +939,8 @@ block.distributor.name = Banatzailea block.sorter.name = Antolatzailea block.inverted-sorter.name = Alderantzizko antolatzailea block.message.name = Mezua +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Gainezkatze atea block.silicon-smelter.name = Silizio galdategia block.phase-weaver.name = Fase ehulea @@ -878,6 +954,7 @@ block.coal-centrifuge.name = Ikatz zentrifugagailua block.power-node.name = Energia-nodoa block.power-node-large.name = Energia-nodo handia block.surge-tower.name = Tirainezko dorrea +block.diode.name = Battery Diode block.battery.name = Bateria block.battery-large.name = Bateria handia block.combustion-generator.name = Errekuntza sorgailua @@ -901,6 +978,7 @@ block.mechanical-pump.name = Ponpa mekanikoa block.item-source.name = Elementu-iturria block.item-void.name = Elementu-zuloa block.liquid-source.name = Likido-iturria +block.liquid-void.name = Liquid Void block.power-void.name = Energia-zuloa block.power-source.name = Energia amaigabea block.unloader.name = Deskargagailua @@ -930,6 +1008,7 @@ block.fortress-factory.name = Gotorleku meka faktoria block.revenant-factory.name = Mamu ehiza-hegazkin faktoria block.repair-point.name = Konponketa puntua block.pulse-conduit.name = Pultsu hodia +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Fasezko hodia block.liquid-router.name = Likidoen bideratzailea block.liquid-tank.name = Likidoentzako tankea @@ -1001,6 +1080,7 @@ tutorial.deposit = Baliabideak blokeren batean sartzeko, arrastatu zure ontzitik tutorial.waves = [lightgray]Etsaia[] dator.\n\nBabestu muina 2 boladetan zehar. [accent]Egin klik[] tirokatzeko.\nEraiki dorre eta zulagailu gehiago. Ustiatu kobre gehiago. tutorial.waves.mobile = [lightgray]Etsaia[] dator.\n\nBabestu muina 2 boladatan. Zure ontziak automatikoki tirokatuko ditu etsaiak.\nEraiki dorre eta zulagailu gehiago. Ustiatu kobre gehiago. tutorial.launch = Bolada zehatz batera heltzean, [accent]muina egotzi[] dezakezu, zure defentsak atzean utziz [accent]eta muineko baliabide guztiak eskuratuz.[]\nBaliabide hauek teknologia berriak ikertzeko erabili daitezke.\n\n[accent]Sakatu egotzi botoia. + item.copper.description = Egiturazko material oinarrizkoena. Asko erabilia bloke mota guztietarako. item.lead.description = Hastapeneko oinarrizko materiala. Bloke elektronikoak eta likidoen garraiorako blokeetan asko erabilia. item.metaglass.description = Beirazko konposatu izugarri sendoa. Asko erabilia likidoen garraio eta biltegiratzerako. @@ -1062,6 +1142,7 @@ block.power-source.description = Energia emari etengabea. Jolastokian besterik e block.item-source.description = Elementuen iturri amaigabea. Jolastokian besterik ez. block.item-void.description = Elementu guztiak suntsitzen ditu. Jolastokian besterik ez. block.liquid-source.description = Likidoen emari amaigabea. Jolastokian besterik ez. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = Babeserako bloke merke bat.\nMuina eta dorreak lehen boladetan babesteko erabilgarria. block.copper-wall-large.description = Babeserako bloke merke bat.\nMuina eta dorreak lehen boladetan babesteko erabilgarria.\nHainbat lauza hartzen ditu. block.titanium-wall.description = Zertxobait gogorra den babeserako bloke bat.\nEtsaien aurreko babes ertaina eskaintzen du. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = Ponpa aurreratu bat. Likido gehiago barreiatzen block.thermal-pump.description = Ponpa gorena. block.conduit.description = Likidoen garraiorako oinarrizko blokea. Likidoak daramatza. Ponpa eta bestelako hodiekin batera erabilia. block.pulse-conduit.description = Likidoen garraiorako bloke aurreratua. Hodi arruntek baino azkarrago garraiatzen ditu likidoak eta edukiera handiagoa du. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Likidoan alde batetik jaso eta gehienez beste 3 norabideetara ateratzen ditu kopuru berdinean. Likido apur bat ere biltegiratu dezake. Likidoak iturri batetik hainbat xedeetara eramateko erabilgarria. block.liquid-tank.description = Likidoen kopuru handi bat biltegiratzen du. Erabili tarteko biltegiratzerako materialen eskaria etengabekoa ez denean, edo ezinbesteko blokeentzako hozgarriaren gordailu gisa. block.liquid-junction.description = Gurutzatzen diren bi hodi banatzeko zubi gisa aritzen da. Likido desberdinak daramatzaten bi hodi gurutzatzen direnean erabilgarria. @@ -1105,6 +1187,7 @@ block.phase-conduit.description = Likidoen garraiorako bloke aurreratua. Energia block.power-node.description = Konektatu nodoei energia igortzen die. Nodoa inguruko edozein blokeetara konektatuko da energia jaso edo igortzeko. block.power-node-large.description = Energia nodo aurreratua, irismen handiagoarekin eta konexio gehiagorekin. block.surge-tower.description = Muturreko irismen luzea duen energia-nodoa konexio erabilgarri gutxiagorekin. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Energia biltegiratu dezake gehiegi dagoenean tartekari gisa erabiltzeko. Behar denean energia igortzen du. block.battery-large.description = Bateria arrunt batek baino energia gehiago biltegiratu dezake. block.combustion-generator.description = Energia sortzen du gai erregarriak errez, esaterako ikatza. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index be59e014aa..a4c189dca4 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -3,19 +3,55 @@ credits = Tekijät contributors = Kääntäjät ja avustajat discord = Liity Mindustryn Discordiin! link.discord.description = Mindustryn virallinen Discord-keskusteluhuone +link.reddit.description = The Mindustry subreddit link.github.description = Pelin lähdekoodi link.changelog.description = Lista päivityksien muutoksista link.dev-builds.description = Epävakaat kehitysversiot link.trello.description = Virallinen Trello-taulu suunnitelluille ominaisuuksille. link.itch.io.description = itch.io -sivu tietokoneversion latausten kanssa link.google-play.description = Google Play Kauppa -sivu +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Virallinen Mindustry wiki +link.feathub.description = Suggest new features linkfail = Linkin avaaminen epäonnistui!\nOsoite on kopioitu leikepöydällesi. screenshot = Kuvankaappaus tallennettu sijaintiin {0} screenshot.invalid = Kartta liian laaja, kuvankaappaukselle ei mahdollisesti ole tarpeeksi tilaa. gameover = Peli ohi gameover.pvp = [accent] {0}[] joukkue voittaa! highscore = [accent]Uusi ennätys! +copied = Copied. + +load.sound = Sounds +load.map = Maps +load.image = Images +load.content = Content +load.system = System +load.mod = Mods +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Aaltoja voitettu:[accent] {0} stat.enemiesDestroyed = Vihollisia tuhottu:[accent] {0} @@ -25,10 +61,8 @@ stat.deconstructed = Rakennuksia purettu:[accent] {0} stat.delivered = Resursseja laukaistu: stat.rank = Lopullinen arvo: [accent]{0} -placeline = Olet valinnut palikan.\nVoit[accent] asettaa linjassa[][accent] pitämällä sormeasi pohjassa muutaman sekunnin ajan[] ja vetämällä johonkin suuntaan.\n\n[scarlet]TEE SE. -removearea = Olet valinut poistotilan.\nVoit[accent] poistaa palikoita suorakulmiossa[][accent] pitämällä sormeasi pohjassa muutaman sekunnin ajan[] ja vetämällä.\n\n[scarlet]TEE SE. - launcheditems = [accent]Laukaistut tavarat +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Oletko varma että haluat poistaa kartan "[accent]{0}[]"? level.highscore = Ennätys: [accent]{0} level.select = Tason valinta @@ -40,17 +74,59 @@ database = Ytimen tietokanta savegame = Tallenna peli loadgame = Lataa peli joingame = Liity peliin -addplayers = Lisää/Poista pelaajia customgame = Mukautettu peli newgame = Uusi peli none = minimap = Pienoiskartta +position = Position close = Sulje website = Verkkosivu quit = Poistu +save.quit = Save & Quit maps = Kartat +maps.browse = Browse Maps continue = Jatka maps.none = [lightgray]Karttoja ei löytynyt! +invalid = Invalid +pickcolor = Pick Color +preparingconfig = Preparing Config +preparingcontent = Preparing Content +uploadingcontent = Uploading Content +uploadingpreviewfile = Uploading Preview File +committingchanges = Comitting Changes +done = Done +feature.unsupported = Your device does not support this feature. + +mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. +mods.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import GitHub Mod +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Tietoa name = Nimi: noname = Valitse ensin[accent] pelaajanimi[]. @@ -65,25 +141,32 @@ players = {0} pelaajaa paikalla players.single = {0} pelaaja paikalla server.closing = [accent]Suljetaan palvelinta... server.kicked.kick = Sinut on potkittu palvelimelta! +server.kicked.whitelist = You are not whitelisted here. server.kicked.serverClose = Palvelin suljettu. +server.kicked.vote = You have been vote-kicked. Goodbye. server.kicked.clientOutdated = Pelisi on vanhentunut! Päivitä se! server.kicked.serverOutdated = Outdated server! Ask the host to update! server.kicked.banned = Sinulla on portikielto tälle palvelimelle. +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 = Sinut on potkittu äskettäin.\nOdota ennen kuin yhdistät uudestaan. server.kicked.nameInUse = Joku tuon niminen\non jo tällä palvelimella. server.kicked.nameEmpty = Valitsemasi nimi on virheellinen. server.kicked.idInUse = Olet jo tällä palvelimella! Kahdella käyttäjällä yhdistäminen ei ole sallittua. server.kicked.customClient = Tämä palvelin ei tue muokattuja versioita. Lataa virallinen versio. server.kicked.gameover = Peli ohi! +server.kicked.serverRestarting = The server is restarting. server.versions = Versiosi:[accent] {0}[]\nPalvelimen versio:[accent] {1}[] host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. hostserver = Host Multiplayer Game +invitefriends = Invite Friends hostserver.mobile = Host\nGame host = Host hosting = [accent]Avataan palvelinta... hosts.refresh = Päivitä hosts.discovering = Discovering LAN games +hosts.discovering.any = Discovering games server.refreshing = Päivitetään palvelimen tietoja hosts.none = [lightgray]No local games found! host.invalid = [scarlet]Can't connect to host. @@ -107,20 +190,24 @@ server.version = [gray]v{0} {1} server.custombuild = [yellow]Custom Build confirmban = Are you sure you want to ban this player? confirmkick = Are you sure you want to kick this player? +confirmvotekick = Are you sure you want to vote-kick this player? confirmunban = Are you sure you want to unban this player? confirmadmin = Are you sure you want to make this player an admin? confirmunadmin = Are you sure you want to remove admin status from this player? joingame.title = Liity peliin joingame.ip = Osoite: disconnect = Disconnected. +disconnect.error = Connection error. +disconnect.closed = Connection closed. +disconnect.timeout = Timed out. disconnect.data = Failed to load world data! +cantconnect = Unable to join game ([accent]{0}[]). connecting = [accent]Connecting... connecting.data = [accent]Loading world data... server.port = Portti: server.addressinuse = Address already in use! server.invalidport = Invalid port number! server.error = [crimson]Error hosting server: [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.new = New Save save.overwrite = Are you sure you want to overwrite\nthis save slot? overwrite = Overwrite @@ -139,6 +226,7 @@ save.rename = Nimeä uudelleen save.rename.text = Uusi nimi: selectslot = Valitse tallennus. slot = [accent]Paikka {0} +editmessage = Edit Message save.corrupted = [accent]Tallennustiedosto korruptoitunut tai viallinen!\nJos olet päivittänyt juuri pelisi, tämä on todennäköisesti muutos tallennusmuodossa [scarlet]eikä[] virhe. empty = on = Päällä @@ -146,12 +234,14 @@ off = Pois save.autosave = Automaattitallennus: {0} save.map = Kartta: {0} save.wave = Aalto {0} -save.difficulty = Vaikeustaso: {0} +save.mode = Gamemode: {0} save.date = Viimeksi tallennettu: {0} save.playtime = Peliaika: {0} warning = Varoitus. confirm = Vahvista delete = Poista +view.workshop = View In Workshop +workshop.listing = Edit Workshop Listing ok = OK open = Avaa customize = Muokkaa sääntöjä @@ -159,12 +249,22 @@ cancel = Peruuta openlink = Avaa linkki copylink = Kopioi linkki back = Takaisin +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 overwrite[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. classic.export = Export Classic Data classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? quit.confirm = Are you sure you want to quit? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Ladataan... +reloading = [accent]Reloading Mods... saving = [accent]Tallennetaan... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Aalto {0} wave.waiting = [lightgray]Wave in {0} wave.waveInProgress = [lightgray]Wave in progress @@ -183,6 +283,19 @@ map.nospawn = Tässä kartassa ei ole ytimiä joihin syntyä! Lisää[accent] or 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.invalid = Error loading map: corrupted or invalid map file. +workshop.update = Update Item +workshop.error = Error fetching workshop details: {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! +workshop.menu = Select what you would like to do with this item. +workshop.info = Item Info +changelog = Changelog (optional): +eula = Steam EULA +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = Brush editor.openin = Avaa editorissa editor.oregen = Ore Generation @@ -190,11 +303,14 @@ editor.oregen.info = Ore Generation: editor.mapinfo = Kartan tiedot editor.author = Author: editor.description = Kuvaus: +editor.nodescription = A map must have a description of at least 4 characters before being published. editor.waves = Aallot: editor.rules = Säännöt: editor.generation = Generation: editor.ingame = Edit In-Game +editor.publish.workshop = Publish On Workshop editor.newmap = Uusi kartta +workshop = Workshop waves.title = Aallot waves.remove = Remove waves.never = @@ -211,6 +327,7 @@ waves.invalid = Invalid waves in clipboard. waves.copied = Aallot kopioitu. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. editor.default = [lightgray] +details = Details... edit = Muokkaa... editor.name = Nimi: editor.spawn = Spawn Unit @@ -220,6 +337,7 @@ editor.errorload = Virhe ladattaessa tiedostoa:\n[accent]{0} editor.errorsave = Virhe tallennettaessa tiedostoa:\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.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.errorname = Map has no name defined. Are you trying to load a save file? editor.update = Päivitä @@ -252,6 +370,7 @@ editor.resizemap = Resize Map editor.mapname = Kartan nimi: 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.exists = A map with this name already exists. editor.selectmap = Select a map to load: toolmode.replace = Replace @@ -309,7 +428,6 @@ campaign = Campaign load = Lataa save = Tallenna fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Please restart your game for the language settings to take effect. settings = Asetukset @@ -317,13 +435,14 @@ tutorial = Perehdytys tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Map Editor -donate = Lahjoita abandon = Hylkää abandon.text = This zone and all its resources will be lost to the enemy. locked = Lukittu complete = [lightgray]Reach: -zone.requirement = Wave {0} in zone {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} launch = < LAUNCH > @@ -334,10 +453,13 @@ launch.confirm = This will launch all resources in your core.\nYou will not be a launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Uncover configure = Configure Loadout +bannedblocks = Banned Blocks +addall = Add All 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.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = [lightgray]Resources Detected: zone.objective = [lightgray]Objective: [accent]{0} zone.objective.survival = Survive @@ -387,8 +509,10 @@ zone.impact0078.description = zone.crags.description = settings.language = Language +settings.data = Game Data settings.reset = Reset to Defaults settings.rebind = Rebind +settings.resetKey = Reset settings.controls = Controls settings.game = Game settings.sound = Sound @@ -396,15 +520,14 @@ settings.graphics = Graphics settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! 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.clearunlocks = Clear Unlocks -settings.clearall = Clear All paused = [accent]< Paused > +clear = Clear +banned = [scarlet]Banned yes = Yes no = No info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured -attackpvponly = [scarlet]Only available in Attack/PvP modes blocks.input = Input blocks.output = Output blocks.booster = Booster @@ -420,6 +543,7 @@ blocks.shootrange = Range blocks.size = Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage blocks.itemcapacity = Item Capacity @@ -434,6 +558,7 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second @@ -441,16 +566,21 @@ blocks.ammo = Ammo bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0}/s +bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} bar.poweroutput = Power Output: {0} bar.items = Items: {0} +bar.capacity = Capacity: {0} bar.liquid = Liquid bar.heat = Heat bar.power = Power bar.progress = Build Progress bar.spawned = Units: {0}/{1} +bar.input = Input +bar.output = Output bullet.damage = [stat]{0}[lightgray] damage bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles @@ -476,6 +606,8 @@ unit.persecond = /sec unit.timesspeed = x speed unit.percent = % unit.items = items +unit.thousands = k +unit.millions = mil category.general = General category.power = Power category.liquids = Liquids @@ -485,13 +617,17 @@ category.shooting = Shooting category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering +setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animated Water setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[lightgray] (requires restart)[] setting.indicators.name = Enemy/Ally Indicators setting.autotarget.name = Auto-Target setting.keyboard.name = Mouse+Keyboard Controls +setting.touchscreen.name = Touchscreen Controls setting.fpscap.name = Max FPS setting.fpscap.none = None setting.fpscap.text = {0} FPS @@ -505,24 +641,35 @@ setting.difficulty.insane = Insane setting.difficulty.name = Difficulty: setting.screenshake.name = Screen Shake setting.effects.name = Display Effects +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Save Interval setting.seconds = {0} Seconds +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) setting.fps.name = Show FPS +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync -setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixelate[lightgray] (disables animations) setting.minimap.name = Show Minimap +setting.position.name = Show Player Position setting.musicvol.name = Music Volume setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound setting.crashreport.name = Send Anonymous Crash Reports +setting.savecreate.name = Auto-Create Saves +setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity +setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Display In-Game Chat +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. 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 setting.bloom.name = Bloom @@ -532,15 +679,39 @@ category.general.name = General category.view.name = View category.multiplayer.name = Multiplayer command.attack = Attack +command.rally = Rally command.retreat = Retreat -command.patrol = Patrol -keybind.gridMode.name = Block Select -keybind.gridModeShift.name = Category Select +placement.blockselectkeys = \n[lightgray]Key: [{0}, +keybind.clear_building.name = Clear Building keybind.press = Press a key... keybind.press.axis = Press an axis or key... keybind.screenshot.name = Map Screenshot +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Move x keybind.move_y.name = Move y +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Dash +keybind.schematic_select.name = Select Region +keybind.schematic_menu.name = Schematic Menu +keybind.schematic_flip_x.name = Flip Schematic X +keybind.schematic_flip_y.name = Flip Schematic Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 +keybind.fullscreen.name = Toggle Fullscreen keybind.select.name = Select/Shoot keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block @@ -550,12 +721,13 @@ keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap -keybind.dash.name = Dash keybind.chat.name = Chat keybind.player_list.name = Player list keybind.console.name = Console keybind.rotate.name = Rotate +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Toggle menus keybind.chat_history_prev.name = Chat history prev keybind.chat_history_next.name = Chat history next @@ -567,6 +739,7 @@ mode.survival.name = Survival mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. mode.sandbox.name = Sandbox mode.sandbox.description = Infinite resources and no timer for waves. +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. mode.attack.name = Attack @@ -574,6 +747,7 @@ mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a mode.custom = Custom Rules rules.infiniteresources = Infinite Resources +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode @@ -581,6 +755,7 @@ rules.enemyCheat = Infinite AI (Red Team) Resources rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Player Health Multiplier rules.playerdamagemultiplier = Player Damage Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier @@ -599,6 +774,9 @@ rules.title.resourcesbuilding = Resources & Building rules.title.player = Players rules.title.enemy = Enemies rules.title.unit = Units +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light content.item.name = Items content.liquid.name = Liquids @@ -646,6 +824,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Bomb Bay mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Flame Repeater +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% @@ -737,6 +916,8 @@ block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall block.titanium-wall-large.name = Large Titanium Wall +block.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Phase Wall block.phase-wall-large.name = Large Phase Wall block.thorium-wall.name = Thorium Wall @@ -750,10 +931,16 @@ block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Conveyor block.titanium-conveyor.name = Titanium Conveyor +block.armored-conveyor.name = Armored Conveyor +block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyor belts. block.junction.name = Junction block.router.name = Router block.distributor.name = Distributor block.sorter.name = Sorter +block.inverted-sorter.name = Inverted Sorter +block.message.name = Message +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Overflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver @@ -767,6 +954,7 @@ block.coal-centrifuge.name = Coal Centrifuge block.power-node.name = Power Node block.power-node-large.name = Large Power Node block.surge-tower.name = Surge Tower +block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator @@ -790,6 +978,7 @@ block.mechanical-pump.name = Mechanical Pump block.item-source.name = Item Source block.item-void.name = Item Void block.liquid-source.name = Liquid Source +block.liquid-void.name = Liquid Void block.power-void.name = Power Void block.power-source.name = Power Infinite block.unloader.name = Unloader @@ -806,6 +995,7 @@ block.blast-mixer.name = Blast Mixer block.solar-panel.name = Solar Panel block.solar-panel-large.name = Large Solar Panel block.oil-extractor.name = Oil Extractor +block.command-center.name = Command Center block.draug-factory.name = Draug Miner Drone Factory block.spirit-factory.name = Spirit Repair Drone Factory block.phantom-factory.name = Phantom Builder Drone Factory @@ -818,6 +1008,7 @@ block.fortress-factory.name = Fortress Mech Factory block.revenant-factory.name = Revenant Fighter Factory block.repair-point.name = Repair Point block.pulse-conduit.name = Pulse Conduit +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Phase Conduit block.liquid-router.name = Liquid Router block.liquid-tank.name = Liquid Tank @@ -870,6 +1061,7 @@ unit.lich.name = Lich unit.reaper.name = Reaper tutorial.next = [lightgray] tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then 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.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.[] @@ -889,7 +1081,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.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.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. @@ -929,6 +1120,7 @@ unit.eruptor.description = A heavy mech designed to take down structures. Fires unit.wraith.description = A fast, hit-and-run interceptor unit. Targets power generators. unit.ghoul.description = A heavy carpet bomber. Rips through enemy structures, targeting critical infrastructure. unit.revenant.description = A heavy, hovering missile array. +block.message.description = Stores a message. Used for communication between allies. block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Reduces sand with pure coal. Produces silicon. @@ -950,10 +1142,13 @@ block.power-source.description = Infinitely outputs power. Sandbox only. block.item-source.description = Infinitely outputs items. Sandbox only. block.item-void.description = Destroys any items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. +block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. +block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. block.thorium-wall.description = A strong defensive block.\nDecent protection from enemies. block.thorium-wall-large.description = A strong defensive block.\nDecent protection from enemies.\nSpans multiple tiles. block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. @@ -973,6 +1168,7 @@ block.junction.description = Acts as a bridge for two crossing conveyor belts. U block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. block.sorter.description = Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[] block.distributor.description = An advanced router. Splits items to up to 7 other directions equally. block.overflow-gate.description = A combination splitter and router. Only outputs to the left and right if the front path is blocked. @@ -982,6 +1178,7 @@ block.rotary-pump.description = An advanced pump. Pumps more liquid, but require block.thermal-pump.description = The ultimate pump. block.conduit.description = Basic liquid transport block. Moves liquids forward. Used in conjunction with pumps and other conduits. block.pulse-conduit.description = An advanced liquid transport block. Transports liquids faster and stores more than standard conduits. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. block.liquid-tank.description = Stores a large amount of liquids. Use for creating buffers in situations with non-constant demand of materials or as a safeguard for cooling vital blocks. block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. @@ -990,6 +1187,7 @@ block.phase-conduit.description = Advanced liquid transport block. Uses power to block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. block.power-node-large.description = An advanced power node with greater range and more connections. block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. @@ -1030,6 +1228,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.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.command-center.description = Issues movement commands to allied units across the map.\nCauses units to rally, 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.spirit-factory.description = Produces Spirit structural repair drones. block.phantom-factory.description = Produces advanced construction drones. @@ -1047,4 +1246,4 @@ block.tau-mech-pad.description = Provides transformation into an advanced suppor block.omega-mech-pad.description = Provides transformation into a heavily-armored missile mech.\nUse by tapping while standing on it. block.javelin-ship-pad.description = Provides transformation into a quick, lightly-armored interceptor.\nUse by tapping while standing on it. block.trident-ship-pad.description = Provides transformation into a heavy support bomber.\nUse by tapping while standing on it. -block.glaive-ship-pad.description = Provides transformation into a large, well-armored gunship.\nUse by tapping while standing on it. \ No newline at end of file +block.glaive-ship-pad.description = Provides transformation into a large, well-armored gunship.\nUse by tapping while standing on it. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index c19a342364..7ed9a40cf2 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -12,6 +12,7 @@ link.itch.io.description = Page itch.io avec lien de téléchargement pour PC link.google-play.description = Google Play Store link.f-droid.description = Catalogue F-Droid link.wiki.description = Le wiki officiel de Mindustry +link.feathub.description = Suggérer de nouvelles fonctionnalités linkfail = Erreur lors de l'ouverture du lien !\nL'URL a été copiée dans votre presse papier. screenshot = Capture d'écran sauvegardée à {0} screenshot.invalid = La carte est trop large, il n'y a potentiellement pas assez de mémoire pour la capture d'écran. @@ -26,6 +27,14 @@ load.image = Images load.content = Contenu load.system = Système load.mod = Mods +load.scripts = Scripts + +be.update = Une nouvelle version en developement est disponible: +be.update.confirm = Téléchargez-la et redémarrez maintenant ? +be.updating = Mise à jour... +be.ignore = Ignorer +be.noupdates = Aucune mise à jour trouvée. +be.check = Vérifiez les mises à jour schematic = Schéma schematic.add = Sauvegarder le schéma... @@ -94,24 +103,29 @@ mods = Mods mods.none = [LIGHT_GRAY]Aucun mod trouvé! mods.guide = Guide de Modding mods.report = Signaler un Bug -mods.openfolder = Open Mod Folder +mods.openfolder = Ouvrir le dossier des mods mod.enabled = [lightgray]Activé mod.disabled = [scarlet]Désactivé mod.disable = Désactiver -mod.delete.error = Unable to delete mod. File may be in use. +mod.delete.error = Impossible de supprimer le mod. Le fichier est probablement en cours d'utilisation. mod.requiresversion = [scarlet]Version du jeu requise : [accent]{0} mod.missingdependencies = [scarlet]Dépendances manquantes: {0} +mod.erroredcontent = [scarlet]Erreurs de contenu +mod.errors = Des erreurs se sont produites lors du chargement du contenu. +mod.noerrorplay = [scarlet]Vous avez des mods avec erreurs.[] Désactivez les mods concernés ou corrigez les erreurs avant de jouer. mod.nowdisabled = [scarlet]Le mod '{0}' a des dépendances manquantes:[accent] {1}\n[lightgray]Ces mods doivent d'abord être téléchargés.\nCe mod sera automatiquement désactivé. mod.enable = Activer mod.requiresrestart = Le jeu va maintenant s'arrêter pour appliquer les modifications du mod. mod.reloadrequired = [scarlet]Rechargement requis mod.import = Importer un mod mod.import.github = Importer un mod GitHub +mod.item.remove = Cet objet fait partie du mod[accent] '{0}'[]. Pour le supprimer, désinstallez le mod en question. mod.remove.confirm = Ce mod sera supprimé. mod.author = [LIGHT_GRAY]Auteur:[] {0} mod.missing = Cette sauvegarde contient des mods que vous avez récemment mis à jour ou que vous avez désinstallés. Votre sauvegarde risque d'être corrompue. Êtes-vous sûr de vouloir l'importer?\n[lightgray]Mods:\n{0} mod.preview.missing = Avant de publier ce mod dans le workshop, vous devez ajouter une image servant d'aperçu.\nPlacez une image nommée[accent] preview.png[] dans le dossier du mod et réessayez. mod.folder.missing = Seuls les mods sous forme de dossiers peuvent être publiés sur l'atelier.\nPour convertir n'importe quel mod en un dossier, dézippez-le tout simplement dans un dossier et supprimez l'ancien zip, puis redémarrez votre jeu ou rechargez vos mods. +mod.scripts.unsupported = Votre appareil ne prend pas en charge les scripts de mod. Certains mods ne fonctionneront pas correctement. about.button = À propos name = Nom: @@ -141,6 +155,7 @@ server.kicked.nameEmpty = Votre nom est invalide. server.kicked.idInUse = Vous êtes déjà sur ce serveur! Se connecter avec deux comptes n'est pas permis. server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Téléchargez une version officielle. server.kicked.gameover = Game over! +server.kicked.serverRestarting = Le serveur est en train de redémarrer. server.versions = Votre version:[accent] {0}[]\nVersion du serveur:[accent] {1}[] host.info = Le bouton [accent]Héberger[] héberge un serveur sur le port [scarlet]6567[]. \nN'importe qui sur le même [lightgray]wifi ou réseau local []devrait voir votre serveur sur leur liste des serveurs.\n\nSi vous voulez que les gens puissent s'y connecter de partout à l'aide de votre IP, [accent]le transfert de port (port forwarding)[] est requis.\n\n[lightgray]Note: Si quelqu'un a des problèmes de connexion à votre partie LAN, vérifiez que vous avez autorisé l'accès à Mindustry sur votre réseau local dans les paramètres de votre pare-feu. join.info = Ici vous pouvez entrez [accent]l'adresse IP d'un serveur []pour s'y connecter, ou découvrir un serveur en [accent]réseau local[].\nLe multijoueur en LAN ainsi qu'en WAN est supporté.\n\n[lightgray]Note: Il n'y a pas de liste de serveurs globaux automatiques; Si vous voulez vous connectez à quelqu'un par IP, il faudra d'abord demander à l'hébergeur leur IP. @@ -628,6 +643,7 @@ setting.screenshake.name = Tremblement de l'écran setting.effects.name = Afficher les effets setting.destroyedblocks.name = Afficher les Blocs Détruits setting.conveyorpathfinding.name = Recherche de Chemin pour le Placement de Convoyeurs +setting.coreselect.name = Autoriser les schémas contenant des Noyaux setting.sensitivity.name = Sensibilité de la manette setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} secondes @@ -739,6 +755,7 @@ rules.enemyCheat = Ressources infinies pour l'IA rules.unitdrops = Drops des unités rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction d'Unités rules.unithealthmultiplier = Multiplicateur de Santé des Unités +rules.blockhealthmultiplier = Multiplicateur de Santé de Bloc rules.playerhealthmultiplier = Multiplicateur de Santé des Joueurs rules.playerdamagemultiplier = Multiplicateur des Dégâts Joueurs rules.unitdamagemultiplier = Multiplicateur des dégâts Unité @@ -961,6 +978,7 @@ block.mechanical-pump.name = Pompe Mécanique block.item-source.name = Source de Ressources block.item-void.name = Destructeur de Ressources block.liquid-source.name = Source de Liquide +block.liquid-void.name = Vaporisateur de Liquide block.power-void.name = Absorbeur Énergétique block.power-source.name = Énergie Infinie block.unloader.name = Déchargeur @@ -1124,6 +1142,7 @@ block.power-source.description = Produit de l'énergie à l'infini. Bac à sable block.item-source.description = Produit des objets à l'infini. Bac à sable uniquement . block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur sans utiliser d'énergie. Bac à sable uniquement. block.liquid-source.description = Source de liquide infinie . Bac à sable uniquement. +block.liquid-void.description = Détruit n'importe quel liquide. Bac à sable uniquement. block.copper-wall.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles dans les premières lors des premières vagues. block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles dans les premières lors des premières vagues.\n2 x 2. block.titanium-wall.description = Un bloc défensif standard.\nProcure une protection modérée contre les ennemis. diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index 9510ce227d..0bf1cdb539 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -10,7 +10,9 @@ link.dev-builds.description = Versions instables de développement link.trello.description = Trello officiel pour les fonctionnalités planifiées. link.itch.io.description = Site itch.io avec les versions téléchargeables pour ordinateur. link.google-play.description = Page Google Play du jeu +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Wiki officiel de Mindustry +link.feathub.description = Suggest new features linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier. screenshot = Capture d'écran enregistrée sur {0} screenshot.invalid = Carte trop grande, potentiellement pas assez de mémoire pour la capture d'écran. @@ -18,12 +20,22 @@ gameover = Le base a été détruite. gameover.pvp = L'équipe[accent] {0}[] a gagnée ! highscore = [accent]Nouveau meilleur score ! copied = Copied. + load.sound = Son load.map = Maps load.image = Images load.content = Contenu load.system = Système load.mod = Mods +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -40,6 +52,7 @@ schematic.saved = Schematic saved. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks + stat.wave = Vagues vaincues:[accent] {0} stat.enemiesDestroyed = Ennemies détruits:[accent] {0} stat.built = Bâtiments construits:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = Bâtiments détruits:[accent] {0} stat.deconstructed = Bâtiments déconstruits:[accent] {0} stat.delivered = Ressources transférées: stat.rank = Rang Final: [accent]{0} + launcheditems = [accent]Ressources transférées launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"? @@ -74,6 +88,7 @@ maps.browse = Browse Maps continue = Continue maps.none = [LIGHT_GRAY]Aucune carte trouvée! invalid = Invalid +pickcolor = Pick Color preparingconfig = Preparing Config preparingcontent = Preparing Content uploadingcontent = Uploading Content @@ -81,6 +96,7 @@ uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Done feature.unsupported = Your device does not support this feature. + mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. mods.alpha = [accent](Alpha) mods = Mods @@ -92,18 +108,25 @@ mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required mod.import = Import Mod mod.import.github = Import GitHub Mod +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = This mod will be deleted. mod.author = [LIGHT_GRAY]Author:[] {0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = À propos name = Nom: noname = Choisissez d'abord [accent]un pseudo[]. @@ -132,6 +155,7 @@ server.kicked.nameEmpty = Votre nom doit contenir au moins une lettre ou un chif server.kicked.idInUse = Vous êtes déjà sur ce serveur ! Se connecter avec deux comptes n'est pas permis ! server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Télécharger une version officielle. server.kicked.gameover = Vous avez perdu ! +server.kicked.serverRestarting = The server is restarting. server.versions = Votre version:[accent] {0}[]\nVersion du serveur:[accent] {1}[] host.info = Le bouton [accent]héberger[] héberge un serveur sur les ports [scarlet]6567[] et [scarlet]6568.[]\nN'importe qui sur le même [LIGHT_GRAY]réseau wifi ou local[] devrait pouvoir voir votre serveur dans sa liste de serveurs.\n\nSi vous voulez que les gens puissent se connecter de n'importe où grâce à l'IP, [accent]rediriger les ports[] est requis.\n\n[LIGHT_GRAY]Note:Si quelqu'un éprouve des difficultés à se connecter à votre partie LAN, assurez-vous que vous avez autorisé Mindustry à accéder à votre réseau local dans les paramètres de votre pare-feu. join.info = Ici, vous pouvez entrer l' [accent]IP d'un serveur[] pour s'y connecter, ou découvrir les serveurs[accent]sur votre réseau local[] pour s'y connecter.\nLes parties multijoueur LAN et WAN sont toutes deux supportées.\n\n[LIGHT_GRAY]Note: Aucune liste globale des serveurs n'est génerée automatiquement: si vous voulez vous connecter à un serveur par IP, vous devrez demander l'IP à l'hébergeur. @@ -271,6 +295,7 @@ publishing = [accent]Publishing... publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.error = Error publishing item: {0} steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = Pinceau editor.openin = Ouvrir dans l'éditeur editor.oregen = Génération des minerais @@ -347,6 +372,7 @@ editor.overwrite = [accent]Attention!\nCela écrasera 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.exists = A map with this name already exists. editor.selectmap = Sélectionnez une carte à charger: + toolmode.replace = Remplacer toolmode.replace.description = Dessine uniquement sur des blocs pleins. toolmode.replaceall = Remplacer tout @@ -361,6 +387,7 @@ toolmode.fillteams = Remplir les équipes toolmode.fillteams.description = Remplissez les équipes au lieu de blocs. toolmode.drawteams = Tirage au sort des équipes toolmode.drawteams.description = Dessinez des équipes au lieu de blocs. + filters.empty = [LIGHT_GRAY]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous. filter.distort = Déformation filter.noise = Bruit @@ -392,6 +419,7 @@ filter.option.floor2 = Sol secondaire filter.option.threshold2 = Seuil secondaire filter.option.radius = Rayon filter.option.percentile = Centile + width = Largeur: height = Hauteur: menu = Menu @@ -407,6 +435,7 @@ tutorial = Tutoriel tutorial.retake = Re-Take Tutorial editor = Éditeur mapeditor = Éditeur de carte + abandon = Abandonner abandon.text = Cette zone et toutes ses ressources seront perdues. locked = Verrouillé @@ -437,6 +466,7 @@ zone.objective.survival = Survive zone.objective.attack = Détruire la base ennemi add = Ajouter... boss.health = Vie du BOSS + connectfail = [crimson]Échec de la connexion au serveur: [accent]{0} error.unreachable = Serveur inaccessible. error.invalidaddress = Adresse invalide. @@ -447,6 +477,7 @@ error.mapnotfound = Fichier de carte introuvable ! error.io = Network I/O error. error.any = Erreur réseau inconnue. error.bloom = Échec d'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter. + zone.groundZero.name = Première Bataille zone.desertWastes.name = Déchets du désert zone.craters.name = Les Cratères @@ -461,6 +492,7 @@ zone.saltFlats.name = Salière zone.impact0078.name = Impact 0078 zone.crags.name = Crags zone.fungalPass.name = Fungal Pass + zone.groundZero.description = L'emplacement optimal pour recommencer. Faible menace ennemie. Peu de ressources.\nRassemblez autant de plomb et de cuivre que possible.\nAllons-y zone.frozenForest.description = Même ici, plus près des montagnes, les spores se sont propagées. Les températures glaciales ne peuvent pas les contenir pour toujours.\n\nCommencez l'aventure au pouvoir. Construire des générateurs de combustion. Apprenez à utiliser les réparations. zone.desertWastes.description = Ces déchets sont vastes, imprévisibles, et sillonné de structures du secteur désaffectés.\nLe charbon est présent dans la région. Brulez-le pour obtenir de l'énergie ou synthétisez du graphite.\n\n[lightgray]Ce lieu d'atterrissage ne peut être garanti. @@ -475,10 +507,12 @@ 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.impact0078.description = zone.crags.description = + settings.language = Langage settings.data = Game Data settings.reset = Valeur par défaut. settings.rebind = Réatttribuer +settings.resetKey = Reset settings.controls = Contrôles settings.game = Jeu settings.sound = Son @@ -529,6 +563,7 @@ blocks.inaccuracy = Précision blocks.shots = Tirs blocks.reload = Tirs/Seconde blocks.ammo = Munition + bar.drilltierreq = Better Drill Required bar.drillspeed = Vitesse de forage: {0}/s bar.pumpspeed = Pump Speed: {0}/s @@ -544,6 +579,9 @@ bar.heat = Chaleur bar.power = Énergie bar.progress = Progression de la construction bar.spawned = Unités: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] dégats bullet.splashdamage = [stat]{0}[lightgray] dgt zone ~[stat] {1}[lightgray] tuiles bullet.incendiary = [stat]incendiaire @@ -555,6 +593,7 @@ bullet.freezing = [stat]gel bullet.tarred = [stat]goudronné bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions bullet.reload = [stat]{0}[lightgray]x vitesse de rechargement + unit.blocks = Blocs unit.powersecond = Énergie/seconde unit.liquidsecond = Liquides/seconde @@ -567,6 +606,8 @@ unit.persecond = /sec unit.timesspeed = x vitesse unit.percent = % unit.items = Objets +unit.thousands = k +unit.millions = mil category.general = Général category.power = Énergie category.liquids = Liquides @@ -579,6 +620,7 @@ setting.shadows.name = Ombres setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Filtrage linéaire setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Eau animée setting.animatedshields.name = Boucliers Animés setting.antialias.name = Antialias[LIGHT_GRAY] (demande le redémarrage de l'appareil)[] @@ -601,12 +643,16 @@ setting.screenshake.name = Tremblement d'écran setting.effects.name = Montrer les effets setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Contôle de la sensibilité setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} Secondes +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Plein écran setting.borderlesswindow.name = Fenêtre sans bordure[LIGHT_GRAY] (peut nécessiter un redémarrage) setting.fps.name = Afficher FPS +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixélisé [LIGHT_GRAY](peut diminuer les performances)[] setting.minimap.name = Montrer la minimap @@ -635,16 +681,36 @@ category.multiplayer.name = Multijoueur command.attack = Attaquer command.rally = Rally command.retreat = Retraite +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Clear Building keybind.press = Appuyez sur une touche ... keybind.press.axis = Appuyez sur un axe ou une touche... keybind.screenshot.name = Map Screenshot +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Mouvement X keybind.move_y.name = Mouvement Y +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Sprint keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_y.name = Flip Schematic Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Basculer en plein écran keybind.select.name = Sélectionner/Tirer keybind.diagonal_placement.name = Placement en diagonal @@ -657,7 +723,6 @@ keybind.menu.name = Menu keybind.pause.name = Pause keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Mini-Map -keybind.dash.name = Sprint keybind.chat.name = Tchat keybind.player_list.name = Liste des joueurs keybind.console.name = Console @@ -680,7 +745,9 @@ mode.pvp.description = Lutter contre d'autres joueurs pour gagner ! mode.attack.name = Attaque mode.attack.description = Pas de vagues, le but est de détruire la base ennemie. mode.custom = Règles personnalisées + rules.infiniteresources = Ressources infinies +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Temps de vague rules.waves = Vague rules.attack = Mode attaque @@ -688,6 +755,7 @@ rules.enemyCheat = Ressources infinies pour l'IA rules.unitdrops = Uniter Drops rules.unitbuildspeedmultiplier = Multiplicateur de vitesse de création d'unités rules.unithealthmultiplier = Multiplicateur de la santé des unités +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Multiplicateur de la santé des joueurs rules.playerdamagemultiplier = Multiplicateur de dégât des joueurs rules.unitdamagemultiplier = Multiplicateur de dégât des unités @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = Ressources & Bâtiment rules.title.player = Joueurs rules.title.enemy = Ennemis rules.title.unit = Unités +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Objets content.liquid.name = Liquides content.unit.name = Unités @@ -717,7 +789,7 @@ item.coal.name = Charbon item.graphite.name = Graphite item.titanium.name = Titane item.thorium.name = Thorium -item.silicon.name = Silicone +item.silicon.name = Silicium item.plastanium.name = Plastanium item.phase-fabric.name = Phase Fabric item.surge-alloy.name = Alliage superchargé @@ -752,6 +824,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Largage de bombe mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Fusil automatique incendiaire +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [LIGHT_GRAY]Explosivité: {0} item.flammability = [LIGHT_GRAY]Inflammabilité: {0} item.radioactivity = [LIGHT_GRAY]Radioactivité: {0} @@ -767,6 +840,7 @@ mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique {0} liquid.viscosity = [LIGHT_GRAY]Viscosité: {0} liquid.temperature = [LIGHT_GRAY]Température: {0} + block.sand-boulder.name = Sable rocheux block.grass.name = Herbe block.salt.name = Sel @@ -865,8 +939,10 @@ block.distributor.name = [accent]Distributeur[] block.sorter.name = Trieur block.inverted-sorter.name = Inverted Sorter block.message.name = Message +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Barrière de Débordement -block.silicon-smelter.name = Fonderie de silicone +block.silicon-smelter.name = Fonderie de silicium block.phase-weaver.name = Tisseur à phase block.pulverizer.name = Pulvérisateur block.cryofluidmixer.name = Refroidisseur @@ -878,6 +954,7 @@ block.coal-centrifuge.name = Centrifugeuse à charbon block.power-node.name = Transmetteur énergétique block.power-node-large.name = Grand transmetteur énergétique block.surge-tower.name = Tour de surtension +block.diode.name = Battery Diode block.battery.name = Batterie block.battery-large.name = Batterie large block.combustion-generator.name = Générateur à combustion @@ -901,6 +978,7 @@ block.mechanical-pump.name = Pompe Méchanique block.item-source.name = Source d'objets block.item-void.name = Destructeur d'objets block.liquid-source.name = Source de liquide +block.liquid-void.name = Liquid Void block.power-void.name = Absorbeur énergétique block.power-source.name = Puissance infinie block.unloader.name = Déchargeur @@ -930,6 +1008,7 @@ block.fortress-factory.name = Usine de "Forteresse" block.revenant-factory.name = Usine de "Revenants" block.repair-point.name = Point de Réparation block.pulse-conduit.name = Conduit à Impulsion +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Conduit à Phase block.liquid-router.name = Routeur de Liquide block.liquid-tank.name = Réservoir de Liquide @@ -1001,6 +1080,7 @@ tutorial.deposit = Déposez les éléments dans des blocs en les faisant glisser tutorial.waves = Les [LIGHT_GRAY]ennemies[] approchent.\n\nDéfendez votre base durant 2 vagues.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre. tutorial.waves.mobile = [lightgray]Les ennemies approchent[].\n\nDéfendez votre base durant 2 vagues. Votre vaisseau tirera automatiquement sur les ennemis.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre. tutorial.launch = Une fois que vous atteignez une vague spécifique, vous êtes en mesure de[accent] lancer votre base[], laissant vos défenses derrière vous et[accent] en obtenant toutes les ressources de votre base.[]\nCes ressources peuvent ensuite servir à la recherche de nouvelles technologies.\n\n[accent]Appuyez sur le bouton de lancement. + item.copper.description = Un matériau de construction utile. Utilisé intensivement dans tout les blocs. item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et pour le transport de blocs. item.metaglass.description = Un composé de verre très résistant. Utilisation intensive pour la distribution et le stockage de liquides. @@ -1062,6 +1142,7 @@ block.power-source.description = Débit infini d'énergie. Bac à sable seulemen block.item-source.description = Sort infiniment les articles. Bac à sable seulement. block.item-void.description = Détruit tous les objets qui y entrent sans utiliser d'énergie. Bac à sable seulement. block.liquid-source.description = Débit infini de liquides. Bac à sable seulement. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = Un bloc défensif bon marché.\nUtile pour protéger le noyau et les tourelles lors des premières vagues. block.copper-wall-large.description = Un bloc défensif bon marché.\nUtile pour protéger le noyau et les tourelles lors des premières vagues.\nS'étend sur plusieurs tuiles. block.titanium-wall.description = Un bloc défensif modérément fort.\nFournit une protection modérée contre les ennemis. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = Une pompe avancée qui double la vitesse en util block.thermal-pump.description = La pompe ultime. Trois fois plus rapide qu'une pompe mécanique et la seule pompe capable de récupérer de la lave. block.conduit.description = Bloc de transport liquide de base. Fonctionne comme un convoyeur, mais avec des liquides. Utilisation optimale avec des extracteurs, des pompes ou d’autres conduits. block.pulse-conduit.description = Bloc de transport de liquide avancé. Transporte les liquides plus rapidement et stocke plus que des conduits standard. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Accepte les liquides d'une direction et les envoie dans 3 autres directions de manière égale. Peut également stocker une certaine quantité de liquide. Utile pour séparer les liquides d'une source à plusieurs cibles. block.liquid-tank.description = Stocke une grande quantité de liquides. Utilisez-le pour créer des tampons en cas de demande non constante de matériaux ou comme protection pour le refroidissement des blocs vitaux. block.liquid-junction.description = Agit comme un pont pour deux conduits de croisement. Utile dans les situations avec deux conduits différents transportant des liquides différents à des endroits différents. @@ -1105,6 +1187,7 @@ block.phase-conduit.description = Bloc de transport de liquide avancé. Utilise block.power-node.description = Transmet la puissance à des noeuds connectés. Il est possible de connecter jusqu'à quatre sources d'alimentation, puits ou nœuds.\nLe nœud recevra de l’alimentation ou fournira l’alimentation à tous les blocs adjacents. block.power-node-large.description = Son rayon d'action est supérieur à celui du nœud d'alimentation et peut être connecté à six sources d'alimentation, puits ou nœuds au maximum. block.surge-tower.description = Un nœud d'alimentation extrêmement longue portée avec moins de connexions disponibles. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Stocke l’énergie chaque fois qu’il ya abondance et en cas de pénurie, tant qu’il reste de la capacité. block.battery-large.description = Stocke beaucoup plus d'énergie qu'une batterie ordinaire. block.combustion-generator.description = Génère de l'énergie en brûlant du pétrole ou des matériaux inflammables. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 73fff980c3..aae63ed889 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -10,7 +10,9 @@ link.dev-builds.description = Bentuk pengembangan (kurang stabil) link.trello.description = Papan Trello resmi untuk fitur terencana link.itch.io.description = Halaman itch.io dengan PC download dan versi web link.google-play.description = Google Play Store +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Wiki Mindustry resmi +link.feathub.description = Suggest new features linkfail = Gagal membuka tautan!\nURL disalin ke papan ke papan klip. screenshot = Tangkapan layar disimpan di {0} screenshot.invalid = Peta terlalu besar, tidak cukup memori untuk menangkap layar. @@ -18,12 +20,22 @@ gameover = Permainan Habis gameover.pvp = Tim[accent] {0}[] menang! highscore = [accent]Rekor Baru! copied = Copied. + load.sound = Suara load.map = Peta load.image = Gambar load.content = Konten load.system = Sistem load.mod = Mods +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -40,6 +52,7 @@ schematic.saved = Schematic saved. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks + stat.wave = Gelombang Terkalahkan:[accent] {0} stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0} stat.built = Jumlah Blok yang Dibangun:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = Jumlah Blok Dihancurkan Musuh:[accent] {0} stat.deconstructed = Jumlah Blok Dihancurkan Pemain:[accent] {0} stat.delivered = Sumber Daya yang Diluncurkan: stat.rank = Nilai Akhir: [accent]{0} + launcheditems = [accent]Sumber Daya launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"? @@ -74,6 +88,7 @@ maps.browse = Cari Peta continue = Lanjutkan maps.none = [LIGHT_GRAY]Peta tidak ditemukan! invalid = Tidak valid +pickcolor = Pick Color preparingconfig = Menyiapkan Config preparingcontent = Menyiapkan Content uploadingcontent = Mengupload Content @@ -81,6 +96,7 @@ uploadingpreviewfile = Mengupload File Tinjauan committingchanges = Membuat Perubahan done = Selesai feature.unsupported = Your device does not support this feature. + mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. mods.alpha = [accent](Alpha) mods = Mods @@ -92,18 +108,25 @@ mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required mod.import = Import Mod mod.import.github = Import GitHub Mod +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = This mod will be deleted. mod.author = [LIGHT_GRAY]Author:[] {0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Tentang name = Nama: noname = Pilih[accent] nama pemain[] dahulu. @@ -132,6 +155,7 @@ server.kicked.nameEmpty = Nama yang dipilih tidak valid. server.kicked.idInUse = Anda telah berada di server ini! Memasuki dengan dua akun tidak diizinkan. server.kicked.customClient = Server ini tidak mendukung versi modifikasi. Download versi resmi. server.kicked.gameover = Game over! +server.kicked.serverRestarting = The server is restarting. server.versions = Versi Anda:[accent] {0}[]\nVersi server:[accent] {1}[] host.info = Tombol [accent]host[] akan membuat server sementara di port [scarlet]6567[]. \nSemua orang yang memiliki [LIGHT_GRAY]Wi-Fi atau jaringan lokal[] akan bisa melihat server anda di daftar server mereka.\n\nJika Anda ingin pemain dari mana saja memasuki servermu dengan IP, [accent]port forwarding[] dibutuhkan.\n\n[LIGHT_GRAY]Diingat: Jika seseorang mengalami masalah memasuki permainan LAN mu, pastikan Anda telah mengizinkan Mindustry akses ke jaringan lokalmu di pengaturan firewall. join.info = Disini, Anda bisa memasuki [accent]server IP[], atau menemukan [accent]server lokal[] untuk bermain bersama.\nLAN dan WAN mendukung permainan bersama.\n\n[LIGHT_GRAY]Diingat: Tidak ada daftar server global; jika anda ingin bergabung dengan seseorang memakai IP, Anda perlu menanyakan host tentang IP mereka. @@ -271,6 +295,7 @@ publishing = [accent]Publishing... publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.error = Error publishing item: {0} steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = Kuas editor.openin = Buka di Penyunting editor.oregen = Generasi Sumber Daya @@ -347,6 +372,7 @@ editor.overwrite = [accent]Peringatan!\nIni menindih peta yang telah ada. editor.overwrite.confirm = [scarlet]Peringatan![] Peta dengan nama ini sudah ada. Yakin ingin menindihnya? editor.exists = A map with this name already exists. editor.selectmap = Pilih peta untuk dimuat: + toolmode.replace = Replace toolmode.replace.description = Draws only on solid blocks. toolmode.replaceall = Replace All @@ -361,6 +387,7 @@ toolmode.fillteams = Fill Teams toolmode.fillteams.description = Fill teams instead of blocks. toolmode.drawteams = Draw Teams toolmode.drawteams.description = Draw teams instead of blocks. + filters.empty = [LIGHT_GRAY]Tidak ada filter! Tambahkan dengan tombol dibawah. filter.distort = Rusakkan filter.noise = Kebisingan @@ -392,6 +419,7 @@ filter.option.floor2 = Lantai Sekunder filter.option.threshold2 = Ambang Sekunder filter.option.radius = Radius filter.option.percentile = Perseratus + width = Lebar: height = Tinggi: menu = Menu @@ -407,6 +435,7 @@ tutorial = Tutorial tutorial.retake = Re-Take Tutorial editor = Penyunting mapeditor = Penyunting Peta + abandon = Tinggalkan abandon.text = Zona ini dan semua sumber daya didalamnya akan berada di tangan musuh. locked = Dikunci @@ -437,6 +466,7 @@ zone.objective.survival = Survive zone.objective.attack = Destroy Enemy Core add = Menambahkan... boss.health = Darah Boss + connectfail = [crimson]Gagal menyambung ke server:\n\n[accent]{0} error.unreachable = Server tak terjangkau.\nApakah alamatnya benar? error.invalidaddress = Alamat tidak valid. @@ -447,6 +477,7 @@ error.mapnotfound = File peta tidak ditemaukan! error.io = Error jaringan I/O. error.any = Jaringan error tidak diketahui. error.bloom = Failed to initialize bloom.\nYour device may not support it. + zone.groundZero.name = Titik Nol zone.desertWastes.name = Gurun Gersang zone.craters.name = Kawah @@ -461,6 +492,7 @@ zone.saltFlats.name = Salt Flats zone.impact0078.name = Impact 0078 zone.crags.name = Crags 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.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.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. @@ -475,10 +507,12 @@ 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.impact0078.description = zone.crags.description = + settings.language = Bahasa settings.data = Game Data settings.reset = Atur ulang ke Default (standar) settings.rebind = Rebind +settings.resetKey = Reset settings.controls = Kontrol settings.game = Permainan settings.sound = Suara @@ -529,6 +563,7 @@ blocks.inaccuracy = Jarak Melenceng blocks.shots = Tembakan blocks.reload = Tembakan/Detik blocks.ammo = Amunisi + bar.drilltierreq = Better Drill Required bar.drillspeed = Kecepatan Bor: {0}/s bar.pumpspeed = Pump Speed: {0}/s @@ -544,6 +579,9 @@ bar.heat = Panas bar.power = Tenaga bar.progress = Perkembangan Pembangunan bar.spawned = Unit: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] kekuatan (dmg) bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] kotak bullet.incendiary = [stat]pembakar @@ -555,6 +593,7 @@ bullet.freezing = [stat]membeku bullet.tarred = [stat]tar bullet.multiplier = [stat]{0}[lightgray]x multiplikasi amunisi bullet.reload = [stat]{0}[lightgray]x rasio menembak + unit.blocks = blok unit.powersecond = unit tenaga/detik unit.liquidsecond = unit zat cair/detik @@ -567,6 +606,8 @@ unit.persecond = /detik unit.timesspeed = x kecepatan unit.percent = % unit.items = item +unit.thousands = k +unit.millions = mil category.general = Umum category.power = Tenaga category.liquids = Zat Cair @@ -579,6 +620,7 @@ setting.shadows.name = Bayangan setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linier Filter setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animasi Air setting.animatedshields.name = Animasi Lindungan setting.antialias.name = Antialiasi[LIGHT_GRAY] (membutuhkan restart)[] @@ -601,12 +643,16 @@ setting.screenshake.name = Layar Getar setting.effects.name = Munculkan Efek setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Sensitivitas Kontroler setting.saveinterval.name = Jarak Menyimpan setting.seconds = {0} Detik +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Layar Penuh setting.borderlesswindow.name = Jendela tak Berbatas[LIGHT_GRAY] (bisa membutuhkan restart) setting.fps.name = Tunjukkan FPS +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Mode Pixel[LIGHT_GRAY] (menonaktifkan animasi) setting.minimap.name = Tunjukkan Peta kecil @@ -635,16 +681,36 @@ category.multiplayer.name = Bermain Bersama command.attack = Serang command.rally = Rally command.retreat = Mundur +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Clear Building keybind.press = Tekan kunci... keybind.press.axis = Tekan sumbu atau kunci... keybind.screenshot.name = Tangkapan Layar Peta +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Pindah x keybind.move_y.name = Pindah y +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Terbang keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_y.name = Flip Schematic Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Toggle Fullscreen keybind.select.name = Pilih/Tembak keybind.diagonal_placement.name = Penaruhan Diagonal @@ -657,7 +723,6 @@ keybind.menu.name = Menu keybind.pause.name = Jeda keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Peta Kecil -keybind.dash.name = Terbang keybind.chat.name = Chat keybind.player_list.name = Daftar pemain keybind.console.name = Console @@ -680,7 +745,9 @@ mode.pvp.description = Melawan Pemain lain. Membutuhkan setidaknya 2 inti berbed mode.attack.name = Penyerangan mode.attack.description = Menghancurkan base musuh. Tidak ada gelombang. Membutuhkan inti merah di dalam peta untuk main. mode.custom = Pengaturan Modifikasi + rules.infiniteresources = Sumber Daya Tak Terbatas +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Pengaturan Waktu Gelombang rules.waves = Gelombang rules.attack = Attack Mode @@ -688,6 +755,7 @@ rules.enemyCheat = Sumber Daya A.I Musuh (Tim Merah) Tak Terbatas rules.unitdrops = Munculnya Unit rules.unitbuildspeedmultiplier = Multiplikasi Kecepatan Munculnya Unit rules.unithealthmultiplier = Multiplikasi Darah Unit +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Multiplikasi Darah Pemain rules.playerdamagemultiplier = Multiplikasi Kekuatan Pemain rules.unitdamagemultiplier = Multiplikasi Kekuatan Unit @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = Sumber Daya & Bangunan rules.title.player = Pemain rules.title.enemy = Musush rules.title.unit = Unit +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Item content.liquid.name = Zat Cair content.unit.name = Unit @@ -752,6 +824,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Lahan Bom mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Repeater Api +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [LIGHT_GRAY]Tingkat Keledakan: {0}% item.flammability = [LIGHT_GRAY]Tingkat Kebakaran: {0}% item.radioactivity = [LIGHT_GRAY]Tingkat Radioaktif: {0}% @@ -767,6 +840,7 @@ mech.buildspeed = [LIGHT_GRAY]Kecepatan Membangun: {0}% liquid.heatcapacity = [LIGHT_GRAY]Kapasitas Panas: {0} liquid.viscosity = [LIGHT_GRAY]Kelekatan: {0} liquid.temperature = [LIGHT_GRAY]Suhu: {0} + block.sand-boulder.name = Sand Boulder block.grass.name = Rumput block.salt.name = Garam @@ -865,6 +939,8 @@ block.distributor.name = Distributor block.sorter.name = Penyortir block.inverted-sorter.name = Inverted Sorter block.message.name = Pesan +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Gerbang Luap block.silicon-smelter.name = Pelebur Silikon block.phase-weaver.name = Pengrajut Phase @@ -878,6 +954,7 @@ block.coal-centrifuge.name = Sentrifugal Batu Bara block.power-node.name = Tiang Listrik block.power-node-large.name = Tiang Listrik Besar block.surge-tower.name = Tiang Surge +block.diode.name = Battery Diode block.battery.name = Baterai block.battery-large.name = Baterai Besar block.combustion-generator.name = Generator Pembakar @@ -901,6 +978,7 @@ block.mechanical-pump.name = Pompa Mekanik block.item-source.name = Sumber Item block.item-void.name = Penghilang Item block.liquid-source.name = Sumber Zat Cair +block.liquid-void.name = Liquid Void block.power-void.name = Penghilang Listrik block.power-source.name = Listrik Takhingga block.unloader.name = Pembongkar Muatan @@ -930,6 +1008,7 @@ block.fortress-factory.name = Pabrik Robot Fortress block.revenant-factory.name = Pabrik Penyerang Revenant block.repair-point.name = Titik Pulih block.pulse-conduit.name = Selang Denyut +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Selang Phase block.liquid-router.name = Penyortir Zat Cair block.liquid-tank.name = Tank Zat Cair @@ -1001,6 +1080,7 @@ tutorial.deposit = Deposit items into blocks by dragging from your ship to the d tutorial.waves = [LIGHT_GRAY] Musuh[] mendatang.\n\nLindungi intimu selama 2 gelombang. Bangun lebih banyak menara. 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. + item.copper.description = Bahan struktur yang berguna. Digunakan di semua tipe blok. item.lead.description = Bahan dasar di awal permainan. Digunakan di elektronik dan blok transportasi zat cair. item.metaglass.description = Kaca yang super-kuat. Digunakan untuk distribusi zar cair dan penyimpanan. @@ -1062,6 +1142,7 @@ block.power-source.description = Menghasilkan tenaga tak terbatas. Sandbox ekskl block.item-source.description = Mengeluarkan item tak terhingga. Sandbox eksklusif. block.item-void.description = Menghancurkan item apa saja tanpa penggunaan tenaga. Sandbox eksklusif. block.liquid-source.description = Mengeluarkan zat cair tak terhingga. Sandbox eksklusif. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = Blok pelindung murah.\nBerguna untuk melindungi inti dan menara di beberapa gelombang awal. block.copper-wall-large.description = Blok pelindung murah.\nBerguna untuk melindungi inti dan menara di beberapa gelombang awal.\nSebesar 4 blok. block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = Pompa canggih yang kecepatannya dua kali lipat j block.thermal-pump.description = Pompa Tercanggih. block.conduit.description = Blok Transportasi Zat Cair Umum. Bekerja Seperti Pengantar, tetapi untuk zat cair. block.pulse-conduit.description = Blok Transportasi Zat Cair Canggih. Memindahkan dan menyimpan zat cair lebih cepat dan banyak daripada saluran biasa. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Menerima zat cair dari satu arah dan mengeluarkannya ke 3 arah yang sama. Bisa juga menyimpan sejumlah zat cair. Berguna untuk memisahkan zat cair dari satu sumber ke target yang banyak. block.liquid-tank.description = Menyimpan jumlah zat cair yang banyak. Gunakan sebagai penyangga ketika kebutuhan zat cair tidak konstan atau sebagai penjaga untuk mendinginkan blok yang vital. block.liquid-junction.description = Berguna seperti jembatan untuk dua saluran yang bersimpangan. Berguna di situasi dimana dua saluran berbeda membawa zat cair berbeda ke lokasi yang berbeda. @@ -1105,6 +1187,7 @@ block.phase-conduit.description = Blok Transportasi Zat Cair Canggih. Menggunaka block.power-node.description = Membawa tenaga ke tiang tersambung. hingga empat sumber listrik, sambungan atau tiang lainnya yang bisa disambung. Tiang akan mendapatkan atau memberi tenaga ke/dari blok yang disambung. block.power-node-large.description = Mempunyai radius lebih besar dari tiang listrik biasa dan bisa menyambung hingga enam to up to six sumber listrik, sambungan atau tiang lainnya. block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Menyimpan tenaga jika ada kelimpahan dan memberikan tenaga jika ada kekurangan, asalkan ada kapasitas tersisa. block.battery-large.description = Menyimpan lebih banyak tenaga daripada baterai biasa. block.combustion-generator.description = Menghasilkan tenaga dengan membakar oli atau pembakar. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 75351ad9a8..f7d9474c8c 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1,7 +1,7 @@ credits.text = Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Crediti contributors = Traduttori e Contributori -discord = Entra nel server Discord di mindustry! +discord = Entra nel server Discord di Mindustry! link.discord.description = La chatroom ufficiale del server Discord di Mindustry link.reddit.description = The Mindustry subreddit link.github.description = Codice sorgente del gioco @@ -12,50 +12,58 @@ link.itch.io.description = Pagina di itch.io con download per PC e versione web link.google-play.description = Elenco di Google Play Store link.f-droid.description = Catalogo F-Droid link.wiki.description = Wiki ufficiale di Mindustry -linkfail = Impossibile aprire il link! L'URL è stato copiato. +link.feathub.description = Suggerisci nuove funzionalità +linkfail = Impossibile aprire il link! L'URL è stato copiato negli appunti. screenshot = Screenshot salvato a {0} -screenshot.invalid = Mappa troppo grossa, probabilmente non c'è abbastanza memoria libera. +screenshot.invalid = Mappa troppo pesante, probabilmente non c'è abbastanza spazio sul disco. gameover = Il Nucleo è stato distrutto. -gameover.pvp = La squadra [accent] {0}[] ha vinto! -highscore = [YELLOW]Nuovo record! - +gameover.pvp = La squadra[accent] {0}[] ha vinto! +highscore = [accent]Nuovo record! copied = Copiato. + load.sound = Suoni load.map = Mappe load.image = Immagini load.content = Contenuti load.system = Sistema load.mod = Mods -load.scripts = Testi +load.scripts = Scripts + +be.update = Una nuova build Bleeding Edge è disponibile: +be.update.confirm = Vuoi scaricarla e riavviare il gioco adesso? +be.updating = Aggiornamento in corso... +be.ignore = Ignora +be.noupdates = Nessun aggiornamento disponibile. +be.check = Verifica aggiornamenti schematic = Schematica schematic.add = Salva Schematica... schematics = Schematiche schematic.replace = Una schematica con questo nome esiste già. Sostituirla? schematic.import = Importa schematica... -schematic.exportfile = Esporta file +schematic.exportfile = Esporta File schematic.importfile = Importa File -schematic.browseworkshop = Naviga sul Workshop -schematic.copy = Copia negli appunti -schematic.copy.import = Importa dagli appunti -schematic.shareworkshop = Condividi sul Workshop +schematic.browseworkshop = Naviga nel Workshop +schematic.copy = Copia negli Appunti +schematic.copy.import = Importa dagli Appunti +schematic.shareworkshop = Condividi nel Workshop schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Ruota Schematica schematic.saved = Schematica salvata. schematic.delete.confirm = Questa schematica sarà cancellata definitivamente. -schematic.rename = Rinomina schematica +schematic.rename = Rinomina Schematica schematic.info = {0}x{1}, {2} blocchi -stat.wave = Ondate sconfitte:[accent] {0} -stat.enemiesDestroyed = Nemici distrutti:[accent] {0} -stat.built = Costruzioni erette:[accent] {0} -stat.destroyed = Costruzioni distrutte:[accent] {0} -stat.deconstructed = Costruzioni smantellate:[accent] {0} -stat.delivered = Riorse lanciate: -stat.rank = Livello finale: [accent]{0} +stat.wave = Ondate Sconfitte:[accent] {0} +stat.enemiesDestroyed = Nemici Distrutti:[accent] {0} +stat.built = Costruzioni Erette:[accent] {0} +stat.destroyed = Costruzioni Distrutte:[accent] {0} +stat.deconstructed = Costruzioni Smantellate:[accent] {0} +stat.delivered = Risorse Lanciate: +stat.rank = Livello Finale: [accent]{0} launcheditems = [accent]Oggetti Lanciati -launchinfo = [unlaunched][[LAUNCH] il tuo Nucleo per ottenere gli oggetti indicati in blu. -map.delete = Sei sicuro di voler eliminare la mappa"[accent]{0}[]"? +launchinfo = [unlaunched][[LANCIA] il tuo Nucleo per ottenere gli oggetti indicati in blu. +map.delete = Sei sicuro di voler eliminare la mappa '[accent]{0}[]'? level.highscore = Miglior Punteggio: [accent]{0} level.select = Selezione del Livello level.mode = Modalità di Gioco: @@ -72,65 +80,71 @@ none = minimap = Minimappa position = Posizione close = Chiuso -website = Sito web +website = Sito Web quit = Esci -save.quit = Salva ed esci +save.quit = Salva ed Esci maps = Mappe maps.browse = Esplora Mappe continue = Continua -maps.none = [LIGHT_GRAY]Nessuna mappa trovata! +maps.none = [lightgray]Nessuna mappa trovata! invalid = Non valido -preparingconfig = Preparo la configurazione -preparingcontent = Preparo il contenuto -uploadingcontent = Carico il contenuto -uploadingpreviewfile = Carico file di anteprima -committingchanges = Applico le modifiche +pickcolor = Seleziona Colore +preparingconfig = Preparo la Configurazione +preparingcontent = Preparo il Contenuto +uploadingcontent = Carico il Contenuto +uploadingpreviewfile = Carico File di Anteprima +committingchanges = Applico le Modifiche done = Fatto feature.unsupported = Il tuo dispositivo non supporta questa funzione. -mods.alphainfo = Tieni a mente che queste Mod sono in alpha, e[scarlet] possono contenere molti bug[].\Segnala tutti i problemi che trovi su GitHub o Discord di Mindustry. +mods.alphainfo = Tieni a mente che queste mods sono in alpha e[scarlet] possono contenere molti bug[].Segnala tutti i problemi che trovi su GitHub o Discord di Mindustry. mods.alpha = [accent](Alpha) mods = Mods -mods.none = [LIGHT_GRAY]Nessuna Mod trovata! -mods.guide = Guida per il modding! +mods.none = [lightgray]Nessuna mod trovata! +mods.guide = Guida per il modding mods.report = Segnala un Bug -mods.openfolder = Apri Cartella Mod +mods.openfolder = Apri Cartella Mods mod.enabled = [lightgray]Abilitato mod.disabled = [scarlet]Disabilitato mod.disable = Disabilita -mod.delete.error = Impossibile eliminare questa Mod. Il file potrebbe essere in uso. +mod.delete.error = Impossibile eliminare questa mod. Il file potrebbe essere in uso. +mod.requiresversion = [scarlet]Versione minima richiesta: [accent]{0} mod.missingdependencies = [scarlet]Dipendenze mancanti: {0} -mod.nowdisabled = [scarlet]Alla Mod '{0}' mancano delle dipendenze:[accent] {1}\n[lightgray]Queste Mod devono essere scaricate prima.\nQuesta Mod verrà disabilitata automaticamente. +mod.erroredcontent = [scarlet]Errori di Contenuto +mod.errors = Si sono verificati degli errori durante il caricamento del contenuto. +mod.noerrorplay = [scarlet]Sono presenti delle mod con errori.[] Puoi disabilitare le mod affette oppure sistemarle prima di giocare. +mod.nowdisabled = [scarlet]Alla mod '{0}' mancano delle dipendenze:[accent] {1}\n[lightgray]Queste mods devono essere scaricate prima.\nQuesta mod verrà disabilitata automaticamente. mod.enable = Abilita mod.requiresrestart = Il gioco verrà chiuso per applicare i cambiamenti. mod.reloadrequired = [scarlet]Riavvio necessario -mod.import = Importa una Mod -mod.import.github = Importa una Mod da GitHub -mod.item.remove = Questo item fa parte della Mod[accent] '{0}'[]. Per rimuoverlo, disinstalla questa Mod. -mod.remove.confirm = Questa Mod verrà eliminata. -mod.author = [LIGHT_GRAY]Autore:[] {0} -mod.missing = Questo salvataggio contiene Mod che hai recentemente aggiornato o non hai più installate. Il salvataggio potrebbe corrompersi. Sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0} -mod.preview.missing = Prima di pubblicare questa Mod nel Workshop, devi aggiungere un immagine di copertina.\nMetti un immagine[accent] con nome preview.png[] nella cartella della Mod e riprova. -mod.folder.missing = Solo le Mod in una cartella possono essere pubblicate nel Workshop.\nPer convertire una Mod in una cartella, decomprimi i suoi file in una cartella ed elimina il vecchio zip, quindi riavvia il gioco o ricarica le tue mods. +mod.import = Importa Mod +mod.import.github = Importa Mod da GitHub +mod.item.remove = Questo item fa parte della mod[accent] '{0}'[]. Per rimuoverlo, disinstalla questa mod. +mod.remove.confirm = Questa mod verrà eliminata. +mod.author = [lightgray]Autore:[] {0} +mod.missing = Questo salvataggio contiene delle mods che hai recentemente aggiornato o non hai più installate. Il salvataggio potrebbe corrompersi. Sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0} +mod.preview.missing = Prima di pubblicare questa mod nel Workshop, devi aggiungere un immagine di copertina.\nMetti un immagine con nome[accent] preview.png[] nella cartella della mods e riprova. +mod.folder.missing = Solo le mods in una cartella possono essere pubblicate nel Workshop.\nPer convertire una mod in una cartella, decomprimi i suoi file in una cartella ed elimina il vecchio zip, quindi riavvia il gioco o ricarica le tue mods. +mod.scripts.unsupported = Il tuo dispositivo non supporta gli scripts per le mods. Alcune mods non funzioneranno correttamente. about.button = Info name = Nome: noname = Scegli un[accent] nome[] prima di unirti. -filename = Nome file: -unlocked = Nuovo blocco scoperto! +filename = Nome File: +unlocked = Nuovo contenuto sbloccato! completed = [accent]Completato -techtree = Albero scoperta -research.list = [LIGHT_GRAY]Ricerca: +techtree = Albero Scoperta +research.list = [lightgray]Ricerca: research = Ricerca -researched = [LIGHT_GRAY]{0} cercati. +researched = [lightgray]{0} cercati. players = {0} giocatori online players.single = {0} giocatori online server.closing = [accent]Chiusura server... server.kicked.kick = Sei stato cacciato dal server! server.kicked.whitelist = Non sei presente nella whitelist. server.kicked.serverClose = Server chiuso. -server.kicked.vote = Sei stato cacciato su richiesta dei giocatori. Addio. -server.kicked.clientOutdated = Versione del client obsoleta! Aggiorna il tuo gioco! +server.kicked.vote = Sei stato cacciato su richiesta dei giocatori. Tanti saluti. +server.kicked.clientOutdated = Versione del client obsoleta! Aggiorna il gioco! server.kicked.serverOutdated = Server obsoleto! Chiedi all'host di aggiornare la versione del server! server.kicked.banned = Sei stato bandito da questo server. server.kicked.typeMismatch = Questo server non è compatibile con il tuo client. @@ -141,29 +155,30 @@ server.kicked.nameEmpty = Il tuo nome deve contenere almeno un carattere. server.kicked.idInUse = Sei già su questo server! Non è permesso connettersi con due account. server.kicked.customClient = Questo server non supporta i client personalizzati. Scarica la versione ufficiale dal sito. server.kicked.gameover = Game over! -server.versions = Your version:[accent] {0}[]\nVersione server:[accent] {1}[] -host.info = Il pulsante [accent]host [] ospita un server sulla porta [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]rete wifi o locale[] dovrebbe essere in grado di vedere il server nell'elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite il tuo IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall. -join.info = Qui è possibile inserire l'[accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\nSono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco automatico dei server globali; se desideri connetterti a qualcuno tramite il suo IP, è necessario chiedere all'host il proprio IP. +server.kicked.serverRestarting = Il server si sta riavviando. +server.versions = Versione client:[accent] {0}[]\nVersione server:[accent] {1}[] +host.info = Il pulsante [accent]Ospita[] ospita un server sulla porta [scarlet]6567[].[] Chiunque sulla stessa [lightgray]rete Wi-Fi o locale[] dovrebbe essere in grado di vedere il server nell'elenco server.\nSe vuoi che le persone siano in grado di connettersi ovunque tramite il tuo IP, è richiesto il [accent]port forwarding[].\n\n[lightgray]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall. +join.info = Qui è possibile inserire l'[accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\nSono supportati sia il multiplayer LAN che WAN.\n\n[lightgray]Nota: non esiste un elenco automatico dei server globali; se desideri connetterti a qualcuno tramite il suo IP, è necessario chiedere all'host il proprio IP. hostserver = Ospita Server -invitefriends = Invita amici +invitefriends = Invita Amici hostserver.mobile = Ospita\nServer -host = Host -hosting = [accent] Apertura del server... +host = Ospita +hosting = [accent]Apertura del server... hosts.refresh = Aggiorna hosts.discovering = Ricerca partite LAN hosts.discovering.any = Ricerca partite server.refreshing = Aggiornamento del server -hosts.none = [lightgray]Nessuna partita LAN trovata! +hosts.none = [lightgray]Nessuna partita locale trovata! host.invalid = [scarlet]Impossibile connettersi all'host. trace = Traccia giocatore trace.playername = Nome del giocatore: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID univoco: [accent]{0} -trace.mobile = Mobile Client: [accent]{0} -trace.modclient = Client personalizzato: [accent]{0} +trace.mobile = Client Mobile: [accent]{0} +trace.modclient = Client Personalizzato: [accent]{0} invalidid = ID client non valido! Segnala un bug. -server.bans = Lista Ban -server.bans.none = Nessun giocatore bandito trovato! Finora tutto liscio. +server.bans = Lista Bans +server.bans.none = Nessun giocatore bandito trovato! server.admins = Amministratori server.admins.none = Nessun amministratore trovato! server.add = Aggiungi server @@ -171,8 +186,8 @@ server.delete = Sei sicuro di voler eliminare questo server? server.edit = Modifica server server.outdated = [crimson]Server obsoleto![] server.outdated.client = [crimson]Client obsoleto![] -server.version = [lightgray]Versione: {0} -server.custombuild = [yellow] Costruzione personalizzata +server.version = [gray]v{0} {1} +server.custombuild = [yellow]Build Personalizzata confirmban = Sei sicuro di voler bandire questo giocatore? confirmkick = Sei sicuro di voler espellere questo giocatore? confirmvotekick = Sei sicuro di voler votare per l'espulsione di questo giocatore? @@ -180,25 +195,25 @@ confirmunban = Sei sicuro di voler riammettere questo giocatore? confirmadmin = Sei sicuro di voler rendere questo giocatore un amministratore? confirmunadmin = Sei sicuro di voler rimuovere lo stato di amministratore da questo giocatore? joingame.title = Unisciti alla Partita -joingame.ip = IP: +joingame.ip = Indirizzo: disconnect = Disconnesso. disconnect.error = Errore di connessione. disconnect.closed = Connessione chiusa. disconnect.timeout = Timed out. disconnect.data = Errore durante il caricamento del mondo! -cantconnect = Impossibile unirsi al server ([accent]{0}[]). +cantconnect = Impossibile unirsi alla partita ([accent]{0}[]). connecting = [accent]Connessione in corso... connecting.data = [accent]Caricamento del mondo... server.port = Porta: server.addressinuse = Indirizzo già in uso! server.invalidport = Numero porta non valido! -server.error = [crimson]Errore nell'hosting del server: [accent] {0} +server.error = [crimson]Errore nell'hosting del server. save.new = Nuovo Salvataggio save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio? overwrite = Sovrascrivi save.none = Nessun salvataggio trovato! -saveload = [accent]Salvataggio in corso... -savefail = [crimson]Salvataggio del gioco non riuscito! +saveload = Salvataggio in corso... +savefail = Salvataggio del gioco non riuscito! save.delete.confirm = Sei sicuro di voler eliminare questo salvataggio? save.delete = Elimina save.export = Esporta Salvataggio @@ -212,14 +227,14 @@ save.rename.text = Nuovo nome: selectslot = Seleziona un salvataggio. slot = [accent]Slot {0} editmessage = Modifica Messaggio -save.corrupted = [orang]Salvataggio corrotto o non valido! +save.corrupted = Salvataggio corrotto o non valido! empty = on = On off = Off save.autosave = Salvataggio Automatico: {0} save.map = Mappa: {0} save.wave = Ondata: {0} -save.mode = Gamemode: {0} +save.mode = Modalità di Gioco: {0} save.date = Ultimo Salvataggio: {0} save.playtime = Tempo di Gioco: {0} warning = Attenzione @@ -246,17 +261,17 @@ quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può loading = [accent]Caricamento in Corso... reloading = [accent]Ricaricamento delle mods... saving = [accent]Salvataggio in corso... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy +cancelbuilding = [accent][[{0}][] per pulire la selezione +selectschematic = [accent][[{0}][] per selezionare+copiare pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +resumebuilding = [scarlet][[{0}][] per riprendere a costruire wave = [accent]Ondata {0} -wave.waiting = [LIGHT_GRAY]Ondata tra {0} -wave.waveInProgress = [LIGHT_GRAY]Ondata in corso... +wave.waiting = [lightgray]Ondata tra {0} +wave.waveInProgress = [lightgray]Ondata in corso waiting = In attesa... waiting.players = Attendendo giocatori... -wave.enemies = [LIGHT_GRAY]{0} Nemici Rimasti -wave.enemy = [LIGHT_GRAY]{0} Nemico Rimasto +wave.enemies = [lightgray]{0} Nemici Rimasti +wave.enemy = [lightgray]{0} Nemico Rimasto loadimage = Carica immagine saveimage = Salva Immagine unknown = Sconosciuto @@ -265,35 +280,36 @@ builtin = Incluso map.delete.confirm = Sei sicuro di voler eliminare questa mappa? L'operazione è irreversibile! map.random = [accent]Mappa casuale map.nospawn = Questa mappa non possiede un Nucleo in cui spawnare! Aggiungine uno nell'editor. -map.nospawn.pvp = Questa mappa non ha un Nucleo nemico! Aggiungi un [SCARLET]Nucleo rosso[] nell'editor per poter giocare. -map.nospawn.attack = Questa mappa non ha un Nucleo nemico! Aggiungi un [SCARLET]Nucleo rosso[] nell'editor per poter giocare. +map.nospawn.pvp = Questa mappa non ha un Nucleo Nemico! Aggiungi dei Nuclei nell'editor per poter giocare. +map.nospawn.attack = Questa mappa non ha nessun Nucleo Nemico da poter attaccare! Aggiungi dei Nuclei Nemici nell'editor per poter giocare. map.invalid = Errore nel caricamento della mappa: file mappa corrotto o non valido. workshop.update = Aggiorna elemento workshop.error = Errore nel recupero dei dettagli del Workshop: {0} map.publish.confirm = Vuoi pubblicare questa mappa?\n\n[lightgray]Assicurati di aver accettato il Workshop EULA, o le tue mappe non saranno visibili! workshop.menu = Seleziona cosa vorresti fare con questo elemento. -workshop.info = Info elemento +workshop.info = Info Elemento changelog = Changelog (opzionale): eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The Workshop listing has now been automatically un-linked. +missing = Questo prodotto è stato eliminato o spostato.\n[lightgray]L'elemento è stato scollegato automaticamente dal Workshop. publishing = [accent]Pubblicazione... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} -editor.brush = Pennello -editor.openin = Apri nell'editor -editor.oregen = Generazione dei minerali -editor.oregen.info = Generazione dei minerali: -editor.mapinfo = Informazioni mappa +publish.confirm = Sei sicuro di volerlo pubblicare?\n\n[lightgray]Assicurati di accettare il contratto EULA del Workshop o i tuoi prodotti non verranno mostrati! +publish.error = Errore nella pubblicazione del prodotto: {0} +steam.error = Impossibile inizializzare i servizi di Steam.\nErrore: {0} + +editor.brush = Dimensioni Pennello +editor.openin = Apri nell'Editor +editor.oregen = Generazione dei Minerali +editor.oregen.info = Generazione dei Minerali: +editor.mapinfo = Info Mappa editor.author = Autore: editor.description = Descrizione: editor.nodescription = Una mappa deve avere una descrizione di almeno 4 caratteri per poter essere pubblicata. editor.waves = Ondate: editor.rules = Regole: editor.generation = Generazione: -editor.ingame = Modifica in gioco -editor.publish.workshop = Pubblica sul Workshop -editor.newmap = Nuova mappa +editor.ingame = Modifica in Gioco +editor.publish.workshop = Pubblica nel Workshop +editor.newmap = Nuova Mappa workshop = Workshop waves.title = Ondate waves.remove = Rimuovi @@ -305,50 +321,50 @@ waves.to = a waves.boss = Boss waves.preview = Anteprima waves.edit = Modifica... -waves.copy = Copia negli appunti -waves.load = Carica dagli appunti -waves.invalid = Onde dagli appunti non valide. -waves.copied = Onde copiate. -waves.none = Nessun nemico definiti.\n Nota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita. -editor.default = [LIGHT_GRAY] +waves.copy = Copia negli Appunti +waves.load = Carica dagli Appunti +waves.invalid = Ondate dagli appunti non valide. +waves.copied = Ondate copiate. +waves.none = Nessun nemico impostato.\nNota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita. +editor.default = [lightgray] details = Dettagli... edit = Modifica... editor.name = Nome: -editor.spawn = Piazza un'unità -editor.removeunit = Rimuovi un'unità -editor.teams = Squadre -editor.errorload = Errore nel caricamento di:\n[accent]{0} -editor.errorsave = Errore nel salvataggio di:\n[accent]{0} -editor.errorimage = Quella è un'immagine, non una mappa.\n\nSe vuoi importare una mappa vecchia clicca su "Importa una mappa vecchia" nell'editor. +editor.spawn = Piazza un'Unità +editor.removeunit = Rimuovi un'Unità +editor.teams = Colore Squadre +editor.errorload = Errore nel caricamento del file. +editor.errorsave = Errore nel salvataggio del file, +editor.errorimage = Questa è un'immagine, non una mappa.\n\nSe vuoi importare una mappa vecchia clicca su 'Importa Mappa Vecchia' nell'editor. editor.errorlegacy = La mappa è troppo vecchia ed usa un formato che non è più supportato. -editor.errornot = Questo file non è una mappa. -editor.errorheader = Questo file della mappa è invalido o corrotto. -editor.errorname = Questa mappa è senza nome. +editor.errornot = Questo non è un file mappa. +editor.errorheader = Il file di questa mappa non è valido o è corrotto. +editor.errorname = Questa mappa è senza nome. Stai cercando di caricare un salvataggio? editor.update = Aggiorna editor.randomize = Casualizza editor.apply = Applica editor.generate = Genera editor.resize = Ridimensiona -editor.loadmap = Carica\nmappa -editor.savemap = Salva\nla mappa +editor.loadmap = Carica Mappa +editor.savemap = Salva Mappa editor.saved = Salvato! -editor.save.noname = La tua mappa non ha un nome! Impostane uno nelle informazioni della mappa. -editor.save.overwrite = La tua mappa sovrascrive quelle incluse! Imposta un nome diverso nelle informazioni della mappa. +editor.save.noname = La tua mappa non ha un nome! Impostane uno nel menu 'Info Mappa'. +editor.save.overwrite = La tua mappa sovrascrive quelle incluse! Imposta un nome diverso nel menu 'Info Mappa'. editor.import.exists = [scarlet]Impossibile importare:[] esiste già una mappa chiamata '{0}' che non può essere sovrascritta! -editor.import = Importando... +editor.import = Importa... editor.importmap = Importa mappa editor.importmap.description = Importa mappa preesistente -editor.importfile = Importa file +editor.importfile = Importa File editor.importfile.description = Importa un file mappa esterno -editor.importimage = Importa mappa terreno -editor.importimage.description = Importa immagine esterna terreno -editor.export = Esportazione... +editor.importimage = Importa Mappa Vecchia +editor.importimage.description = Importa immagine del terreno esterna +editor.export = Esporta... editor.exportfile = Esporta file editor.exportfile.description = Esporta file mappa -editor.exportimage = Esporta immagine +editor.exportimage = Esporta Immagine Terreno editor.exportimage.description = Esporta file immagine mappa -editor.loadimage = Carica\nimmagine -editor.saveimage = Salva\nimmagine +editor.loadimage = Importa\nTerreno +editor.saveimage = Esporta\nTerreno editor.unsaved = [scarlet]Alcune modifiche non sono state salvate![]\nSei sicuro di voler uscire? editor.resizemap = Ridimensiona la mappa editor.mapname = Nome Mappa: @@ -359,30 +375,30 @@ editor.selectmap = Seleziona una mappa da caricare: toolmode.replace = Sostituire toolmode.replace.description = Disegna solo su blocchi solidi. -toolmode.replaceall = Sostituisci tutto -toolmode.replaceall.description = Rimpiazza tutti i blocchi nella mappa +toolmode.replaceall = Sostituisci Tutto +toolmode.replaceall.description = Rimpiazza tutti i blocchi nella mappa. toolmode.orthogonal = Ortogonale -toolmode.orthogonal.description = Disegna solo linee ortogonali +toolmode.orthogonal.description = Disegna solo linee ortogonali. toolmode.square = Quadrato -toolmode.square.description = Pennello quadrato +toolmode.square.description = Pennello quadrato. toolmode.eraseores = Rimuovi Minerali -toolmode.eraseores.description = Rimuove solo minerali +toolmode.eraseores.description = Rimuove solo minerali. toolmode.fillteams = Riempi Squadre -toolmode.fillteams.description = Riempe squadre al posto di blocchi +toolmode.fillteams.description = Riempe squadre al posto di blocchi. toolmode.drawteams = Disegna Squadre -toolmode.drawteams.description = Disegna squadre al posto di blocchi +toolmode.drawteams.description = Disegna squadre al posto di blocchi. -filters.empty = [LIGHT_GRAY]Nessun filtro! Aggiungine uno cliccando il tasto sotto. +filters.empty = [lightgray]Nessun filtro! Aggiungine uno cliccando il tasto sotto. filter.distort = Modifica filter.noise = Interferenza filter.median = Mediana filter.oremedian = Mediana Minerali filter.blend = Miscela -filter.defaultores = Minerali predefiniti -filter.ore = Minerali -filter.rivernoise = Interferenze a fiume +filter.defaultores = Minerali Predefiniti +filter.ore = Minerale +filter.rivernoise = Interferenze Fiume filter.mirror = Rifletti -filter.clear = Resetta il filtro +filter.clear = Resetta Filtro filter.option.ignore = Ignora filter.scatter = Dispersione filter.terrain = Terreno @@ -390,17 +406,17 @@ filter.option.scale = Scala filter.option.chance = Probabilità filter.option.mag = Magnitudine filter.option.threshold = Soglia -filter.option.circle-scale = Modifica grandezza cerchio +filter.option.circle-scale = Modifica Diametro Cerchio filter.option.octaves = Ottavi filter.option.falloff = Cadere filter.option.angle = Angolo filter.option.block = Blocco -filter.option.floor = Pavimento -filter.option.flooronto = Pavimento mirato +filter.option.floor = Terreno +filter.option.flooronto = Terreno Mirato filter.option.wall = Muro filter.option.ore = Minerale -filter.option.floor2 = Pavimento secondario -filter.option.threshold2 = Soglia secondaria +filter.option.floor2 = Terreno Secondario +filter.option.threshold2 = Soglia Secondaria filter.option.radius = Raggio filter.option.percentile = Percentuale @@ -423,44 +439,44 @@ mapeditor = Editor Mappe abandon = Abbandona abandon.text = Questa zona e tutte le tue risorse saranno perdute e passeranno al nemico. locked = Bloccato -complete = [LIGHT_GRAY]Completato: +complete = [lightgray]Completato: requirement.wave = Raggiungi onda {0} in {1} -requirement.core = Distruggi il Nucleo nemico in {0} +requirement.core = Distruggi il Nucleo Nemico in {0} requirement.unlock = Sblocca {0} -resume = Riprendi Zona:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Ondata migliore: {0} +resume = Riprendi Zona:\n[lightgray]{0} +bestwave = [lightgray]Ondata Migliore: {0} launch = < DECOLLARE > -launch.title = Decollo riuscito! -launch.next = [LIGHT_GRAY]nuova opportunità all'ondata {0} +launch.title = Decollo Riuscito! +launch.next = [lightgray]nuova opportunità all'ondata {0} launch.unable2 = [scarlet]IMPOSSIBILE DECOLLARE![] launch.confirm = Questo trasporterà tutte le risorse nel tuo Nucleo.\nNon riuscirai a ritornare in questa base. launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle ondate successive uncover = Scopri -configure = Configura l'equipaggiamento -bannedblocks = Blocchi banditi -addall = Aggiungi tutti -configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento. +configure = Configura Equipaggiamento +bannedblocks = Blocchi Banditi +addall = Aggiungi Tutti +configure.locked = [lightgray]Arriva all'ondata {0}\nper configurare l'equipaggiamento. configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}. -zone.unlocked = [LIGHT_GRAY]{0} sbloccata. -zone.requirement.complete = Ondata {0} raggiunta:\n{1} requisiti di zona soddisfatti. +zone.unlocked = [lightgray]{0} sbloccata. +zone.requirement.complete = Ondata {0} raggiunta:\n[lightgray]{1}[] requisiti di zona soddisfatti. zone.config.unlocked = Equipaggiamento sbloccato:[lightgray]\n{0} -zone.resources = Risorse Trovate: +zone.resources = [lightgray]Risorse Trovate: zone.objective = [lightgray]Obiettivo: [accent]{0} zone.objective.survival = Sopravvivere zone.objective.attack = Distruggere il Nucleo Nemico add = Aggiungi... boss.health = Vita del Boss -connectfail = [crimson] Impossibile connettersi al server: [accent] {0} +connectfail = [crimson]Impossibile connettersi al server:\n\n[accent] {0} error.unreachable = Server irraggiungibile. L'indirizzo è scritto correttamente? -error.invalidaddress = Indirizzo invalido. -error.timedout = Timeout!\n Assicurati che l'host abbia il port forwarding impostato e che l'indirizzo sia corretto! -error.mismatch = Errore pacchetti:\nPossibile discordanza della versione client / server.\n Assicurati che tu e l'host possiediate l'ultima versione di Mindustry! +error.invalidaddress = Indirizzo non valido. +error.timedout = Timeout!\nAssicurati che l'host abbia il port forwarding impostato e che l'indirizzo sia corretto! +error.mismatch = Errore dei pacchetti:\nPossibile discordanza della versione client/server.\nAssicurati che tu e l'host possiediate l'ultima versione di Mindustry! error.alreadyconnected = Già connesso. -error.mapnotfound = Mappa non trovata +error.mapnotfound = Mappa non trovata! error.io = Errore I/O di rete. error.any = Errore di rete sconosciuto. -error.bloom = Errore dell'avvio del bloom.\nIl tuo dispositivo potrebbe non supportarlo. +error.bloom = Errore dell'avvio delle shaders.\nIl tuo dispositivo potrebbe non supportarle. zone.groundZero.name = Terreno Zero zone.desertWastes.name = Rifiuti Desertici @@ -478,7 +494,7 @@ zone.crags.name = Dirupi zone.fungalPass.name = Passaggio Fungoso zone.groundZero.description = La posizione ottimale per cominciare. Bassa minaccia nemica. Poche risorse.\nRaccogli quanto più piombo e rame possibile.\nProcedi. -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 a combustione. Impara a usare i riparatori. +zone.frozenForest.description = Anche qui, più vicino alle montagne, le spore si sono diffuse. Le temperature rigide non possono contenerle per sempre.\nInizia la scoperta dell'energia. Costruisci generatori a combustione. Impara a usare i riparatori. zone.desertWastes.description = Questi rifiuti sono vasti, imprevedibili ed 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 = 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 = L'acqua si è accumulata in questo cratere, reliquia delle vecchie guerre. Recupera l'area. Raccogli la sabbia. Fondi il vetro metallico. Pompa l'acqua per raffreddare torrette e trivelle. @@ -487,20 +503,21 @@ zone.stainedMountains.description = Più nell'entroterra si trovano le montagne, 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 = 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 del petrolio, se possibile. 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 = Un ex impianto per la produzione e la lavorazione del torio, ridotto in rovina.\n[lightgray] Ricerca il torio ed i suoi numerosi usi.\n\nIl nemico è presente qui in gran numero, alla costante ricerca di aggressori. +zone.nuclearComplex.description = Un ex impianto per la produzione e la lavorazione del torio, ridotto in rovina.\n[lightgray]Ricerca il torio ed i suoi numerosi usi.\n\nIl nemico è presente qui in gran numero, alla costante ricerca di aggressori. 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 = zone.crags.description = settings.language = Lingua -settings.data = Importa/Esporta salvataggio +settings.data = Dati di Gioco settings.reset = Ripristina Impostazioni settings.rebind = Modifica +settings.resetKey = Ripristina settings.controls = Controlli settings.game = Gioco settings.sound = Suoni settings.graphics = Grafica -settings.cleardata = Elimina Dati di Gioco... +settings.cleardata = Elimina Dati di Gioco settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nQuesta operazione non può essere annullata! settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, inclusi salvataggi, mappe, oggetti sbloccati ed impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà automaticamente. paused = [accent]< In Pausa > @@ -513,8 +530,8 @@ error.title = [crimson]Si è verificato un errore error.crashtitle = Si è verificato un errore blocks.input = Ingresso blocks.output = Uscita -blocks.booster = Booster -block.unknown = [LIGHT_GRAY]??? +blocks.booster = Potenziamenti +block.unknown = [lightgray]??? blocks.powercapacity = Capacità Energetica blocks.powershot = Danno/Colpo blocks.damage = Danno @@ -523,7 +540,7 @@ blocks.targetsground = Attacca Nemici Terreni blocks.itemsmoved = Velocità di Movimento blocks.launchtime = Tempo fra Decolli blocks.shootrange = Raggio -blocks.size = Grandezza +blocks.size = Dimensioni blocks.liquidcapacity = Capacità del Liquido blocks.powerrange = Raggio Energia blocks.powerconnections = Connessioni Massime @@ -551,7 +568,7 @@ bar.drilltierreq = Miglior Trivella Richiesta bar.drillspeed = Velocità Scavo: {0}/s bar.pumpspeed = Velocità di Pompaggio: {0}/s bar.efficiency = Efficienza: {0}% -bar.powerbalance = Energia: {0} +bar.powerbalance = Energia: {0}/s bar.powerstored = Immagazzinata: {0}/{1} bar.poweramount = Energia: {0} bar.poweroutput = Energia in Uscita: {0} @@ -560,7 +577,7 @@ bar.capacity = Capacità: {0} bar.liquid = Liquido bar.heat = Calore bar.power = Energia -bar.progress = Progresso della Costruzione +bar.progress = Progresso Costruzione bar.spawned = Unità: {0}/{1} bar.input = Entrata bar.output = Uscita @@ -578,14 +595,14 @@ bullet.multiplier = [stat]{0}[lightgray]x moltiplicatore munizioni bullet.reload = [stat]{0}[lightgray]x ricarica unit.blocks = blocchi -unit.powersecond = unità energia/secondo -unit.liquidsecond = unità liquide/secondo -unit.itemssecond = oggetti/secondo +unit.powersecond = unità energia/s +unit.liquidsecond = unità liquide/s +unit.itemssecond = oggetti/s unit.liquidunits = unità liquidi unit.powerunits = unità energia unit.degrees = gradi unit.seconds = secondi -unit.persecond = /sec +unit.persecond = /s unit.timesspeed = x velocità unit.percent = % unit.items = oggetti @@ -603,10 +620,10 @@ setting.shadows.name = Ombre setting.blockreplace.name = Suggerimento Blocchi Automatico setting.linear.name = Filtro Lineare setting.hints.name = Suggerimenti -setting.buildautopause.name = Auto-Pause Building +setting.buildautopause.name = Pausa automatica nella costruzione setting.animatedwater.name = Acqua Animata setting.animatedshields.name = Scudi Animati -setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riavvio)[] +setting.antialias.name = Antialias[lightgray] (richiede riavvio)[] setting.indicators.name = Indicatori Alleati/Nemici setting.autotarget.name = Mira Automatica setting.keyboard.name = Tastiera @@ -626,37 +643,39 @@ setting.screenshake.name = Movimento dello Schermo setting.effects.name = Visualizza Effetti setting.destroyedblocks.name = Mostra Blocchi Distrutti setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Consenti Schematiche dei Nuclei setting.sensitivity.name = Sensibilità del Controller setting.saveinterval.name = Intervallo di Salvataggio Automatico +setting.seconds = {0} secondi setting.blockselecttimeout.name = Tempo di Selezione del Blocco setting.milliseconds = {0} millisecondi -setting.seconds = {0} secondi setting.fullscreen.name = Schermo Intero -setting.borderlesswindow.name = Finestra Senza Bordi[LIGHT_GRAY] (potrebbe richiedere riavvio) +setting.borderlesswindow.name = Finestra Senza Bordi[lightgray] (potrebbe richiedere riavvio) setting.fps.name = Mostra FPS e Ping setting.blockselectkeys.name = Mostra Tasto di Selezione del Blocco setting.vsync.name = VSync -setting.pixelate.name = Effetto Pixel [LIGHT_GRAY](potrebbe ridure le prestazioni) +setting.pixelate.name = Effetto Pixel [lightgray](potrebbe ridure le prestazioni) setting.minimap.name = Mostra Minimappa setting.position.name = Mostra Posizione Giocatori setting.musicvol.name = Volume Musica setting.ambientvol.name = Volume Ambiente setting.mutemusic.name = Silenzia Musica setting.sfxvol.name = Volume Effetti -setting.mutesound.name = Togli Suoni +setting.mutesound.name = Silenzia Suoni setting.crashreport.name = Invia rapporti anonimi sugli arresti anomali -setting.savecreate.name = Autosalvataggio +setting.savecreate.name = Salvataggio Automatico setting.publichost.name = Gioco Visibile Pubblicamente setting.chatopacity.name = Opacità Chat -setting.lasersopacity.name = Opacità Laser d'Energia +setting.lasersopacity.name = Opacità Raggi Energetici +setting.bridgeopacity.name = Opacità Nastri e Condotti Sopraelevati setting.playerchat.name = Mostra Chat in-game -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. -uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere "OK" per confermare questa scala.\n[scarlet] Ripristina ed esci in [accent] {0}[] secondi... +public.confirm = Vuoi rendere la tua partita pubblica?\n[accent]Chiunque sarà in grado di accedere alle tue partite.\n[lightgray]Questo può essere modificato più tardi in Impostazioni->Gioco->Partite Pubbliche. +public.beta = Nota che le versioni beta del gioco non possono creare lobby pubbliche. +uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere 'OK' per confermare questa scala.\n[scarlet]Ripristina ed esci in [accent] {0}[] secondi... uiscale.cancel = Annulla ed Esci setting.bloom.name = Shaders keybind.title = Configurazione Tasti -keybinds.mobile = [scarlet]La maggior parte dei keybind qui non sono funzionali sui dispositivi mobili. È supportato solo il movimento di base. +keybinds.mobile = [scarlet]La maggior parte dei controlli qui non sono funzionano sui dispositivi mobili. È supportato solo il movimento di base. category.general.name = Generale category.view.name = Visualizzazione category.multiplayer.name = Multigiocatore @@ -668,6 +687,7 @@ keybind.clear_building.name = Pulisci Costruzione keybind.press = Premi un tasto... keybind.press.axis = Premi un'asse o un tasto... keybind.screenshot.name = Screenshot della Mappa +keybind.toggle_power_lines.name = Attiva/Disattiva Laser d'Energia keybind.move_x.name = Muovi Orizzontalmente keybind.move_y.name = Muovi Verticalmente keybind.mouse_move.name = Segui il Mouse @@ -675,23 +695,23 @@ keybind.dash.name = Scatto keybind.schematic_select.name = Seleziona Regione keybind.schematic_menu.name = Menu Schematica keybind.schematic_flip_x.name = Ruota Schematica Orizzontalmente -keybind.schematic_flip_y.name = Flip Schematic Verticalmente +keybind.schematic_flip_y.name = Ruota Schematica Verticalmente keybind.category_prev.name = Categoria Precedente keybind.category_next.name = Categoria Successiva keybind.block_select_left.name = Seleziona Blocco Sinistra keybind.block_select_right.name = Seleziona Blocco Destra keybind.block_select_up.name = Seleziona Blocco Su keybind.block_select_down.name = Seleziona Blocco Giù -keybind.block_select_01.name = Categoria/Seleziona Blocco 1 -keybind.block_select_02.name = Categoria/Seleziona Blocco 2 -keybind.block_select_03.name = Categoria/Seleziona Blocco 3 -keybind.block_select_04.name = Categoria/Seleziona Blocco 4 -keybind.block_select_05.name = Categoria/Seleziona Blocco 5 -keybind.block_select_06.name = Categoria/Seleziona Blocco 6 -keybind.block_select_07.name = Categoria/Seleziona Blocco 7 -keybind.block_select_08.name = Categoria/Seleziona Blocco 8 -keybind.block_select_09.name = Categoria/Seleziona Blocco 9 -keybind.block_select_10.name = Categoria/Seleziona Blocco 10 +keybind.block_select_01.name = Seleziona Categoria/Blocco 1 +keybind.block_select_02.name = Seleziona Categoria/Blocco 2 +keybind.block_select_03.name = Seleziona Categoria/Blocco 3 +keybind.block_select_04.name = Seleziona Categoria/Blocco 4 +keybind.block_select_05.name = Seleziona Categoria/Blocco 5 +keybind.block_select_06.name = Seleziona Categoria/Blocco 6 +keybind.block_select_07.name = Seleziona Categoria/Blocco 7 +keybind.block_select_08.name = Seleziona Categoria/Blocco 8 +keybind.block_select_09.name = Seleziona Categoria/Blocco 9 +keybind.block_select_10.name = Seleziona Categoria/Blocco 10 keybind.fullscreen.name = Schermo Intero keybind.select.name = Seleziona/Spara keybind.diagonal_placement.name = Posizionamento Diagonale @@ -699,7 +719,7 @@ keybind.pick.name = Scegli Blocco keybind.break_block.name = Rompi Blocco keybind.deselect.name = Deseleziona keybind.shoot.name = Spara -keybind.zoom.name = Esegui Zoom +keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pausa keybind.pause_building.name = Pausa/Riprendi Costruzione @@ -708,14 +728,13 @@ keybind.chat.name = Chat keybind.player_list.name = Lista dei Giocatori keybind.console.name = Console keybind.rotate.name = Ruota -keybind.rotateplaced.name = Ruota Blocco Esistente (Premuto) -keybind.toggle_menus.name = Mostra/Nascondi HUD -keybind.chat_history_prev.name = Scorri Chat vero l'alto +keybind.rotateplaced.name = Ruota Blocco Esistente (premuto) +keybind.toggle_menus.name = Mostra/Nascondi Menu +keybind.chat_history_prev.name = Scorri Chat vero l'alto keybind.chat_history_next.name = Scorri Chat verso il basso keybind.chat_scroll.name = Scorri Chat keybind.drop_unit.name = Lascia Materiali keybind.zoom_minimap.name = Esegui Zoom Minimappa -keybind.toggle_power_lines.name = Attiva/Disattiva Laser d'Energia mode.help.title = Descrizione delle Modalità mode.survival.name = Sopravvivenza mode.survival.description = Modalità normale. Risorse limitate ed ondate in entrata automatiche. @@ -725,10 +744,10 @@ mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Lotta contro altri giocatori. mode.attack.name = Schermaglia -mode.attack.description = Obiettivo: Distruggere la base nemica, non ci sono ondate. +mode.attack.description = Distruggi la base nemica. \n[gray]Richiede un Nucleo rosso nella mappa per essere giocata. mode.custom = Regole Personalizzate -rules.infiniteresources = Risorse infinite +rules.infiniteresources = Risorse Infinite rules.reactorexplosions = Esplosioni Reattore rules.wavetimer = Timer Ondate rules.waves = Ondate @@ -737,27 +756,28 @@ rules.enemyCheat = Risorse AI Infinite rules.unitdrops = Generazione Unità rules.unitbuildspeedmultiplier = Moltiplicatore Velocità Costruzione Unità rules.unithealthmultiplier = Moltiplicatore Vita Unità +rules.blockhealthmultiplier = Moltiplicatore Danno Blocco rules.playerhealthmultiplier = Moltiplicatore Vita Giocatore rules.playerdamagemultiplier = Moltiplicatore Danno Giocatore rules.unitdamagemultiplier = Moltiplicatore Danno Unità -rules.enemycorebuildradius = Raggio di Protezione del Nucleo Nemico dalle Costruzioni:[LIGHT_GRAY] (tiles) -rules.respawntime = Tempo di rigeneratione:[LIGHT_GRAY] (sec) -rules.wavespacing = Tempo fra Ondate:[LIGHT_GRAY] (secondi) +rules.enemycorebuildradius = Raggio di protezione del Nucleo Nemico dalle costruzioni:[lightgray] (blocchi) +rules.respawntime = Tempo di Rigeneratione:[lightgray] (secondi) +rules.wavespacing = Tempo fra Ondate:[lightgray] (secondi) rules.buildcostmultiplier = Moltiplicatore Costo Costruzione rules.buildspeedmultiplier = Moltiplicatore Velocità Costruzione -rules.waitForWaveToEnd = Ondate aspettano fino a quando l'ondata precedente finisce -rules.dropzoneradius = Raggio di Generazione:[LIGHT_GRAY] (blocchi) +rules.waitForWaveToEnd = Le ondate aspettano fino a quando l'ondata precedente finisce +rules.dropzoneradius = Raggio di Generazione:[lightgray] (blocchi) rules.respawns = Rigenerazioni per ondata max -rules.limitedRespawns = Limite rigenerazioni +rules.limitedRespawns = Limite Rigenerazioni rules.title.waves = Ondate rules.title.respawns = Rigenerazioni -rules.title.resourcesbuilding = Risorse e costruzioni +rules.title.resourcesbuilding = Risorse e Costruzioni rules.title.player = Giocatori rules.title.enemy = Nemici rules.title.unit = Unità rules.title.experimental = Sperimentale rules.lighting = Illuminazione -rules.ambientlight = Illuminazione Ambientale +rules.ambientlight = Illuminazione\nAmbientale content.item.name = Oggetti content.liquid.name = Liquidi @@ -806,33 +826,33 @@ mech.trident-ship.weapon = Valle delle Bombe mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Ripetitore di Fiamma item.corestorable = [lightgray]Immagazzinabili nel Nucleo: {0} -item.explosiveness = [LIGHT_GRAY]Esplosività: {0} -item.flammability = [LIGHT_GRAY]Infiammabilità: {0} -item.radioactivity = [LIGHT_GRAY]Radioattività: {0} -unit.health = [LIGHT_GRAY]Salute: {0} -unit.speed = [LIGHT_GRAY]Velocità: {0} -mech.weapon = [LIGHT_GRAY]Armi: {0} -mech.health = [LIGHT_GRAY]Salute: {0} -mech.itemcapacity = [LIGHT_GRAY]Capacità Oggetti: {0} -mech.minespeed = [LIGHT_GRAY]Velocità di Scavo: {0} -mech.minepower = [LIGHT_GRAY]Potenza di Scavo: {0} -mech.ability = [LIGHT_GRAY]Abilità: {0} -mech.buildspeed = [LIGHT_GRAY]Velocità di Costruzione: {0}% -liquid.heatcapacity = [LIGHT_GRAY]Capacità Termica: {0} -liquid.viscosity = [LIGHT_GRAY]Viscosità: {0} -liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +item.explosiveness = [lightgray]Esplosività: {0} +item.flammability = [lightgray]Infiammabilità: {0} +item.radioactivity = [lightgray]Radioattività: {0} +unit.health = [lightgray]Salute: {0} +unit.speed = [lightgray]Velocità: {0} +mech.weapon = [lightgray]Armi: {0} +mech.health = [lightgray]Salute: {0} +mech.itemcapacity = [lightgray]Capacità Oggetti: {0} +mech.minespeed = [lightgray]Velocità di Scavo: {0} +mech.minepower = [lightgray]Potenza di Scavo: {0} +mech.ability = [lightgray]Abilità: {0} +mech.buildspeed = [lightgray]Velocità di Costruzione: {0}% +liquid.heatcapacity = [lightgray]Capacità Termica: {0} +liquid.viscosity = [lightgray]Viscosità: {0} +liquid.temperature = [lightgray]Temperatura: {0} block.sand-boulder.name = Masso di Sabbia block.grass.name = Erba block.salt.name = Sale -block.saltrocks.name = Rocce salate +block.saltrocks.name = Rocce Salate block.pebbles.name = Ciottoli block.tendrils.name = Viticci block.sandrocks.name = Rocce Sabbiose block.spore-pine.name = Pino di Spore block.sporerocks.name = Roccia di Spore -block.rock.name = Roccia -block.snowrock.name = Roccia Innevata +block.rock.name = Masso +block.snowrock.name = Masso Innevato block.snow-pine.name = Pino Innevato block.shale.name = Scisto block.shale-boulder.name = Masso di Scisto @@ -848,7 +868,7 @@ block.thruster.name = Propulsore block.kiln.name = Forno block.graphite-press.name = Pressa per Grafite block.multi-press.name = Multi Pressa -block.constructing = {0}\n[LIGHT_GRAY](In Costruzione) +block.constructing = {0}\n[lightgray](In Costruzione) block.spawn.name = Spawn Nemico block.core-shard.name = Nucleo: Frammento block.core-foundation.name = Nucleo: Fondamento @@ -865,7 +885,7 @@ block.ice.name = Ghiaccio block.snow.name = Neve block.craters.name = Crateri block.sand-water.name = Acqua Sabbiosa -block.darksand-water.name = Acqua Sabbiosa scura +block.darksand-water.name = Acqua Sabbiosa Scura block.char.name = Carbone block.holostone.name = Pietra Holo block.ice-snow.name = Neve Ghiacciata @@ -877,32 +897,32 @@ block.pine.name = Pino block.white-tree-dead.name = Albero Bianco Morto block.white-tree.name = Albero Morto block.spore-cluster.name = Agglomerato di Spore -block.metal-floor.name = Pavimento Metallico +block.metal-floor.name = Pavimento Metallico 1 block.metal-floor-2.name = Pavimento Metallico 2 block.metal-floor-3.name = Pavimento Metallico 3 block.metal-floor-5.name = Pavimento Metallico 4 block.metal-floor-damaged.name = Pavimento Metallico Danneggiato -block.dark-panel-1.name = Pannello scuro 1 -block.dark-panel-2.name = Pannello scuro 2 -block.dark-panel-3.name = Pannello scuro 3 -block.dark-panel-4.name = Pannello scuro 4 -block.dark-panel-5.name = Pannello scuro 5 -block.dark-panel-6.name = Pannello scuro 6 +block.dark-panel-1.name = Pannello Scuro 1 +block.dark-panel-2.name = Pannello Scuro 2 +block.dark-panel-3.name = Pannello Scuro 3 +block.dark-panel-4.name = Pannello Scuro 4 +block.dark-panel-5.name = Pannello Scuro 5 +block.dark-panel-6.name = Pannello Scuro 6 block.dark-metal.name = Metallo Scuro block.ignarock.name = Roccia Ignea block.hotrock.name = Roccia Bollente block.magmarock.name = Roccia Magmatica block.cliffs.name = Scogliere block.copper-wall.name = Muro di Rame -block.copper-wall-large.name = Muro Grande di Rame +block.copper-wall-large.name = Muro di Rame Grande block.titanium-wall.name = Muro di Titanio -block.titanium-wall-large.name = Muro Grande di Titanio +block.titanium-wall-large.name = Muro di Titanio Grande block.plastanium-wall.name = Muro di Plastanio -block.plastanium-wall-large.name = Muro Grande di Plastanio +block.plastanium-wall-large.name = Muro di Plastanio Grande block.phase-wall.name = Muro di Fase -block.phase-wall-large.name = Muro Grande di Fase +block.phase-wall-large.name = Muro di Fase Grande block.thorium-wall.name = Muro di Torio -block.thorium-wall-large.name = Muro Grande di Torio +block.thorium-wall-large.name = Muro di Torio Grande block.door.name = Porta block.door-large.name = Porta Grande block.duo.name = Torretta Duo @@ -945,7 +965,7 @@ block.impact-reactor.name = Reattore ad Impatto block.mechanical-drill.name = Trivella Meccanica block.pneumatic-drill.name = Trivella Pneumatica block.laser-drill.name = Trivella Laser -block.water-extractor.name = Estrattore d'acqua +block.water-extractor.name = Estrattore d'Acqua block.cultivator.name = Coltivatore block.dart-mech-pad.name = Piattaforma del Mech Dardo block.delta-mech-pad.name = Piattaforma del Mech Delta @@ -959,6 +979,7 @@ block.mechanical-pump.name = Pompa Meccanica block.item-source.name = Fonte Infinita (oggetti) block.item-void.name = Cestino (oggetti) block.liquid-source.name = Fonte Infinita (liquidi) +block.liquid-void.name = Cestino (liquidi) block.power-void.name = Cestino (energia) block.power-source.name = Fonte Infinita (energia) block.unloader.name = Scaricatore @@ -987,12 +1008,13 @@ block.titan-factory.name = Fabbrica Mech Titano block.fortress-factory.name = Fabbrica Mech Fortezza block.revenant-factory.name = Fabbrica Combattenti Superstiti block.repair-point.name = Punto di Riparazione -block.pulse-conduit.name = Condotto Attiva -block.phase-conduit.name = Condotta di Fase +block.pulse-conduit.name = Condotto a Impulsi +block.plated-conduit.name = Condotto Placcato +block.phase-conduit.name = Condotto di Fase block.liquid-router.name = Distributore di Liquidi block.liquid-tank.name = Serbatoio block.liquid-junction.name = Giunzione Liquida -block.bridge-conduit.name = Condotta Sopraelevata +block.bridge-conduit.name = Condotto Sopraelevato block.rotary-pump.name = Pompa a Turbina block.thorium-reactor.name = Reattore al Torio block.mass-driver.name = Lancia Materiali @@ -1039,31 +1061,31 @@ unit.eradicator.name = Estirpatore unit.lich.name = Lich unit.reaper.name = Mietitore tutorial.next = [lightgray] -tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia[accent] scavando rame[]. Clicca un minerale di rame vicino al tuo Nucleo per farlo.\n\n[accent]{0}/{1} rame -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.drill = Ora crea una trivella.\n[accent]Le trivelle []scavano da sole e sono più efficienti. Piazzane una su un minerale di rame. -tutorial.drill.mobile = Ora crea una trivella. \n[accent] Le trivelle []scavano da sole e sono più efficienti. \n Toccare la scheda della trivella in basso a destra. \n Selezionare la trivella meccanica [accent] []. \n Posizionarlo su una vena di rame toccando, quindi premere il segno di spunta [accent] [] in basso per confermare la selezione. \n Premere il tasto X [accent] [] per annullare il posizionamento. -tutorial.blockinfo = Ogni blocco ha statistiche diverse. Alcuni minerali richiedono trivelle specifiche.\nPer controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel database. []\n\n[accent]Accedi ora alle statistiche della trivella meccanica. [] -tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al Nucleo. \nCrea una linea di nastri dalla trivella al Nucleo. -tutorial.conveyor.mobile = [accent] I nastri trasportatori [] sono usati per trasportare oggetti nel nocciolo. \nCrea una linea di nastri trasportatori dalla trivella al nocciolo. \n[accent] Posizionati in una linea tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione. \n\n [accent] {0} / {1} nastri trasportatori disposti in linea \n [accent] 0/1 oggetti consegnati -tutorial.turret = Costruisci delle torrette per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta Duo vicino alla tua base. +tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nUsa[accent] [[WASD][] per muoverti.\n[accent]Scorri[] per eseguire lo zoom.\nInizia[accent] minando il rame[]. Per farlo, posizionati sulla vena di rame vicina al tuo Nucleo e clicca su di essa.\n\n[accent]{0}/{1} rame +tutorial.intro.mobile = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nScorri sullo schermo per muoverti.\n[accent]Avvicina due dita[] per eseguire lo zoom in/out.\nInizia [accent] scavando del rame[]. Clicca un minerale di rame vicino al tuo Nucleo per farlo.\n\n[accent]{0}/{1} rame +tutorial.drill = Ora crea una trivella.\n[accent]Le trivelle[] scavano da sole e sono più efficienti. Piazzane una su un minerale di rame. +tutorial.drill.mobile = Ora crea una trivella.\n[accent]Le trivelle[] scavano da sole e sono più efficienti.\nTocca la scheda della trivella in basso a destra.\nSeleziona la [accent]Trivella Meccanica[].\nPiazzala su una vena di rame toccando, quindi premi il [accent]segno di spunta[] in basso per confermare la selezione.\nCon il tasto [accent]X[] puoi annullare il posizionamento. +tutorial.blockinfo = Ogni blocco ha statistiche diverse. Alcuni minerali richiedono trivelle specifiche.\nPer controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel database.[]\n\n[accent]Accedi ora alle statistiche della trivella meccanica.[] +tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al Nucleo.\nCrea una linea di nastri dalla trivella al Nucleo. +tutorial.conveyor.mobile = [accent]I nastri trasportatori[] sono usati per trasportare oggetti nel Nucleo.\nCrea una linea di nastri trasportatori dalla trivella al Nucleo.\n[accent]Piazzali in linea tenendo premuto per qualche secondo e trascinando il dito in una direzione.\n\n[accent]Piazza 2 nastri trasportatori con lo strumento linea, quindi trasporta un oggetto fino al Nucleo. +tutorial.turret = Costruisci delle torrette per respingere il nemico[lightgray][].\nCostruisci una torretta Duo vicino alla tua base. tutorial.drillturret = La Torretta Duo richiede[accent] munizioni di rame[] per sparare.\nPosiziona una trivella e collega un nastro alla torretta per rifornirla di munizioni con il rame estratto. -tutorial.pause = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent]Premi spazio per mettere in pausa. -tutorial.pause.mobile = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent] Premi questo pulsante in alto a sinistra per mettere in pausa. +tutorial.pause = Durante la battaglia puoi[accent] mettere in pausa il gioco.[]\nPuoi disporre gli edifici mentre il gioco è in pausa.\n\nPer mettere in pausa, premi [accent]spazio[]. +tutorial.pause.mobile = Durante la battaglia puoi[accent] mettere in pausa il gioco.[]\nPuoi disporre gli edifici mentre il gioco è in pausa.\n\nPer mettere in pausa, premi il bottone in alto a sinistra. tutorial.unpause = Ora premi di nuovo spazio per annullare la pausa. tutorial.unpause.mobile = Ora premilo di nuovo per annullare la pausa. -tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent]Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area . -tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a smantellarlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area. -tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent] tocca un blocco []con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal Nucleo. [] -tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione. \n[accent]Rimetti il rame nel Nucleo. [] -tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina.\nDifendi il tuo Nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse. -tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il Nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette. -tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent] decollare con il Nucleo [], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo Nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n [accent]Decolla e conferma per terminare il tutorial. +tutorial.breaking = I blocchi spesso devono essere distrutti.\n[accent]Tieni premuto il tasto destro del mouse []per distruggere tutti i blocchi in una selezione.[]\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area. +tutorial.breaking.mobile = I blocchi spesso devono essere distrutti.\n[accent]Seleziona la modalità di decostruzione[], quindi tocca un blocco per iniziare a smantellarlo.\nDistruggi un'area tenendo premuto il dito per alcuni secondi[] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione.\n\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area. +tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent]tocca un blocco []con oggetti al suo interno, quindi[accent] tocca l'oggetto []nell'inventario.\nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal Nucleo.[] +tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione.\n[accent]Rimetti il rame nel Nucleo. [] +tutorial.waves = [lightgray]Il nemico si avvicina.\nDifendi il tuo Nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse. +tutorial.waves.mobile = [lightgray]Il nemico si avvicina.\n\nDifendi il Nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette. +tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent]decollare con il Nucleo[], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo Nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n[accent]Decolla e conferma per terminare il tutorial. -item.copper.description = Un utile materiale, usato dappertutto -item.lead.description = Un materiale di base, molto usato nei blocchi di trasporto. -item.metaglass.description = Un durissimo composto di vetro. Estensivamente usato per trasporto di liquidi ed immagazzinamento. -item.graphite.description = Carbone mineralizzato, utilizzato per munizioni ed isolamento elettrico. +item.copper.description = Un materiale utile, usato dappertutto. +item.lead.description = Un materiale di base, molto usato nei blocchi per il trasporto. +item.metaglass.description = Un durissimo composto di vetro. Ampiamente usato per trasporto di liquidi ed immagazzinamento. +item.graphite.description = Carbone mineralizzato, utilizzato per munizioni e componenti elettrici. item.sand.description = Un materiale di base che viene usato molto nei processi di fusione, sia come lega che come reagente. item.coal.description = Un combustibile comune facilmente ottenibile. item.titanium.description = Un raro metallo incredibilmente leggero usato ampiamente nella costruzione di trasporti, trivelle e navi. @@ -1079,12 +1101,12 @@ item.pyratite.description = Una sostanza molto infiammabile che viene utilizzata liquid.water.description = Il liquido più utile. Comunemente usato per il raffreddamento di macchinari ed il trattamento dei rifiuti. liquid.slag.description = Diversi tipi di metalli fusi, mescolati insieme. Può essere separato nei suoi minerali costituenti o spruzzato sulle unità nemiche come un'arma. liquid.oil.description = Un liquido usato nella produzione avanzata.\nPuò essere convertito in carbone per uso combustibile o spruzzato ed incendiato come arma. -liquid.cryofluid.description = Un liquido inerte e non corrosivo creato da acqua e titanio.\nIl liquido più efficiente per il raffreddamento. +liquid.cryofluid.description = Un liquido inerte e non corrosivo creato da acqua e titanio.\nÈ il liquido più efficiente per il raffreddamento. mech.alpha-mech.description = Il mech standard. È abbastanza veloce e produce abbastanza danni, può anche generare 3 droni per aumentare il suo danno complessivo. mech.delta-mech.description = Un mech veloce, poco armato fatto per giocare a tocca e fuga con il nemico. Fa poco danno alle strutture, ma può uccidere un gran nummero di nemici grazie alle sue armi ad alto voltaggio. mech.tau-mech.description = Un mech di supporto. Cura i blocchi danneggiati sparandogli contro. Può spegnere fuochi e curare i compagni di squadra. mech.omega-mech.description = Un mech ingombrante e ben armato, fatto per stare in prima linea. La sue difese possono bloccare fino al 90% dei danni. -mech.dart-ship.description = Una navicella standard. Molto veloce e leggera, ma può minare pochi blocchi ed ha scarse potenzialità nella difesa. +mech.dart-ship.description = La navicella standard. Scava velocemente. Veloce e leggera, ma con scarse potenzialità nella difesa. mech.javelin-ship.description = Una navetta da tocca e fuga. Anche se inizialmente lenta, può accelerare ad alte velocità e volare sopra gli avamposti dei nemici, e provocare molti danni ai nemici tramite l'utilizzo di fulmini o missili. mech.trident-ship.description = Un bombardiere pesante. Molto ben protetto. mech.glaive-ship.description = Una grande e ben armata macchina da guerra. Equipaggiata con lanciafamme e con accelerazione veloce. @@ -1099,7 +1121,7 @@ unit.eruptor.description = Un mech pesante progettato per abbattere le strutture unit.wraith.description = Un'unità d'intercezione rapida ed efficiente. unit.ghoul.description = Un bombardiere pesante. Utilizza composti esplosivi o pirite come munizioni. unit.revenant.description = Un pesante lanciamissili volante. -block.message.description = Stores a message. Used for communication between allies. +block.message.description = Memorizza un messaggio. Utilizzato per la comunicazione tra alleati. block.graphite-press.description = Comprime pezzi di carbone in fogli di grafite puri. block.multi-press.description = Una versione aggiornata della pressa per grafite. Impiega acqua ed energia per elaborare il carbone in modo rapido ed efficiente. block.silicon-smelter.description = Fonde sabbia e carbone riscaldati per ottenere silicio. @@ -1108,7 +1130,7 @@ block.plastanium-compressor.description = Produce plastanio da petrolio e titani block.phase-weaver.description = Produce tessuto di fase da torio radioattivo ed elevate quantità di sabbia. block.alloy-smelter.description = Produce leghe di sovratensione da titanio, piombo, silicio e rame. block.cryofluidmixer.description = Combina acqua e titanio in criofluido che è molto più efficiente per il raffreddamento. -block.blast-mixer.description = Frantuma e mescola le spore con la pirite per produrre Composto Esplosivo. +block.blast-mixer.description = Frantuma e mescola le spore con la pirite per produrre composto esplosivo. block.pyratite-mixer.description = Mescola carbone, piombo e sabbia in pirite altamente infiammabile. block.melter.description = Riscalda la pietra a temperature molto elevate per ottenere scoria liquida. block.separator.description = Sottopone le scoria a centrifugazione per ottenere i vari minerali contenuti. @@ -1121,50 +1143,53 @@ block.power-source.description = Produce energia infinita, esiste solo nella mod block.item-source.description = Produce oggetti infiniti, esiste solo nella modalità creativa. block.item-void.description = Elimina gli oggetti che vi entrano senza bisogno di energia, esiste solo nella modalità creativa. block.liquid-source.description = Emette continuamente liquidi. Esiste solo nella modalità creativa. +block.liquid-void.description = Elimina i liquidi in entrata, esiste solo nella modalità creativa. block.copper-wall.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate. -block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate. \nOccupa più tessere. +block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate.\nOccupa più blocchi. block.titanium-wall.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici. -block.titanium-wall-large.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici. \nOccupa più blocchi +block.titanium-wall-large.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici.\nOccupa più blocchi block.plastanium-wall.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche del nodo d'energia. block.plastanium-wall-large.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche dei nodi d'energia.\nSi estende su più blocchi. block.thorium-wall.description = Un forte blocco difensivo.\nBuona protezione dai nemici. -block.thorium-wall-large.description = Un forte blocco difensivo.\nBuona protezione dai nemici.\nOccupa più blocchi +block.thorium-wall-large.description = Un forte blocco difensivo.\nBuona protezione dai nemici.\nOccupa più blocchi. block.phase-wall.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti. -block.phase-wall-large.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti.\nOccupa più blocchi -block.surge-wall.description = Il blocco difensivo più forte. \nHa una piccola possibilità di innescare un fulmine verso l'attaccante. -block.surge-wall-large.description = Il blocco difensivo più forte. \n Ha una piccola possibilità di innescare un fulmine verso l'attaccante.\nOccupa più blocchi -block.door.description = Una piccola porta che può essere aperta e chiusa toccandola. \nSe aperta, i nemici possono sparare ed attraversare. -block.door-large.description = Una grande porta che può essere aperta e chiusa toccandola. \nSe aperta, i nemici possono sparare ed attraversare. \nOccupa più blocchi +block.phase-wall-large.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti.\nOccupa più blocchi. +block.surge-wall.description = Il blocco difensivo più forte.\nHa una piccola possibilità di innescare un fulmine verso l'attaccante. +block.surge-wall-large.description = Il blocco difensivo più forte.\nHa una piccola possibilità di innescare un fulmine verso l'attaccante.\nOccupa più blocchi. +block.door.description = Una piccola porta che può essere aperta e chiusa toccandola.\nSe aperta, i nemici possono sparare ed attraversare. +block.door-large.description = Una grande porta che può essere aperta e chiusa toccandola.\nSe aperta, i nemici possono sparare ed attraversare.\nOccupa più blocchi. block.mender.description = Ripara periodicamente blocchi nelle vicinanze.\nUtilizza del silicio per aumentarne portata ed efficienza. block.mend-projector.description = Ripara periodicamente blocchi nelle vicinanze.\nUtilizza del tessuto di fase per aumentarne portata ed efficienza. block.overdrive-projector.description = Aumenta la velocità di edifici vicini come trivelle e nastri trasportatori. -block.force-projector.description = Crea un campo di forza esagonale attorno a sé, proteggendo gli edifici e le unità all'interno da danni causati da proiettili +block.force-projector.description = Crea un campo di forza esagonale attorno a sé, proteggendo gli edifici e le unità all'interno da danni causati da proiettili. block.shock-mine.description = Danneggia i nemici che la calpestano. Quasi invisibile al nemico. block.conveyor.description = Nastro di base. Sposta gli oggetti in avanti e li deposita automaticamente in altri blocchi. Ruotabile. block.titanium-conveyor.description = Nastro avanzato. Sposta gli oggetti più velocemente dei nastri standard. block.junction.description = Permette di incrociare nastri che trasportano materiali diversi in posizioni diverse. -block.bridge-conveyor.description = Consente il trasporto di oggetti fino a 3 tessere ad un altro nastro sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. +block.bridge-conveyor.description = Consente il trasporto di oggetti fino a 3 blocchi ad un altro nastro sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. block.phase-conveyor.description = Nastro avanzato. Consuma energia per teletrasportare gli oggetti su un altro nastro di fase collegato. block.sorter.description = Divide gli oggetti. Se l'oggetto corrisponde a quello selezionato, Può passare. Altrimenti viene espulso sui lati. block.inverted-sorter.description = Elabora gli oggetti come uno smistatore standard, ma in uscita dà gli elementi selezionati ai lati. block.router.description = Accetta gli elementi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Utile per suddividere i materiali da una fonte a più destinazioni. block.distributor.description = Un distributore avanzato che divide gli oggetti in altre 7 direzioni allo stesso modo. -block.overflow-gate.description = Una combinazione di un incrocio e di un distributore , che distribuisce sui suoi lati se in nastro difronte si satura. -block.mass-driver.description = Ultimo blocco di trasporto di oggetti. Raccoglie diversi oggetti e poi li spara su un'altra Lancia Materiali a lungo raggio. -block.mechanical-pump.description = Una pompa economica con potenza lenta, ma nessun consumo di energia. +block.overflow-gate.description = Una combinazione di un incrocio e di un distributore, che distribuisce sui suoi lati se in nastro difronte si satura. +block.mass-driver.description = Ultimo blocco di trasporto di oggetti. Raccoglie diversi oggetti e poi li spara su un'altra Lìlancia materiali a lungo raggio. +block.mechanical-pump.description = Una pompa economica a bassa efficienza, ma nessun consumo di energia. block.rotary-pump.description = Una pompa avanzata che raddoppia la velocità consumando energia. block.thermal-pump.description = La pompa migliore. Tre volte più veloce di una pompa meccanica e l'unica pompa in grado di recuperare la lava. block.conduit.description = Condotto di base. Funziona come un nastro trasportatore, ma per i liquidi. Ideale per estrattori, pompe o altri condotti. block.pulse-conduit.description = Condotto avanzato. Trasporta più liquido e più velocemente dei condotti standard. +block.plated-conduit.description = Trasferisce i liquidi alla stessa velocità del Condotto a Impulsi, ma è più resistente. Non accetta liquidi dai lati da parte di condotti diversi.\nMeno perdite. block.liquid-router.description = Accetta i liquidi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Può anche immagazzinare una certa quantità di liquido. Utile per suddividere i liquidi da una fonte verso più destinazioni. block.liquid-tank.description = Conserva una grande quantità di liquidi. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali o come protezione per il raffreddamento di blocchi vitali. block.liquid-junction.description = Permette di incrociare condotti che trasportano liquidi diversi in posizioni diverse. -block.bridge-conduit.description = Consente il trasporto di liquidi fino a 3 tessere da un altro condotto sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. +block.bridge-conduit.description = Consente il trasporto di liquidi fino a 3 blocchi da un altro condotto sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. block.phase-conduit.description = Condotto avanzato. Consuma energia per teletrasportare i liquidi in un altro condotto di fase collegato. block.power-node.description = Trasmette energia tra i nodi collegati. È possibile creare fino a quattro collegamenti.\nClicca sul nodo per configurare i collegamenti. -block.power-node-large.description = Ha un raggio maggiore rispetto al nodo energetico e si possono creare un massimo di sei collegamenti.\nClicca sul nodo per configurare i collegamenti. +block.power-node-large.description = Ha un raggio maggiore rispetto al Nodo Energetico e si possono creare un massimo di sei collegamenti.\nClicca sul nodo per configurare i collegamenti. block.surge-tower.description = Un nodo di alimentazione a lungo raggio solo due connessioni disponibili.\nClicca sul nodo per configurare i collegamenti. -block.battery.description = Accumula energia ogni volta che c'è abbondanza e fornisce energia ogni volta che c'è carenza, purché rimanga carica. +block.diode.description = L'energia della batteria può attraversare questo blocco in una sola direzione, ma solo se l'altra parte ha meno energia. +block.battery.description = Accumula energia ogni volta che c'è abbondanza e fornisce energia ogni volta che c'è carenza, purché sia carica. block.battery-large.description = Immagazzina molta più energia di una normale batteria. block.combustion-generator.description = Genera energia bruciando combustibile. block.thermal-generator.description = Genera una grande quantità di energia dalla lava. @@ -1172,10 +1197,10 @@ block.turbine-generator.description = Più efficiente di un generatore a combust block.differential-generator.description = Genera grandi quantità di energia. Utilizza la differenza di temperatura tra criofluido e pirite in combustione. block.rtg-generator.description = Un generatore che sfrutta il calore del decadimento di materiale radioattivo per produrre energia.\nNon richiede raffreddamento ma fornisce meno energia di un reattore al torio. block.solar-panel.description = Fornisce una piccola quantità di energia dal sole. -block.solar-panel-large.description = Fornisce un'alimentazione molto migliore rispetto a un pannello solare standard, ma è anche molto più costoso da costruire. +block.solar-panel-large.description = Fornisce un'alimentazione migliore rispetto a un pannello solare standard, ma è anche molto più costoso da costruire. block.thorium-reactor.description = Genera enormi quantità di energia dal torio altamente radioattivo. Richiede un raffreddamento costante. Esploderà violentemente se vengono fornite quantità insufficienti di refrigerante. block.impact-reactor.description = Un generatore avanzato, in grado di creare enormi quantità di energia alla massima efficienza. Richiede un significativo apporto di energia per avviare il processo. -block.mechanical-drill.description = Una trivella economica. Se posizionato su riquadri appropriati, estrae minerali a un ritmo lento e costante. +block.mechanical-drill.description = Una trivella economica. Se posizionata su slot appropriati, estrae minerali a un ritmo lento e costante. block.pneumatic-drill.description = Una trivella migliorata più veloce ed in grado di elaborare materiali più duri sfruttando la pressione dell'aria. block.laser-drill.description = Consente di perforare ancora più velocemente attraverso la tecnologia laser, ma richiede energia. Inoltre, con questa trivella è possibile recuperare il torio radioattivo. block.blast-drill.description = La trivella migliore. Richiede grandi quantità di energia. @@ -1185,9 +1210,9 @@ block.oil-extractor.description = Utilizza grandi quantità di energia per estra block.core-shard.description = La prima iterazione del Nucleo. Una volta distrutto, tutti i contatti con la regione vengono persi. Non lasciare che questo accada. block.core-foundation.description = La seconda versione del Nucleo. Meglio corazzato. Immagazzina più risorse. block.core-nucleus.description = La terza ed ultima versione del Nucleo. Estremamente ben corazzato. Immagazzina enormi quantità di risorse. -block.vault.description = Immagazzina una grande quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal deposito. -block.container.description = Immagazzina una piccola quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal contenitore. -block.unloader.description = Scarica gli oggetti da un contenitore, caveau o Nucleo su un trasportatore o direttamente in un blocco adiacente. L'oggetto da scaricare può essere scelto toccando lo scaricatore. +block.vault.description = Immagazzina una grande quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [lightgray]scaricatore[] può essere utilizzato per recuperare elementi dal deposito. +block.container.description = Immagazzina una piccola quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [lightgray]scaricatore[] può essere utilizzato per recuperare elementi dal contenitore. +block.unloader.description = Scarica gli oggetti da un contenitore, deposito o Nucleo su un nastro trasportatore o direttamente in un blocco adiacente. L'oggetto da scaricare può essere scelto toccando lo scaricatore. block.launch-pad.description = Lancia oggetti nel tuo Nucleo senza necessità di un lasciare la zona. block.launch-pad-large.description = Una versione migliore dell'Ascensore Spaziale, immagazzina più oggetti. Lancia oggetti più frequentemente. block.duo.description = Una torretta piccola ed economica. @@ -1204,22 +1229,22 @@ block.ripple.description = Una grande torretta di artiglieria che spara più col block.cyclone.description = Una grande torretta a fuoco rapido. block.spectre.description = Una grande torretta che spara due potenti proiettili contemporaneamente. block.meltdown.description = Una grande torretta che spara un potente laser a lungo raggio. -block.command-center.description = Da istruzioni alle unità alleate nella mappa. Comanda la ricongizione, l'attacco del Nucleo nemico o la ritirata verso il proprio Nucleo o fabbrica.\nQuando non è presente un Nucleo nemico, le unità pattuglieranno anche se viene ordinato un attacco. +block.command-center.description = Dà istruzioni alle unità alleate nella mappa. Comanda la ricongizione, l'attacco del Nucleo Nemico o la ritirata verso il proprio Nucleo o fabbrica.\nQuando non è presente un Nucleo Nemico, le unità pattuglieranno anche se viene ordinato un attacco. block.draug-factory.description = Produce droni per la raccolta mineraria. block.spirit-factory.description = Produce droni che riparano blocchi. block.phantom-factory.description = Produce droni avanzati che seguono il giocatore e lo assistono nella costruzione. block.wraith-factory.description = Produce unità intercettatrici veloci. block.ghoul-factory.description = Produce bombardieri pesanti. -block.revenant-factory.description = Produce unità laser di terra pesanti. +block.revenant-factory.description = Produce pesanti unità lanciamissili volanti. block.dagger-factory.description = Produce unità di base corpo a corpo di terra. block.crawler-factory.description = Produce unità di sciame veloci ed autodistruggenti. block.titan-factory.description = Produce unità terrestri avanzate e corazzate. block.fortress-factory.description = Produce unità di terra di artiglieria pesante. block.repair-point.description = Cura continuamente l'unità danneggiata più vicina. -block.dart-mech-pad.description = Trasforma la tua nave in un mech di attacco di base. \nUsa il blocco toccando due volte mentre ti trovi su di esso. -block.delta-mech-pad.description = Trasforma la tua nave in un mech veloce e leggermente corazzato, ideale per colpire e scappare. \nUsa il blocco toccando due volte mentre ti ci trovi sopra. -block.tau-mech-pad.description = Trasforma la tua nave in un mech di supporto in grado di curare edifici ed unità alleate. \n Usa il blocco toccando due volte mentre sei in piedi su di esso. -block.omega-mech-pad.description = Trasforma la tua nave in un mech voluminoso e ben corazzato, creato per gli assalti in prima linea. \nUsa il blocco toccando due volte mentre sei in piedi su di esso. +block.dart-mech-pad.description = Trasforma la tua nave in un mech di attacco di base.\nUsa il blocco toccando due volte mentre ti trovi su di esso. +block.delta-mech-pad.description = Trasforma la tua nave in un mech veloce e leggermente corazzato, ideale per colpire e scappare.\nUsa il blocco toccando due volte mentre ti trovi su di esso. +block.tau-mech-pad.description = Trasforma la tua nave in un mech di supporto in grado di curare edifici ed unità alleate.\nUsa il blocco toccando due volte mentre ti trovi su di esso. +block.omega-mech-pad.description = Trasforma la tua nave in un mech voluminoso e ben corazzato, creato per gli assalti in prima linea.\nUsa il blocco toccando due volte mentre ti trovi su di esso. block.javelin-ship-pad.description = Trasforma la tua nave in un intercettore forte e veloce con armi elettriche.\nUsa il blocco toccando due volte mentre ti trovi su di esso. -block.trident-ship-pad.description = Trasforma la tua nave in un bombardiere pesante e ben corazzato. \nUsa il blocco toccando due volte mentre ti trovi su di esso. -block.glaive-ship-pad.description = Trasforma la tua nave in una nave grande e ben corazzata. \nUsa il blocco toccando due volte mentre ti trovi su di esso. +block.trident-ship-pad.description = Trasforma la tua nave in un bombardiere pesante e ben corazzato.\nUsa il blocco toccando due volte mentre ti trovi su di esso. +block.glaive-ship-pad.description = Trasforma la tua nave in una nave grande e ben corazzata.\nUsa il blocco toccando due volte mentre ti trovi su di esso. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 2d3db1916e..9fc952977a 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -10,7 +10,9 @@ link.dev-builds.description = 不安定な開発版 link.trello.description = 公式 Trelloボード で実装予定の機能をチェック link.itch.io.description = itch.io でゲームをダウンロード link.google-play.description = Google Play ストアを開く +link.f-droid.description = F-Droid catalogue listing link.wiki.description = 公式 Mindustry Wiki +link.feathub.description = Suggest new features linkfail = リンクを開けませんでした!\nURLをクリップボードにコピーしました。 screenshot = スクリーンショットを {0} に保存しました。 screenshot.invalid = マップが広すぎます。スクリーンショットに必要なメモリが足りない可能性があります。 @@ -18,12 +20,22 @@ gameover = ゲームオーバー gameover.pvp = [accent] {0}[] チームの勝利! highscore = [accent]ハイスコアを更新! copied = コピーしました。 + load.sound = サウンド load.map = マップ load.image = 画像 load.content = コンテンツ load.system = システム load.mod = MOD +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = 設計図 schematic.add = 設計図を保存しています... schematics = 設計図一覧 @@ -40,6 +52,7 @@ schematic.saved = 設計図を保存しました。 schematic.delete.confirm = この設計図は完全に削除されます。よろしいですか schematic.rename = 設計図の名前を変更する。 schematic.info = {0}x{1}, {2} ブロック + stat.wave = 防衛したウェーブ:[accent] {0} stat.enemiesDestroyed = 敵による破壊数:[accent] {0} stat.built = 建設した建造物数:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = 破壊した建造物数:[accent] {0} stat.deconstructed = 解体した建造物数:[accent] {0} stat.delivered = 獲得した資源: stat.rank = 最終ランク: [accent]{0} + launcheditems = [accent]回収したアイテム launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? @@ -74,6 +88,7 @@ maps.browse = マップを閲覧する continue = 続ける maps.none = [lightgray]マップが見つかりませんでした! invalid = 無効 +pickcolor = Pick Color preparingconfig = 設定ファイルを準備中 preparingcontent = コンテンツを準備中 uploadingcontent = コンテンツをアップロードしています @@ -81,6 +96,7 @@ uploadingpreviewfile = プレビューファイルをアップロードしてい committingchanges = 変更を適応中 done = 完了 feature.unsupported = あなたのデバイスはこの機能をサポートしていません。 + mods.alphainfo = Mods機能は実験的なものです。[scarlet] エラーが含まれている可能性があります[]。\n 発見した問題をMindustry GitHubに報告してください。 mods.alpha = [accent](Alpha) mods = Mods @@ -92,18 +108,25 @@ mod.enabled = [lightgray]有効 mod.disabled = [scarlet]無効 mod.disable = 無効化 mod.delete.error = MODを削除することができませんでした。 +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = 有効化 mod.requiresrestart = このModをインストールするためにはゲームの再起動が必要です。 mod.reloadrequired = [scarlet]Modを有効にするには、この画面を開き直してください。 mod.import = Modをインポート mod.import.github = GitHubからMODを読み込む +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = このModを削除します。 mod.author = [LIGHT_GRAY]著者:[] {0} mod.missing = このセーブには、アップグレードされた可能性があるModsか、ここに存在しないModsが必要です。 メモリのセーブを保存する! ロードしてもよろしいですか?\n[lightgray]MODS:\n{0} mod.preview.missing = このModをワークショップで公開するには、Modのプレビュー画像を設定する必要があります。\n[accent] preview.png[] というファイル名の画像をmodsのフォルダに配置し、再試行してください。 mod.folder.missing = ワークショップで公開できるのは、フォルダ形式のModのみとなります。\nModをフォルダ形式に変換するには、ファイルをフォルダに解凍し、古いzipを削除してからゲームを再起動するか、modを再読み込みしてください。 +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = 情報 name = 名前: noname = [accent]プレイヤー名[]を入力してください。 @@ -132,6 +155,7 @@ server.kicked.nameEmpty = 無効な名前です。 server.kicked.idInUse = すでにサーバーに参加しています! 二つのアカウントでの同時接続は許可されていません。 server.kicked.customClient = このサーバーはカスタムビルドをサポートしていません。公式版をダウンロードしてください。 server.kicked.gameover = ゲームオーバー! +server.kicked.serverRestarting = The server is restarting. server.versions = あなたのバージョン:[accent] {0}[]\nサーバーのバージョン:[accent] {1}[] host.info = [accent]ホスト[]をすると、ポート[scarlet]6567[]でサーバーが開かれまます。\n同じ[lightgray]WiFiやローカル上のネットワークなど[]ではサーバーリストに表示されるようになります。\n\nIPアドレスで他のところからも接続できるようにするには、[accent]ポート開放[]が必要です。\n\n注意: もしLAN上のゲームに参加できない場合、Mindustryがファイアーウォールの設定でローカルネットワークへの接続が許可されているかを確認してください。 join.info = ここでは、[accent]サーバーのIPアドレス[]から接続したり、[accent]ローカル上[]のサーバーを探したりすることができます。\nLANやWAN上の両方のマルチプレイに対応しています。\n\n[lightgray]注意: 世界中のサーバーの一覧ではありません。他人のサーバーにIPアドレスで接続したい場合は、あらかじめホスト側にIPアドレスをお尋ねください。 @@ -271,6 +295,7 @@ publishing = [accent]Publishing... publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.error = Error publishing item: {0} steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = ブラシ editor.openin = エディターで開く editor.oregen = 鉱石の生成 @@ -347,6 +372,7 @@ editor.overwrite = [accent]警告!\nすでに存在するマップを上書き editor.overwrite.confirm = [scarlet]警告![] すでに同じ名前のマップが存在します。上書きしてもよろしいですか? editor.exists = すでに同じ名前のマップが存在します。 editor.selectmap = 読み込むマップを選択: + toolmode.replace = 置きかえ toolmode.replace.description = 固体ブロックのみに描きます。 toolmode.replaceall = 全て置きかえ @@ -361,6 +387,7 @@ toolmode.fillteams = チームで埋める toolmode.fillteams.description = ブロックの代わりにチームで埋めます。 toolmode.drawteams = チームを描く toolmode.drawteams.description = ブロックの代わりにチームを描きます。 + filters.empty = [lightgray]フィルターが設定されていません! 下のボタンからフィルターを追加してください。 filter.distort = ゆがみ filter.noise = ノイズ @@ -392,6 +419,7 @@ filter.option.floor2 = 2番目の地面 filter.option.threshold2 = 2番目のスレッシュホールド filter.option.radius = 半径 filter.option.percentile = パーセンタイル + width = 幅: height = 高さ: menu = メニュー @@ -407,6 +435,7 @@ tutorial = チュートリアル tutorial.retake = チュートリアル editor = エディター mapeditor = マップエディター + abandon = 撤退 abandon.text = このゾーンのすべての資源が敵に奪われます。 locked = ロック @@ -437,6 +466,7 @@ zone.objective.survival = 敵からコアを守り切る zone.objective.attack = 敵のコアを破壊する add = 追加... boss.health = ボスのHP + connectfail = [crimson]サーバーへ接続できませんでした:\n\n[accent]{0} error.unreachable = サーバーに到達できません。\nアドレスは正しいですか? error.invalidaddress = 無効なアドレスです。 @@ -447,6 +477,7 @@ error.mapnotfound = マップファイルが見つかりません! error.io = ネットワークエラーです。 error.any = 不明なネットワークエラーです。 error.bloom = Bloomの初期化に失敗しました。\n恐らくあなたのデバイスではBloomがサポートされていません。 + zone.groundZero.name = グラウンド · ゼロ zone.desertWastes.name = デザート · ウェーツ zone.craters.name = ザ · クレーター @@ -461,6 +492,7 @@ zone.saltFlats.name = ソルト · フラッツ zone.impact0078.name = インパクト 0078 zone.crags.name = クラーグス zone.fungalPass.name = ファングル ・ パス + zone.groundZero.description = Mindustryに慣れていない初心者向けのマップです。敵は強くなく、資源も多すぎません。\n出来るだけ多くの銅と鉛を集めるのがポイントです。 zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\n電力を使用してみましょう。火力発電機を建設し、修復機の使い方を学びましょう。 zone.desertWastes.description = 大量の廃棄物が散乱し、放棄された建造物が存在します。\nこのマップには石炭が存在します。石炭を燃やして発電したり、グラファイトを生成しましょう。\n\n[lightgray]この着陸位置は保証できません。 @@ -475,10 +507,12 @@ 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.impact0078.description = zone.crags.description = + settings.language = 言語 settings.data = ゲームデータ settings.reset = デフォルトにリセット settings.rebind = 再設定 +settings.resetKey = Reset settings.controls = コントロール settings.game = ゲーム settings.sound = サウンド @@ -529,6 +563,7 @@ blocks.inaccuracy = 精度のずれ blocks.shots = ショット blocks.reload = ショット/秒 blocks.ammo = 弾薬 + bar.drilltierreq = より良いドリルが必要です bar.drillspeed = 採掘速度: {0}/秒 bar.pumpspeed = ポンプの速度: {0}/s @@ -544,6 +579,9 @@ bar.heat = 熱 bar.power = 電力 bar.progress = 建設状況 bar.spawned = ユニット数: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] ダメージ bullet.splashdamage = [stat]{0}[lightgray] 範囲ダメージ 約[stat] {1}[lightgray] タイル bullet.incendiary = [stat]焼夷弾 @@ -555,6 +593,7 @@ bullet.freezing = [stat]フリーズ bullet.tarred = [stat]タール弾 bullet.multiplier = [stat]弾薬 {0}[lightgray]倍 bullet.reload = [stat]リロード速度 {0}[lightgray]倍 + unit.blocks = ブロック unit.powersecond = 電力/秒 unit.liquidsecond = 液体/秒 @@ -567,6 +606,8 @@ unit.persecond = /秒 unit.timesspeed = 倍の速度 unit.percent = % unit.items = アイテム +unit.thousands = k +unit.millions = mil category.general = 一般 category.power = 電力 category.liquids = 液体 @@ -579,6 +620,7 @@ setting.shadows.name = 影 setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = リニアフィルター setting.hints.name = ヒント +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = 水のアニメーション setting.animatedshields.name = シールドのアニメーション setting.antialias.name = アンチエイリアス[lightgray] (再起動が必要)[] @@ -601,12 +643,16 @@ setting.screenshake.name = 画面の揺れ setting.effects.name = 画面効果 setting.destroyedblocks.name = 破壊されたブロックを表示 setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = 操作感度 setting.saveinterval.name = 自動保存間隔 setting.seconds = {0} 秒 +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = フルスクリーン setting.borderlesswindow.name = 境界の無いウィンドウ[lightgray] (再起動が必要になる場合があります) setting.fps.name = FPSを表示 +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = ピクセル化[lightgray] (アニメーションが無効化されます) setting.minimap.name = ミニマップを表示 @@ -635,16 +681,36 @@ category.multiplayer.name = マルチプレイ command.attack = 攻撃 command.rally = Rally command.retreat = 後退 +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Clear Building keybind.press = キーを押してください... keybind.press.axis = 軸またはキーを押してください... keybind.screenshot.name = スクリーンショット +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = 左右移動 keybind.move_y.name = 上下移動 +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = ダッシュ keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_y.name = Flip Schematic Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = フルスクリーンの切り替え keybind.select.name = 選択/ショット keybind.diagonal_placement.name = 斜め設置 @@ -657,7 +723,6 @@ keybind.menu.name = メニュー keybind.pause.name = ポーズ keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = ミニマップ -keybind.dash.name = ダッシュ keybind.chat.name = チャット keybind.player_list.name = プレイヤーリスト keybind.console.name = コンソール @@ -680,7 +745,9 @@ mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[ mode.attack.name = アタック mode.attack.description = ウェーブがなく、敵の基地を破壊することを目指します。\n[gray]プレイするには、マップに赤色のコアが必要です。 mode.custom = カスタムルール + rules.infiniteresources = 資源の無限化 +rules.reactorexplosions = Reactor Explosions rules.wavetimer = ウェーブの自動進行 rules.waves = ウェーブ rules.attack = アタックモード @@ -688,6 +755,7 @@ rules.enemyCheat = 敵(赤チーム)の資源の無限化 rules.unitdrops = ユニットの戦利品 rules.unitbuildspeedmultiplier = ユニットの製造速度倍率 rules.unithealthmultiplier = ユニットの体力倍率 +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = プレイヤーの体力倍率 rules.playerdamagemultiplier = プレイヤーのダメージ倍率 rules.unitdamagemultiplier = ユニットのダメージ倍率 @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = 資源 & 建設 rules.title.player = プレイヤー rules.title.enemy = 敵 rules.title.unit = ユニット +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = アイテム content.liquid.name = 液体 content.unit.name = ユニット @@ -752,6 +824,7 @@ mech.trident-ship.name = トライデント mech.trident-ship.weapon = 爆弾 mech.glaive-ship.name = グライブ mech.glaive-ship.weapon = 焼夷弾 +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [lightgray]爆発性: {0}% item.flammability = [lightgray]可燃性: {0}% item.radioactivity = [lightgray]放射能: {0}% @@ -767,6 +840,7 @@ mech.buildspeed = [lightgray]建設速度: {0}% liquid.heatcapacity = [lightgray]熱容量: {0} liquid.viscosity = [lightgray]粘度: {0} liquid.temperature = [lightgray]温度: {0} + block.sand-boulder.name = 巨大な礫 block.grass.name = 草 block.salt.name = 岩塩氷河 @@ -865,6 +939,8 @@ block.distributor.name = ディストリビューター block.sorter.name = ソーター block.inverted-sorter.name = 反転ソーター block.message.name = メッセージブロック +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = オーバーフローゲート block.silicon-smelter.name = シリコン溶鉱炉 block.phase-weaver.name = フェーズ織機 @@ -878,6 +954,7 @@ block.coal-centrifuge.name = 石炭遠心分離機 block.power-node.name = 電源ノード block.power-node-large.name = 大型電源ノード block.surge-tower.name = サージタワー +block.diode.name = Battery Diode block.battery.name = バッテリー block.battery-large.name = 大型バッテリー block.combustion-generator.name = 火力発電機 @@ -901,6 +978,7 @@ block.mechanical-pump.name = 機械ポンプ block.item-source.name = アイテムソース block.item-void.name = アイテムボイド block.liquid-source.name = 液体ソース +block.liquid-void.name = Liquid Void block.power-void.name = 電力ボイド block.power-source.name = 無限電源 block.unloader.name = 搬出機 @@ -930,6 +1008,7 @@ block.fortress-factory.name = フォートレスユニット製造機 block.revenant-factory.name = レベナントファイター製造機 block.repair-point.name = 修復ポイント block.pulse-conduit.name = パルスパイプ +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = フェーズパイプ block.liquid-router.name = 液体ルーター block.liquid-tank.name = 液体タンク @@ -1001,6 +1080,7 @@ tutorial.deposit = 機体にあるアイテムをドラッグアンドドロッ tutorial.waves = [lightgray]敵[]がやってきます。\n\n2ウェーブの間コアを守ってみましょう。[accent]クリック[]で弾を発射することができます。\nさらにドリルやデュオを設置しましょう。さらに銅を採掘しましょう。 tutorial.waves.mobile = [lightgray]敵[]がやってきます。\n\n2ウェーブの間コアを守ってみましょう。あなたの機体は自動で敵を攻撃してくれます。\nさらにドリルやデュオを設置しましょう。さらに銅を採掘しましょう。 tutorial.launch = 離脱可能なウェーブに達すると、[accent]コアにある全ての資源を持って[]、マップから[accent]離脱する[]ことができます。\nこれらの資源は、新しい技術の研究に使用することができます。\n\n[accent]離脱ボタンを押しましょう。 + item.copper.description = 便利な鉱石です。様々なブロックの材料として幅広く使われています。 item.lead.description = 一般的で手軽な鉱石です。機械や液体輸送ブロックなどに使われます。 item.metaglass.description = とても頑丈な強化ガラスです。液体の輸送やタンクとして幅広く使われています。 @@ -1062,6 +1142,7 @@ block.power-source.description = 無限に電力を出力します。サンド block.item-source.description = アイテムを無限に搬出します。サンドボックスモードのみ使用できます。 block.item-void.description = 電力を必要とせずにアイテムを廃棄します。サンドボックスモードのみ使用できます。 block.liquid-source.description = 液体を無限に搬出します。サンドボックスモードのみ使用できます。 +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = 安価な防壁ブロックです。\n最初のウェーブでコアやターレットを保護するのに有用です。 block.copper-wall-large.description = 安価な大型防壁ブロックです。\n最初のウェーブでコアやターレットを保護するのに有用です。 block.titanium-wall.description = 適度に強力な防壁ブロックです。\n中程度の攻撃から保護します。 @@ -1097,6 +1178,7 @@ block.rotary-pump.description = 高度なポンプです。電力を使用して block.thermal-pump.description = 最高性能のポンプです。 block.conduit.description = 一般的な液体輸送ブロックです。液体版のコンベアーです。ポンプや他のパイプに使うことができます。 block.pulse-conduit.description = 高度な液体輸送ブロックです。通常のパイプより速く、たくさんのアイテムを輸送することができます。 +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = 搬入したアイテムをほかの3方向に均等に搬出します。液体の漏れを防ぐことができます。一つの資源から複数に分ける際などに使われます。 block.liquid-tank.description = 大量の液体を保管しておくことができます。需要が不安定な製造設備や重要な施設の冷却水の予備などとして使用されます。 block.liquid-junction.description = パイプを他のパイプと交差できるようにします。それぞれ搬入した液体を前方に搬出します。パイプで複雑な構造を組み立てるときなどに使われます。 @@ -1105,6 +1187,7 @@ block.phase-conduit.description = 高度な液体輸送ブロックです。電 block.power-node.description = 電力ノード間で電力の送電を行います。最大で4つの電力源やノードなどに接続できます。隣接するブロックから電力の送電や供給を行います。 block.power-node-large.description = 巨大な電力ノードです。最大で6つの電力源やノードに接続できます。 block.surge-tower.description = 接続できる量は少ないが、とても長い距離を接続できる電力ノードです。 +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = 余分な電力の充電して、貯めておくことができます。必要があれば、溜まった電力を供給します。 block.battery-large.description = 通常のバッテリーよりもたくさんの電力を溜めておくことができます。 block.combustion-generator.description = 石油や可燃性の物質を燃やして発電します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 71a44a6bff..d2d9b54b9a 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -7,14 +7,15 @@ link.reddit.description = Mindustry 레딧 link.github.description = 게임 소스코드 link.changelog.description = 새로 추가된 것들 link.dev-builds.description = 불안정한 개발 빌드들 -link.trello.description = 다음 출시될 기능들을 게시한 공식 Trello 보드 +link.trello.description = 출시 예정중인 기능들을 게시한 공식 Trello 보드 link.itch.io.description = PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트 link.google-play.description = Google Play 스토어 정보 link.f-droid.description = F-Droid 카탈로그 link.wiki.description = 공식 Mindustry 위키 +link.feathub.description = 기능 아이디어 건의하기 linkfail = 링크를 여는 데 실패했습니다!\nURL이 기기의 클립보드에 복사되었습니다. -screenshot = 스크린샷이 {0} 경로에 저장되었습니다. -screenshot.invalid = 맵이 너무 커서 스크린샷을 찍을 메모리가 충분하지 않습니다. +screenshot = 스크린 샷이 {0} 경로에 저장되었습니다. +screenshot.invalid = 맵이 너무 커서 스크린 샷을 찍을 메모리가 충분하지 않습니다. gameover = 게임 오버 gameover.pvp = [accent]{0}[] 팀이 승리했습니다! highscore = [accent]최고점수 달성! @@ -28,6 +29,13 @@ load.system = 시스템 load.mod = 모드 load.scripts = 스크립트 +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = 설계도 schematic.add = 설계도 저장하기 schematics = 설계도 모음 @@ -35,11 +43,11 @@ schematic.replace = 이 설계도와 같은 이름의 설계도가 이미 존재 schematic.import = 설계도 불러오기 schematic.exportfile = 파일 내보내기 schematic.importfile = 파일 불러오기 -schematic.browseworkshop = 워크샵 탐색 +schematic.browseworkshop = Workshop 탐색 schematic.copy = 클립보드에 복사하기 schematic.copy.import = 클립보드에서 붙여넣기 schematic.shareworkshop = 워크샵에 공유 -schematic.flip = 좌우 뒤집기 :[accent][[{0}][] / 상하 뒤집기 : [accent][[{1}][] +schematic.flip = 좌우 뒤집기 : [accent][[{0}][] / 상하 뒤집기 : [accent][[{1}][] schematic.saved = 설계도 저장됨. schematic.delete.confirm = 삭제된 설계도는 복구할 수 없습니다. 정말로 삭제하시겠습니까? schematic.rename = 설계도명 변경 @@ -94,7 +102,7 @@ mods.alpha = [scarlet](Alpha) mods = 모드 mods.none = [LIGHT_GRAY]추가한 모드가 없습니다! mods.guide = 모드 가이드 -mods.report = 버그 신고 +mods.report = 문제 신고 mods.openfolder = 모드 폴더 열기 mod.enabled = [lightgray]활성화 mod.disabled = [scarlet]비활성화 @@ -102,7 +110,10 @@ mod.disable = 비활성화 mod.delete.error = 모드를 삭제할 수 없습니다. 아마도 해당 모드가 사용중인 것 같습니다. mod.requiresversion = [scarlet]게임의 버전이 낮아 모드를 활성화할 수 없습니다!\n[scarlet]요구되는 게임 버전 : [accent]{0} mod.missingdependencies = [scarlet]의존되는 모드: {0} -mod.nowdisabled = [scarlet]모드 '{0}'는 다음의 모드에 의존합니다 :[accent] {1}\n[lightgray]이 모드를 먼저 다운로드해야합니다.\n이 모드는 자동으로 비활성화됩니다. +mod.erroredcontent = [scarlet]컨텐츠 오류 +mod.errors = 컨텐츠를 불러오는 중 오류가 발생하였습니다. +mod.noerrorplay = [scarlet]모드에 오류가 존재합니다.[] 해당 오류가 발생하는 모드를 비활성화하거나 모드의 오류를 고친 후 플레이가 가능합니다. +mod.nowdisabled = [scarlet]모드 '{0}'는 다음의 모드에 의존합니다 : [accent] {1}\n[lightgray]이 모드를 먼저 다운로드해야합니다.\n이 모드는 자동으로 비활성화됩니다. mod.enable = 활성화 mod.requiresrestart = 모드 변경사항을 적용하기 위해 게임을 종료합니다. mod.reloadrequired = [scarlet]새로고침 예정됨 @@ -111,7 +122,7 @@ mod.import.github = 깃허브 모드 추가 mod.item.remove = 이것은 모드[accent] '{0}'[]의 자원입니다. 이 자원을 삭제하려면, 이 모드를 제거해야합니다. mod.remove.confirm = 이 모드를 삭제하시겠습니까? mod.author = [LIGHT_GRAY]제작자 : [] {0} -mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 이 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 파일을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0} +mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 현재 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 파일을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0} mod.preview.missing = 워크샵에 당신의 모드를 업로드하기 전에 미리보기 이미지를 먼저 추가해야합니다.\n[accent] preview.png[]라는 이름으로 미리보기 이미지를 당신의 모드 폴더안에 준비한 후 다시 시도해주세요. mod.folder.missing = 워크샵에는 폴더 형태의 모드만 게시할 수 있습니다.\n모드를 폴더 형태로 바꾸려면 파일을 폴더에 압축 해제하고 이전 압축파일을 제거한 후, 게임을 재시작하거나 모드를 다시 로드하십시오. mod.scripts.unsupported = 당신의 기기는 모드스크립트를 지원하지 않습니다. 모드의 일부 기능이 작동하지 않을 수 있습니다. @@ -144,6 +155,7 @@ server.kicked.nameEmpty = 당신의 닉네임이 비어있습니다. server.kicked.idInUse = 이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다. server.kicked.customClient = 이 서버는 직접 빌드한 버전을 지원하지 않습니다. 공식 버전을 사용하세요. server.kicked.gameover = 코어가 파괴되었습니다... +server.kicked.serverRestarting = The server is restarting. server.versions = 클라이언트 버전 : [accent] {0}[]\n서버 버전 : [accent] {1}[] host.info = [accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 포트를 사용합니다.\n[LIGHT_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 하시거나 VPN을 사용하셔야 합니다.\n\n[LIGHT_GRAY]참고: LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인해주세요. join.info = 여기서 서버 추가를 누르신 후, [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원합니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속하려면 직접 서버 주소를 찾아서 적으셔야합니다.[]\n\n[ROYAL]한국의 서버로는 [accent]mindustry.kr[]의 6567, 6568포트와 [accent]server1.mindustry.r-e.kr[]의 8000, 8002 포트가 있습니다.\n서버 주소 입력방법은 < 주소:포트 >의 형식입니다.\n[royal]포트가 없을 시에는 그냥 주소만 입력하시면 됩니다.\n\n[royal]예시) mindustry.kr의 6567포트\nmindustry.kr:6567\n포트가 6567일 경우에는 :6567을 생략할 수 있습니다. @@ -568,7 +580,7 @@ bar.power = 전력 bar.progress = 생산 진행도 bar.spawned = 최대 {1}기 중 {0}기 생산됨 bar.input = 입력 -bar.output = +bar.output = Output bullet.damage = [lightgray]피해량 : [stat]{0}[] bullet.splashdamage = [lightgray]범위 피해량 : [stat]{0}[] / [lightgray]피해 범위 : [stat]{1}[lightgray] 타일 @@ -594,8 +606,8 @@ unit.persecond = /초 unit.timesspeed = x 배 unit.percent = % unit.items = 자원 -unit.thousands = 천 -unit.millions = 백만 +unit.thousands = k +unit.millions = mil category.general = 일반 category.power = 전력 category.liquids = 액체 @@ -631,11 +643,12 @@ setting.screenshake.name = 화면 흔들기 setting.effects.name = 화면 효과 setting.destroyedblocks.name = 부서진 블럭 표시 setting.conveyorpathfinding.name = 교차기 자동 설치 +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = 컨트롤러 감도 setting.saveinterval.name = 저장 간격 setting.seconds = {0} 초 setting.blockselecttimeout.name = 블록 선택 시간 초과 -setting.milliseconds = {0} 밀리초 +setting.milliseconds = {0} ms setting.fullscreen.name = 전체 화면 setting.borderlesswindow.name = 테두리 없는 창모드[LIGHT_GRAY] (재시작이 필요할 수 있습니다) setting.fps.name = FPS 표시 @@ -677,26 +690,27 @@ keybind.toggle_power_lines.name = 전력 라인 허용 keybind.move_x.name = 오른쪽 / 왼쪽 이동 keybind.move_y.name = 위 / 아래 이동 keybind.mouse_move.name = 커서를 따라서 이동 +keybind.dash.name = 달리기 keybind.schematic_select.name = 영역 설정 keybind.schematic_menu.name = 설계도 메뉴 keybind.schematic_flip_x.name = 설계도 X축 뒤집기 keybind.schematic_flip_y.name = 설계도 Y축 뒤집기 keybind.category_prev.name = 이전 목록 keybind.category_next.name = 다음 목록 -keybind.block_select_left.name = 블럭 왼쪽 선택 -keybind.block_select_right.name = 블럭 오른쪽 선택 -keybind.block_select_up.name = 블럭 위쪽 선택 -keybind.block_select_down.name = 블럭 아래쪽 선택 -keybind.block_select_01.name = 카테고리/블럭 선택 1 -keybind.block_select_02.name = 카테고리/블럭 선택 2 -keybind.block_select_03.name = 카테고리/블럭 선택 3 -keybind.block_select_04.name = 카테고리/블럭 선택 4 -keybind.block_select_05.name = 카테고리/블럭 선택 5 -keybind.block_select_06.name = 카테고리/블럭 선택 6 -keybind.block_select_07.name = 카테고리/블럭 선택 7 -keybind.block_select_08.name = 카테고리/블럭 선택 8 -keybind.block_select_09.name = 카테고리/블럭 선택 9 -keybind.block_select_10.name = 카테고리/블럭 선택 10 +keybind.block_select_left.name = 블록 왼쪽 선택 +keybind.block_select_right.name = 블록 오른쪽 선택 +keybind.block_select_up.name = 블록 위쪽 선택 +keybind.block_select_down.name = 블록 아래쪽 선택 +keybind.block_select_01.name = 카테고리/블록 선택 1 +keybind.block_select_02.name = 카테고리/블록 선택 2 +keybind.block_select_03.name = 카테고리/블록 선택 3 +keybind.block_select_04.name = 카테고리/블록 선택 4 +keybind.block_select_05.name = 카테고리/블록 선택 5 +keybind.block_select_06.name = 카테고리/블록 선택 6 +keybind.block_select_07.name = 카테고리/블록 선택 7 +keybind.block_select_08.name = 카테고리/블록 선택 8 +keybind.block_select_09.name = 카테고리/블록 선택 9 +keybind.block_select_10.name = 카테고리/블록 선택 10 keybind.fullscreen.name = 전체 화면 keybind.select.name = 선택/공격 keybind.diagonal_placement.name = 대각선 설치 @@ -709,15 +723,14 @@ keybind.menu.name = 메뉴 keybind.pause.name = 일시중지 keybind.pause_building.name = 건설 일시정지/계속하기 keybind.minimap.name = 미니맵 -keybind.dash.name = 달리기 keybind.chat.name = 채팅 keybind.player_list.name = 플레이어 목록 keybind.console.name = 콘솔 keybind.rotate.name = 회전 keybind.rotateplaced.name = 기존 회전 (고정) keybind.toggle_menus.name = 메뉴 보이기/숨기기 -keybind.chat_history_prev.name = 이전 채팅기록 -keybind.chat_history_next.name = 다음 채팅기록 +keybind.chat_history_prev.name = 이전 채팅 기록 +keybind.chat_history_next.name = 다음 채팅 기록 keybind.chat_scroll.name = 채팅 스크롤 keybind.drop_unit.name = 유닛 처치 시 자원획득 keybind.zoom_minimap.name = 미니맵 확대 @@ -730,11 +743,11 @@ mode.editor.name = 편집기 mode.pvp.name = PvP mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 2개의 다른 색상 코어가 있어야 합니다. mode.attack.name = 공격 -mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다. +mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간 팀 코어가 있어야 플레이 가능합니다. mode.custom = 사용자 정의 규칙 rules.infiniteresources = 무한 자원 -rules.reactorexplosions = 원자로 폭발 허가여부 +rules.reactorexplosions = 원자로 폭발 허가 여부 rules.wavetimer = 단계 대기시간 rules.waves = 단계 활성화 rules.attack = 공격 모드 @@ -742,6 +755,7 @@ rules.enemyCheat = 무한한 적 자원 rules.unitdrops = 유닛 처치시 자원 약탈 rules.unitbuildspeedmultiplier = 유닛 제조속도 배수 rules.unithealthmultiplier = 유닛 체력 배수 +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = 플레이어 체력 배수 rules.playerdamagemultiplier = 플레이어 공격력 배수 rules.unitdamagemultiplier = 유닛 공격력 배수 @@ -750,7 +764,7 @@ rules.respawntime = 플레이어 부활 대기 시간 : [LIGHT_GRAY] (초) rules.wavespacing = 단계 간격 : [LIGHT_GRAY] (초) rules.buildcostmultiplier = 건설 소모 배수 rules.buildspeedmultiplier = 건설 속도 배수 -rules.waitForWaveToEnd = 단계가 끝날때까지 기다리는중 +rules.waitForWaveToEnd = 단계가 끝날때까지 기다리는 중 rules.dropzoneradius = 소환 충격파 범위 : [LIGHT_GRAY] (타일) rules.respawns = 단계당 최대 플레이어 부활 횟수 rules.limitedRespawns = 플레이어 부활 제한 @@ -810,7 +824,7 @@ mech.trident-ship.name = 트라이던트 mech.trident-ship.weapon = 폭탄 저장고 mech.glaive-ship.name = 글레이브 mech.glaive-ship.weapon = 중무장 인화성 소총 -item.corestorable = [lightgray]코어 잔여 저장공간: {0} +item.corestorable = [lightgray]코어 저장 가능 여부 : {0} item.explosiveness = [LIGHT_GRAY]폭발성 : {0} item.flammability = [LIGHT_GRAY]인화성 : {0} item.radioactivity = [LIGHT_GRAY]방사능 : {0} @@ -964,6 +978,7 @@ block.mechanical-pump.name = 기계식 펌프 block.item-source.name = 아이템 소스 block.item-void.name = 아이템 삭제 장치 block.liquid-source.name = 무한 액체공급 장치 +block.liquid-void.name = Liquid Void block.power-void.name = 방전장치 block.power-source.name = 무한 전력공급 장치 block.unloader.name = 언로더 @@ -1117,7 +1132,7 @@ block.cryofluidmixer.description = 물과 티타늄을 냉각에 훨씬 더 효 block.blast-mixer.description = 포자를 사용하여 파이라타이트를 폭발성 화합물로 변환시킵니다. block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다. block.melter.description = 고철을 녹여 파도의 탄약 혹은 원심 분리기에 사용할 수 있는 액체인 광재로 만듭니다. -block.separator.description = 광재룰 각종 자원으로 재활용 할 수 있게 해 주는 건물입니다. +block.separator.description = 광재를 각종 자원으로 재활용 할 수 있게 해 주는 건물입니다. block.spore-press.description = 포자를 압축해 기름을 추출합니다. block.pulverizer.description = 고철을 갈아 모래로 만듭니다. 맵에 모래가 부족할 때 유용합니다. block.coal-centrifuge.description = 석유로 석탄을 만듭니다. @@ -1127,6 +1142,7 @@ block.power-source.description = 무한한 전력을 공급해주는 블록입 block.item-source.description = 자원을 선택하면 그 자원이 무한하게 생성되는 블록입니다.\n샌드박스에서만 건설가능. block.item-void.description = 자원을 사라지게 만듭니다.\n샌드박스에서만 건설가능. block.liquid-source.description = 무한한 액체를 출력합니다.\n샌드박스에서만 건설가능. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = 게임 시작 초기에 방어용으로 적합합니다. block.copper-wall-large.description = 구리 벽 4개를 뭉친 블럭입니다. block.titanium-wall.description = 흑연이 생산될 즈음에 사용하기 적합합니다. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 4e0b424284..6a8681f28a 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -1,45 +1,58 @@ -credits.text = Gemaakt door [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] - +credits.text = Gemaakt door [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Credits -contributors = Vertalers en Medewerkers +contributors = Vertalers en Bijdragers discord = Word lid van de Mindustry Discord! link.discord.description = De officiële Mindustry discord chatroom -link.reddit.description = The Mindustry subreddit +link.reddit.description = De Mindustry subreddit link.github.description = Game broncode -link.changelog.description = Lijst van Updates +link.changelog.description = Lijst van updates link.dev-builds.description = Onstabiele ontwikkeling builds link.trello.description = Officiële trello-bord voor geplande functies -link.itch.io.description = itch.io pagina met pc-downloads en webversie +link.itch.io.description = itch.io pagina met pc-downloads link.google-play.description = Google Play store vermelding +link.f-droid.description = F-Droid catalogus vermelding link.wiki.description = Officiële Mindustry wiki +link.feathub.description = Stel iets voor linkfail = Kan link niet openen!\nDe URL is gekopieerd naar je klembord screenshot = Schermafbeeling opgeslagen in {0} -screenshot.invalid = Map is te groot, Mogelijk niet genoeg ruimte op apparaat. +screenshot.invalid = Map is te groot, Mogelijk niet genoeg geheugen beschikbaar voor een schermafbeelding. gameover = Spel afgelopen gameover.pvp = het[accent] {0}[] team heeft gewonnen! highscore = [accent]Nieuw topscore! -copied = Copied. +copied = Gekopieerd. + load.sound = Geluid load.map = Mappen load.image = Afbeeldingen load.content = inhoud load.system = Systeem load.mod = Mods -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. -schematic.delete.confirm = This schematic will be utterly eradicated. -schematic.rename = Rename Schematic -schematic.info = {0}x{1}, {2} blocks +load.scripts = Scripts + +be.update = Er is een nieuwe Bleeding Edge versie beschikbaar: +be.update.confirm = Download het en herstart? +be.updating = Updaten... +be.ignore = Negeer +be.noupdates = Geen updates gevonden. +be.check = Check voor updates + +schematic = Blauwdruk +schematic.add = Bewaar blauwdruk... +schematics = Blauwdrukken +schematic.replace = Er bestaat al een blauwdruk met die naam. Overschrijven? +schematic.import = Importeer blauwdrul... +schematic.exportfile = Exporteer bestand +schematic.importfile = Importeer bestand +schematic.browseworkshop = Blader Werkplaats +schematic.copy = Kopiëren naar Klembord +schematic.copy.import = Importeren van Klembord +schematic.shareworkshop = Delen op de Werkplaats +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Spiegel blauwdruk +schematic.saved = Blauwdruk bewaard. +schematic.delete.confirm = Deze blauwdruk zal in een zwart gat verdwijnen. +schematic.rename = Hernoem blauwdruk +schematic.info = {0}x{1}, {2} blokken + stat.wave = Waves Verslagen:[accent] {0} stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0} stat.built = Gebouwen Gebouwd:[accent] {0} @@ -47,68 +60,78 @@ stat.destroyed = Gebouwen Vernietigd:[accent] {0} stat.deconstructed = Gebouwen Gesloopt:[accent] {0} stat.delivered = Middelen Gelanceerd: stat.rank = Eindrang: [accent]{0} + launcheditems = [accent]Gelanceerde items -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +launchinfo = [unlaunched][[LANCEER] je core om de in blauw gekleurde items te verkrijgen. map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"? level.highscore = Topscore: [accent]{0} level.select = Selecteer Level level.mode = Spelmodus: showagain = Niet Laten zien in de volgende sessie coreattack = < Core wordt aangevallen! > -nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent +nearpoint = [[ [scarlet]VERLAAT DE LANDINGSZONE ONMIDDELIJK[] ]\nlevensgevaarlijk database = Core Database savegame = Opslaan loadgame = Laden joingame = Treed toe customgame = Aangepast spel newgame = Nieuw spel -none = -minimap = Minimap -position = Position +none = +minimap = Landkaart +position = Positie close = Aflsuiten website = Website quit = Stoppen -save.quit = Save & Quit +save.quit = Bewaar & Stop maps = Mappen -maps.browse = Browse Maps +maps.browse = Blader mappen continue = Ga door maps.none = [LIGHT_GRAY]Geen map gevonden! -invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes -done = Done -feature.unsupported = Your device does not support this feature. -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. -mods.alpha = [accent](Alpha) +invalid = Ongeldig +pickcolor = Kies kleur +preparingconfig = Configuratie voorbereiden +preparingcontent = Inhoud voorbereiden +uploadingcontent = Inhoud aan het uploaden +uploadingpreviewfile = Thumbnail aan het uploaden +committingchanges = Wijzigingen aan het bewaren +done = Klaar +feature.unsupported = Je apparaat ondersteunt deze functionaliteit niet. + +mods.alphainfo = Houd in gedachten dat mod ondersteuning nieuw is, en daarom[scarlet] mogelijk ontstabiel is[].\nVermeld problemen die je ermee ondervind in de Mindustry GitHub of Discord. +mods.alpha = [accent](Onstabiel) mods = Mods -mods.none = [LIGHT_GRAY]No mods found! -mods.guide = Modding Guide -mods.report = Report Bug -mods.openfolder = Open Mod Folder -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = Disable -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -mod.enable = Enable -mod.requiresrestart = The game will now close to apply the mod changes. -mod.reloadrequired = [scarlet]Reload Required -mod.import = Import Mod -mod.import.github = Import GitHub Mod -mod.remove.confirm = This mod will be deleted. -mod.author = [LIGHT_GRAY]Author:[] {0} -mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mods.none = [LIGHT_GRAY]Geen mods gevonden! +mods.guide = Modding Handboek +mods.report = Rapporteer Bug +mods.openfolder = Open Mod Map +mod.enabled = [lightgray]Aan +mod.disabled = [scarlet]Uit +mod.disable = Deactiveer +mod.delete.error = Mod verwijderen mislukt. Bestand mogelijk in gebruik. +mod.requiresversion = [scarlet]Vereist minimaal mindustry versie: [accent]{0} +mod.missingdependencies = [scarlet]Missende benodigdheden: {0} +mod.erroredcontent = [scarlet]Inhoud Fouten +mod.errors = Er hebben zich fouten voordaan tijdens het laden van de inhoud. +mod.noerrorplay = [scarlet]Je mods bevatten fouten.[] Zet de mods uit of los de problemen op voordat je verder gaat. +mod.nowdisabled = [scarlet]Mod '{0}' mist een aantal benodigdheden:[accent] {1}\n[lightgray]Deze moet je eerst zelf downloaden.\nDeze mod is nu voor je uitgezet. +mod.enable = Activeer +mod.requiresrestart = Deze game zal nu herstarten om de veranderingen aan de mods door te voeren. +mod.reloadrequired = [scarlet]Herladen Vereist +mod.import = Importeer Mod +mod.import.github = Importeer GitHub Mod +mod.item.remove = Dit item is onderdeel van de[accent] '{0}'[] mod. Verwijder deze eerst. +mod.remove.confirm = Deze mod zal worden verwijderd. +mod.author = [LIGHT_GRAY]Auteur:[] {0} +mod.missing = Deze Save bevat mods die zijn geupdatet of die je niet meer hebt geinstaleerd. Je save kan mogelijk kapot gaat. Weet je zeker dat je het wilt proberen?\n[lightgray]Mods:\n{0} +mod.preview.missing = Voordat je je mod publiceert in de workshop moet je een thumbnail toevoegen.\nPlaats een afbeelding genaamd[accent] preview.png[] in de map van die mod en probeer opnieuw. +mod.folder.missing = Enkel mods in map formaat kunnen worden gepubliceerd in de workshop.\nOm een mod om te zetten in een map, unzip de mod en verwijder de zip, hetstart dan het spel of herlaad de mods. +mod.scripts.unsupported = Je apparaat ondersteunt geen mods met scripts. Sommige mods zullen niet correct werken. + about.button = Over name = Naam: noname = Maak eerst een[accent] Speler naam[]. filename = Bestandsnaam: -unlocked = New content unlocked! +unlocked = Nieuwe inhoud ontgrendeld! completed = [accent]Voltooid techtree = Tech boom research.list = [LIGHT_GRAY]Onderzoek: @@ -118,619 +141,668 @@ players = {0} Spelers online players.single = {0} Speler online server.closing = [accent]Server aan het sluiten... server.kicked.kick = Je bent verwijderd van deze sessie. -server.kicked.whitelist = You are not whitelisted here. +server.kicked.whitelist = Je staat niet op de whitelist. server.kicked.serverClose = Server afgesloten... server.kicked.vote = Je bent ge vote-kicked. Tot ziens. server.kicked.clientOutdated = Verouderde versie! Update jouw spel! server.kicked.serverOutdated = Verouderde server! Vraag de host om te upgraden! server.kicked.banned = Je bent verbannen van deze server. server.kicked.typeMismatch = Deze server is niet compitabel met jouw bouwtype. -server.kicked.playerLimit = This server is full. Wait for an empty slot. +server.kicked.playerLimit = Deze server is vol. Wacht voor een vrije plek. server.kicked.recentKick = Je bent reeds verwijderd.\nWacht voordat je opnieuw verbindt. server.kicked.nameInUse = Er is al iemand met die naam\nop deze server. server.kicked.nameEmpty = Je gekozen naam is niet geldig. server.kicked.idInUse = Je bent al verbonden met deze server! Verbinden met 2 accounts is verboden. server.kicked.customClient = Deze server ondersteunt geen aangepaste spellen . Download de officiele versie. server.kicked.gameover = Spel afgelopen +server.kicked.serverRestarting = De server is aan het herstarten. server.versions = Jouw versie:[accent] {0}[]\nServer versie:[accent] {1}[] host.info = De [accent]host[] knop hosts `een server op port [scarlet]6567[]. \nIedereen op hetzelfde [LIGHT_GRAY]wifi or locaal netwerk[] zou jouw server in hun serverlijst moeten zien.\n\nAls je wilt dan vrienden vanaf overal kunnen meedoen via IP, [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Note: IAls iemand moeilijkheden heeft met het meedoen aan jouw spel, kijk of je Mindustry in je firewall instellingen toegang hebt gegeven to jouw locaal netwerk. join.info = Hier kan je een [accent]server IP[] invoeren om te verbinden, of om[accent]locale netwerken[] te vinden.\nBeide LAN en WAN multiplayer is ondersteund.\n\n[LIGHT_GRAY]Note: Er is geen automatische globale serverlijst; Als je met iemands IP wil verbinden, Zou je moeten vragen om hun IP. hostserver = Host Game -invitefriends = Invite Friends +invitefriends = Nodig vrienden uit hostserver.mobile = Host\nGame host = Host -hosting = [accent]Opening server... -hosts.refresh = Refresh -hosts.discovering = Discovering LAN games -hosts.discovering.any = Discovering games -server.refreshing = Refreshing server -hosts.none = [lightgray]No local games found! -host.invalid = [scarlet]Can't connect to host. -trace = Trace Player -trace.playername = Player name: [accent]{0} +hosting = [accent]Server openen... +hosts.refresh = Herlaad +hosts.discovering = LAN games aan het zoeken +hosts.discovering.any = games aan het zoeken +server.refreshing = Herlaad server +hosts.none = [lightgray]Geen lokale games gevonden! +host.invalid = [scarlet]Kan niet verbinden met server. +trace = Traceer Speler +trace.playername = Speler naam: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = Unique ID: [accent]{0} -trace.mobile = Mobile Client: [accent]{0} -trace.modclient = Custom Client: [accent]{0} -invalidid = Invalid client ID! Submit a bug report. +trace.id = Unieke ID: [accent]{0} +trace.mobile = Mobiel apparaat: [accent]{0} +trace.modclient = Unofficieël: [accent]{0} +invalidid = Ongeldige speler ID! Raporteer deze bug. server.bans = Bans -server.bans.none = No banned players found! +server.bans.none = Geen verbannen spelers gevonden! server.admins = Admins -server.admins.none = No admins found! -server.add = Add Server -server.delete = Are you sure you want to delete this server? -server.edit = Edit Server -server.outdated = [crimson]Outdated Server![] -server.outdated.client = [crimson]Outdated Client![] -server.version = [lightgray]Version: {0} {1} +server.admins.none = Geen admins gevonden! +server.add = Voeg server to +server.delete = Weet je zeker dat je deze server wilt deleten? +server.edit = Bewerk server +server.outdated = [crimson]Server draait op een oudere versie![] +server.outdated.client = [crimson]Server draait en nieuwere versie![] +server.version = [lightgray]Versie: {0} {1} server.custombuild = [yellow]Custom Build -confirmban = Are you sure you want to ban this player? -confirmkick = Are you sure you want to kick this player? -confirmvotekick = Are you sure you want to vote-kick this player? -confirmunban = Are you sure you want to unban this player? -confirmadmin = Are you sure you want to make this player an admin? -confirmunadmin = Are you sure you want to remove admin status from this player? -joingame.title = Join Game -joingame.ip = Address: -disconnect = Disconnected. -disconnect.error = Connection error. -disconnect.closed = Connection closed. -disconnect.timeout = Timed out. -disconnect.data = Failed to load world data! -cantconnect = Unable to join game ([accent]{0}[]). -connecting = [accent]Connecting... -connecting.data = [accent]Loading world data... -server.port = Port: -server.addressinuse = Address already in use! -server.invalidport = Invalid port number! -server.error = [crimson]Error hosting server: [accent]{0} -save.new = New Save -save.overwrite = Are you sure you want to overwrite\nthis save slot? -overwrite = Overwrite -save.none = No saves found! -saveload = [accent]Saving... -savefail = Failed to save game! -save.delete.confirm = Are you sure you want to delete this save? -save.delete = Delete -save.export = Export Save -save.import.invalid = [accent]This save is invalid! -save.import.fail = [crimson]Failed to import save: [accent]{0} -save.export.fail = [crimson]Failed to export save: [accent]{0} -save.import = Import Save -save.newslot = Save name: -save.rename = Rename -save.rename.text = New name: -selectslot = Select a save. -slot = [accent]Slot {0} -editmessage = Edit Message -save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug. -empty = -on = On -off = Off +confirmban = Weet je zeker dat je deze speler wilt verbannen? +confirmkick = Weet je zeker dat je deze speler wilt verwijderen? +confirmvotekick = Weet je zeker dat je deze speler weg wilt stemmen? +confirmunban = Weet je zeker dat je deze speler weer wil toelaten? +confirmadmin = Weet je zeker dat je deze speler admin wil geven? +confirmunadmin = Weet je zeker dat je de admin status van deze speler wilt intrekken? +joingame.title = Treed toe +joingame.ip = Adres: +disconnect = Gesloten. +disconnect.error = Verbindingsfout. +disconnect.closed = Verbinding gestopt. +disconnect.timeout = Verbinding afgekapt. +disconnect.data = Kon de wereld niet laden! +cantconnect = Geen verbinding mogelijk ([accent]{0}[]). +connecting = [accent]Aan het verbinden... +connecting.data = [accent]Wereld aan het laden... +server.port = Poort: +server.addressinuse = Adres is al in gebruik! +server.invalidport = Poort is geen geldig getal! +server.error = [crimson]Fout met hosten: [accent]{0} +save.new = Nieuwe Save +save.overwrite = Weet je zeker dat je deze\nsave wilt overschrijven? +overwrite = Overschrijf +save.none = Geen saves gevonden! +saveload = [accent]Bewaren... +savefail = Bewaren is mislukt! +save.delete.confirm = Weet je zeker dat je deze save wilt verwijderen? +save.delete = Verwijder +save.export = Exporteer Save +save.import.invalid = [accent]Deze save is ongeldig! +save.import.fail = [crimson]Importeren van save mislukt: [accent]{0} +save.export.fail = [crimson]Exporteren van save mislukt: [accent]{0} +save.import = Importeer Save +save.newslot = Save naam: +save.rename = Hernoem +save.rename.text = Nieuwe naam: +selectslot = Selecteer een save. +slot = [accent]Gleuf {0} +editmessage = Bewerk bericht +save.corrupted = [accent]Save bestand misvormd of ongeldig!\nAls je net je game hebt geupdatet, is dit waarschijnlijk een verandering in hoe saves werken, dit is[scarlet]geen[] bug. +empty = +on = Aan +off = Uit save.autosave = Autosave: {0} save.map = Map: {0} -save.wave = Wave {0} -save.mode = Gamemode: {0} -save.date = Last Saved: {0} -save.playtime = Playtime: {0} -warning = Warning. -confirm = Confirm -delete = Delete -view.workshop = View In Workshop -workshop.listing = Edit Workshop Listing -ok = OK +save.wave = Ronde {0} +save.mode = Spelmodus: {0} +save.date = Laatst bewaard: {0} +save.playtime = Speeltijd: {0} +warning = Waarschuwing. +confirm = Bevestig +delete = Verwijder +view.workshop = Bekijk in Werkplaats +workshop.listing = Bewerk Workshop vermelding +ok = Oke open = Open -customize = Customize -cancel = Cancel +customize = Aanpassen +cancel = Anuleer openlink = Open Link -copylink = Copy Link -back = Back -data.export = Export Data -data.import = Import Data -data.exported = Data exported. -data.invalid = This isn't valid game data. -data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. -classic.export = Export Classic Data -classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? -quit.confirm = Are you sure you want to quit? -quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] -loading = [accent]Loading... -reloading = [accent]Reloading Mods... -saving = [accent]Saving... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building -wave = [accent]Wave {0} -wave.waiting = [LIGHT_GRAY]Wave in {0} -wave.waveInProgress = [LIGHT_GRAY]Wave in progress -waiting = [LIGHT_GRAY]Waiting... -waiting.players = Waiting for players... -wave.enemies = [LIGHT_GRAY]{0} Enemies Remaining -wave.enemy = [LIGHT_GRAY]{0} Enemy Remaining -loadimage = Load Image -saveimage = Save Image -unknown = Unknown -custom = Custom -builtin = Built-In -map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! -map.random = [accent]Random Map -map.nospawn = This map does not have any cores for the player to spawn in! Add a[ROYAL] blue[] core to this map in the editor. -map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! 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. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {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! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): +copylink = Customize Link +back = Teru +data.export = Exporteer Data +data.import = Importeer Data +data.exported = Data Geexporteerd. +data.invalid = Dit is geen geldige game data. +data.import.confirm = Importeren van data verwijderd[scarlet] alle[] huidige data.\n[accent]Dit kan niet ongedaan worden gemaakt![]\n\nWanneer de data is geimport herstart deze game automatisch. +classic.export = Exporteer klassieke data +classic.export.text = [accent]Mindustry[] Heeft een grote update gehad.\nKlassieke (v3.5 build 40) saves en/of mappen zijn gedetecteerd. Wil je deze exporteren naar de thuismap van je telefoon om te gebruiken in de klassieke Mindustry app? +quit.confirm = Weet je zeker dat je wilt stoppen? +quit.confirm.tutorial = Weet je zeker dat je weet wat je doet?\nJe kan de tutorial opnieuw beginnen via[accent] Instellingen->Game->Herneem Tutorial.[] +loading = [accent]Laden... +reloading = [accent]Mods herladen... +saving = [accent]Opslaan... +cancelbuilding = [accent][[{0}][] om blauwdruk te verwijderen +selectschematic = [accent][[{0}][] om te selecteren + kopiëren +pausebuilding = [accent][[{0}][] om bouwen te pauzeren +resumebuilding = [scarlet][[{0}][] om bouwen te hervatten +wave = [accent]Ronde {0} +wave.waiting = [LIGHT_GRAY]Volgende ronde over {0} +wave.waveInProgress = [LIGHT_GRAY]Ronde bezig +waiting = [LIGHT_GRAY]Wachten... +waiting.players = Wachten op spelers... +wave.enemies = [LIGHT_GRAY]{0} Vijanden resterend +wave.enemy = [LIGHT_GRAY]{0} Vijand resterend +loadimage = Laad afbeelding +saveimage = Bewaar afbeelding +unknown = Onbekend +custom = Op maat +builtin = Ingebouwd +map.delete.confirm = Weet je zeker dat je deze map wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt! +map.random = [accent]Willekeurige map +map.nospawn = Deze map heeft geen cores voor de spelers om in te spawnen! Voeg een[ROYAL] blauwe[] core toe aan de map via de editor. +map.nospawn.pvp = Deze map heeft geen cores voor je vijanden om in te spawnen! Voeg een[SCARLET] rode[] core to aan de map via de editor. +map.nospawn.attack = Deze map bevat geen vijandige cores om aan te vallen! Voeg een[SCARLET] rode[] core toe aan de map via de editor. +map.invalid = Error tijdens laden van map: Ongeldig map bestand. +workshop.update = Bijwerken +workshop.error = Fout bij laden workshop info: {0} +map.publish.confirm = Weet je zeker dat je deze map wilt publiceren?\n\n[lightgray]Zorg ervoor dat je de EULA van de workshop leest, anders zal je map niet zichtbaar zijn! +workshop.menu = Selecteer wat je hiermee wilt doen. +workshop.info = Informatie +changelog = Update logboek (optioneel): eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} -editor.brush = Brush -editor.openin = Open In Editor -editor.oregen = Ore Generation -editor.oregen.info = Ore Generation: -editor.mapinfo = Map Info -editor.author = Author: -editor.description = Description: -editor.nodescription = A map must have a description of at least 4 characters before being published. -editor.waves = Waves: -editor.rules = Rules: -editor.generation = Generation: -editor.ingame = Edit In-Game -editor.publish.workshop = Publish On Workshop -editor.newmap = New Map -workshop = Workshop -waves.title = Waves -waves.remove = Remove -waves.never = -waves.every = every -waves.waves = wave(s) -waves.perspawn = per spawn -waves.to = to +missing = Dit object is verwijderd of verplaatst.\n[lightgray]De workshop vermelding is nu niet meer gelinkt. +publishing = [accent]Publiceren... +publish.confirm = Weet je zeker dat je dit wilt publiceren?\n\n[lightgray]Zorg ervoor dat je de EULA van de workshopt leest, anders zal je map niet zichtbaar zijn! +publish.error = Fout met het publiceren: {0} +steam.error = Fout met het opstarten van steam diensten.\nError: {0} + +editor.brush = Kwast +editor.openin = Bewerk in editor +editor.oregen = Ertsgeneratie +editor.oregen.info = Ertsgeneratie: +editor.mapinfo = Map Informatie +editor.author = Auteur: +editor.description = Beschrijving: +editor.nodescription = De map moet een beschrijving van minimaal 4 tekens hebben voordat je deze kan publiceren. +editor.waves = Rondes: +editor.rules = Regens: +editor.generation = Generatie: +editor.ingame = Bewerk In-Game +editor.publish.workshop = Publiceer in Werkplaats +editor.newmap = Nieuwe Map +workshop = Werkplaats +waves.title = Rondes +waves.remove = Verwijder +waves.never = +waves.every = elke +waves.waves = ronde(s) +waves.perspawn = per keer +waves.to = tot waves.boss = Boss -waves.preview = Preview -waves.edit = Edit... -waves.copy = Copy to Clipboard -waves.load = Load from Clipboard -waves.invalid = Invalid waves in clipboard. -waves.copied = Waves copied. -waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. -editor.default = [LIGHT_GRAY] +waves.preview = Voorvertoning +waves.edit = Bewerk... +waves.copy = Kopiër naar klembord +waves.load = Laad van klembord +waves.invalid = Ongeldige rondes in klenbord. +waves.copied = Rondes Gekopiëerd. +waves.none = Geen vijanden ingesteld.\nLege rondes worden automatisch gevuld met de standaard waardes. +editor.default = [LIGHT_GRAY] details = Details... -edit = Edit... -editor.name = Name: -editor.spawn = Spawn Unit -editor.removeunit = Remove Unit +edit = Bewerk... +editor.name = Naam: +editor.spawn = Voeg Unit toe +editor.removeunit = Verwijder Unit editor.teams = Teams -editor.errorload = Error loading file:\n[accent]{0} -editor.errorsave = Error saving file:\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.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.errorname = Map has no name defined. -editor.update = Update -editor.randomize = Randomize -editor.apply = Apply -editor.generate = Generate -editor.resize = Resize -editor.loadmap = Load Map -editor.savemap = Save Map -editor.saved = Saved! -editor.save.noname = Your map does not have a name! Set one in the 'map info' menu. -editor.save.overwrite = Your map overwrites a built-in map! Pick a different name in the 'map info' menu. -editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! -editor.import = Import... -editor.importmap = Import Map -editor.importmap.description = Import an already existing map -editor.importfile = Import File -editor.importfile.description = Import an external map file -editor.importimage = Import Legacy Image -editor.importimage.description = Import an external map image file -editor.export = Export... -editor.exportfile = Export File -editor.exportfile.description = Export a map file -editor.exportimage = Export Terrain Image -editor.exportimage.description = Export a map image file -editor.loadimage = Import Terrain -editor.saveimage = Export Terrain -editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? -editor.resizemap = Resize Map -editor.mapname = Map Name: -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.exists = A map with this name already exists. -editor.selectmap = Select a map to load: -toolmode.replace = Replace -toolmode.replace.description = Draws only on solid blocks. -toolmode.replaceall = Replace All -toolmode.replaceall.description = Replace all blocks in map. -toolmode.orthogonal = Orthogonal -toolmode.orthogonal.description = Draws only orthogonal lines. -toolmode.square = Square -toolmode.square.description = Square brush. -toolmode.eraseores = Erase Ores -toolmode.eraseores.description = Erase only ores. -toolmode.fillteams = Fill Teams -toolmode.fillteams.description = Fill teams instead of blocks. -toolmode.drawteams = Draw Teams -toolmode.drawteams.description = Draw teams instead of blocks. -filters.empty = [LIGHT_GRAY]No filters! Add one with the button below. -filter.distort = Distort -filter.noise = Noise -filter.median = Median -filter.oremedian = Ore Median -filter.blend = Blend -filter.defaultores = Default Ores -filter.ore = Ore -filter.rivernoise = River Noise -filter.mirror = Mirror -filter.clear = Clear -filter.option.ignore = Ignore -filter.scatter = Scatter -filter.terrain = Terrain -filter.option.scale = Scale -filter.option.chance = Chance -filter.option.mag = Magnitude -filter.option.threshold = Threshold -filter.option.circle-scale = Circle Scale -filter.option.octaves = Octaves -filter.option.falloff = Falloff -filter.option.angle = Angle -filter.option.block = Block -filter.option.floor = Floor -filter.option.flooronto = Target Floor -filter.option.wall = Wall -filter.option.ore = Ore -filter.option.floor2 = Secondary Floor -filter.option.threshold2 = Secondary Threshold -filter.option.radius = Radius -filter.option.percentile = Percentile -width = Width: -height = Height: +editor.errorload = Fout bij laden van bestand:\n[accent]{0} +editor.errorsave = Fout van bewaren van bestand:\n[accent]{0} +editor.errorimage = Dat is een afbeelding, geen map. Laat de extenties met rust.\n\nAls je een oude map wilt importeren gebruik je de knop die hiervoor bedoeld is in de editor. +editor.errorlegacy = Deze map is te oud, bestandsformaat word niet meer ondersteund. +editor.errornot = Dat is geen map bestand. +editor.errorheader = Dit map bestand is niet geldig of foutief. +editor.errorname = Map heeft geen naam. +editor.update = Bijwerken +editor.randomize = Willekeurig +editor.apply = Gebruiken +editor.generate = Genereer +editor.resize = Verander formaat +editor.loadmap = Laad Map +editor.savemap = Bewaar Map +editor.saved = Bewaard! +editor.save.noname = je map heeft geen naam! Stel er een in via de map instellingen. +editor.save.overwrite = De naam van deze map is al in gebruik door een van het spel zelf, kies een andere. +editor.import.exists = [scarlet]Importeren mislukt:[] een ingebouwde map met de naam '{0}' bestaat al! +editor.import = Importeer... +editor.importmap = Importeer Map +editor.importmap.description = Importeer een al bestande map +editor.importfile = Importeer Bestand +editor.importfile.description = Importer een extern map bestand +editor.importimage = Importeer Klassieke Afbeelding +editor.importimage.description = Importeer een oude afbeelding map +editor.export = Exporteer... +editor.exportfile = Exporteer Bestand +editor.exportfile.description = Exporteer een map bestand +editor.exportimage = Exporteer Thumbnail +editor.exportimage.description = Exporteer map thumbnail +editor.loadimage = Importeer Terein +editor.saveimage = Exporteer Terein +editor.unsaved = [scarlet]Je hebt onopgeslagen wijzigingen![]\nWeet je zeker dat je eruit wilt? +editor.resizemap = Verander Map Formaat +editor.mapname = Map Naam: +editor.overwrite = [accent]Waarschuwing!\nDit overschrijft een bestaande map. +editor.overwrite.confirm = [scarlet]Waarschuwing![] Een map met deze naam bestaat al. Weet je zeker dat je deze wilt overschrijven? +editor.exists = Een map met deze naam bestaat al. +editor.selectmap = Selecteer een map om te laden: + +toolmode.replace = Vervang +toolmode.replace.description = Werkt enkel op vaste blokken. +toolmode.replaceall = Vervang alles +toolmode.replaceall.description = Vervangt alle blokken in de map. +toolmode.orthogonal = Orthogonaal +toolmode.orthogonal.description = Teken enkel orthogonale lijnen. +toolmode.square = Vierkant +toolmode.square.description = Vierkante kwast. +toolmode.eraseores = Verwijder grondstoffen +toolmode.eraseores.description = Verwijderd enkel grondstoffen. +toolmode.fillteams = Vervang Teams +toolmode.fillteams.description = Vervangt teams in plaats van blokken. +toolmode.drawteams = Teken Teams +toolmode.drawteams.description = Tekent teams in plaats van blokken. + +filters.empty = [LIGHT_GRAY]Geen filters! Voeg een toe met onderstaande knop. +filter.distort = Verdraai +filter.noise = Geluid +filter.median = Mediaan +filter.oremedian = Ertsmediaan +filter.blend = Meng +filter.defaultores = Standaard Grondstoffen +filter.ore = Grondstof +filter.rivernoise = Rivier Geluid +filter.mirror = Spiegel +filter.clear = Verwijder +filter.option.ignore = Negeer +filter.scatter = Verstrooi +filter.terrain = Terein +filter.option.scale = Schaal +filter.option.chance = Verander +filter.option.mag = Omvang +filter.option.threshold = Drempel +filter.option.circle-scale = Formaat Rondje +filter.option.octaves = Octaven +filter.option.falloff = Afval +filter.option.angle = Hoek +filter.option.block = Blok +filter.option.floor = Vloer +filter.option.flooronto = Doel Vloer +filter.option.wall = Muur +filter.option.ore = Grondstof +filter.option.floor2 = Secundaire vloer +filter.option.threshold2 = Secundaire Drempel +filter.option.radius = Straal +filter.option.percentile = Percentage + +width = Breedte: +height = Hoogte: menu = Menu -play = Play -campaign = Campaign -load = Load -save = Save +play = Speel +campaign = Veldtocht +load = Laad +save = Bewaar fps = FPS: {0} ping = Ping: {0}ms -language.restart = Please restart your game for the language settings to take effect. -settings = Settings +language.restart = Herstart het spel om de gewijzigde taal te laden. +settings = Instellingen tutorial = Tutorial -tutorial.retake = Re-Take Tutorial +tutorial.retake = Herneem Tutorial editor = Editor mapeditor = Map Editor -abandon = Abandon -abandon.text = This zone and all its resources will be lost to the enemy. -locked = Locked -complete = [LIGHT_GRAY]Complete: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} -resume = Resume Zone:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Best Wave: {0} -launch = < LAUNCH > -launch.title = Launch Successful -launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. -uncover = Uncover -configure = Configure Loadout -bannedblocks = Banned Blocks -addall = Add All -configure.locked = [LIGHT_GRAY]Unlock configuring loadout:\nWave {0}. -configure.invalid = Amount must be a number between 0 and {0}. -zone.unlocked = [LIGHT_GRAY]{0} unlocked. -zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} -zone.resources = Resources Detected: -zone.objective = [lightgray]Objective: [accent]{0} -zone.objective.survival = Survive -zone.objective.attack = Destroy Enemy Core -add = Add... -boss.health = Boss Health -connectfail = [crimson]Failed to connect to server:\n\n[accent]{0} -error.unreachable = Server unreachable.\nIs the address spelled correctly? -error.invalidaddress = Invalid address. -error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! -error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -error.alreadyconnected = Already connected. -error.mapnotfound = Map file not found! -error.io = Network I/O error. -error.any = Unknown network error. -error.bloom = Failed to initialize bloom.\nYour device may not support it. -zone.groundZero.name = Ground Zero -zone.desertWastes.name = Desert Wastes -zone.craters.name = The Craters -zone.frozenForest.name = Frozen Forest -zone.ruinousShores.name = Ruinous Shores -zone.stainedMountains.name = Stained Mountains -zone.desolateRift.name = Desolate Rift -zone.nuclearComplex.name = Nuclear Production Complex -zone.overgrowth.name = Overgrowth -zone.tarFields.name = Tar Fields -zone.saltFlats.name = Salt Flats + +abandon = Verlaat +abandon.text = Je verliest deze map met alles erop en eraan aan de vijand. +locked = Op slot +complete = [LIGHT_GRAY]Voltooid: +requirement.wave = Berijk ronde {0} in {1} +requirement.core = Vernietig vijandige core in {0} +requirement.unlock = Ontgrendel: {0} +resume = Hervat zone:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Beste ronde: {0} +launch = < LANCEER > +launch.title = Lancering Sucessvol +launch.next = [LIGHT_GRAY]volgende lanceerkans in ronde {0} +launch.unable2 = [scarlet]Lanceren niet mogelijk.[] +launch.confirm = Dit lanceert alle items in je core.\nJe zal niet meer terug kunnen keren naar deze basis. +launch.skip.confirm = Als je nu niet lanceert, zul je moeten wachten tot het wel weer kan. +uncover = Ontdek +configure = Configureer startinventaris +bannedblocks = Verboden Blokken +addall = Voeg Alles Toe +configure.locked = [LIGHT_GRAY]Speel startinventaris configuratie vrij:\nronde{0}. +configure.invalid = Hoeveelheid moet een getal zijn tussen 0 en {0}. +zone.unlocked = [LIGHT_GRAY]{0} vrijgespeeld. +zone.requirement.complete = Ronde {0} berijkt:\n{1} zone vrijgespeeld. +zone.config.unlocked = Startinventaris vrijgespeeld:[lightgray]\n{0} +zone.resources = Vindbare grondstoffen: +zone.objective = [lightgray]Doel: [accent]{0} +zone.objective.survival = Overleef +zone.objective.attack = Vernietig vijandige core +add = Voeg toe... +boss.health = Levens Boss + +connectfail = [crimson]Kon niet verbinden met server:\n\n[accent]{0} +error.unreachable = Server onbereikbaar.\nHeb je het adres goed gespeld? +error.invalidaddress = Ongeldig adres. +error.timedout = Verbindingspoging duurde te lang!\nDubbelcheck dat je host is geportforward, en dat je het ip wel goed hebt ingetikt! +error.mismatch = Pakket fout:\nmogelijk is er een versie verschil tussen jou en de server.\nZorg ervoor dat beiden op de meest recente versie van Mindustry zitten! +error.alreadyconnected = Al verbonden. +error.mapnotfound = Map bestand niet gevonden! +error.io = Netwerk I/O fout. +error.any = Onbekende netwerk fout. +error.bloom = Bloom aanzetten mislukt.\nJe apparaat ondersteunt het waarschijnlijk niet. + +zone.groundZero.name = Grond Nul +zone.desertWastes.name = Woestijnpuin +zone.craters.name = De kraters +zone.frozenForest.name = Bevroren Bos +zone.ruinousShores.name = Vervallen Kust +zone.stainedMountains.name = Bekladde Berg +zone.desolateRift.name = Verlaten Kloof +zone.nuclearComplex.name = Vervallen Kernreactor +zone.overgrowth.name = Overgroeid +zone.tarFields.name = Teervelden +zone.saltFlats.name = Zoutvlaktes zone.impact0078.name = Impact 0078 zone.crags.name = Crags -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.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.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. -zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -zone.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.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.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.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.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.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.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.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.name = Schimmelpad + +zone.groundZero.description = De optimale plek om weer tot kracht te komen. Weinig gevaar. Weinig grondstoffen.\nDelf zoveel mogelijk lood en koper als je kan.\nVertrek. +zone.frozenForest.description = Ook hier, dicht bij de bergen, hebben de schimmels zich verspreid. De koude tempratuur houd ze niet voor eeuwig tegen.\n\nBegin de industriële revolutie. Bouw fossiele generators. Leer hoe te repareren. +zone.desertWastes.description = Deze woestijn is groot, onvoorspelbaar, en vol met oude technologie.\nSteenkool is hier te vinden. Verbrand het om stroom op te wekken, of verwerk het tot grafiet.\n\n[lightgray]Of het hier veilig is is een tweede. +zone.saltFlats.description = Aan de randen van de woestijn liggen de zoutvlaktes. Weinig grondstoffen zijn hier te vinden.\n\nDe vijand heeft hier rantsoenen opgeslagen. Vernietig hun core. Laat niks staan. +zone.craters.description = Water heeft zich hier opgehoopt, herrinering aan de vroegere oorlog. Herover dit gebied. Delf zand. Maak glas. Pomp water in je wapens en boren om ze te koelen. +zone.ruinousShores.description = Voorbij de ruines is de kust. Lang geleden werd de kust hier verdedigd maar er is weinig van terug te vinden. Enkel de meest simpele verdedigingswerken staan nog overeind, \nGa door met uitbereiden, herontdek de verloren techniek. +zone.stainedMountains.description = Verder vanaf de kust liggen de bergen, nog niet aangetast door de schimmels.\nDelf de grote hoeveelheiden titanium titanium in het gebied en leer het te gebruiken.\n\nDe vijand is krachtig hier. Geef ze geen tijd om je te overrompelen. +zone.overgrowth.description = Dit gebied is overgroeid, dichter bij de bron van de schimmels.\nDe vijand heeft hier een uitkijkpost. Bouw dolk units. Vernietig de vijand. Herneem wat ooit verloren was. +zone.tarFields.description = De randen van een olieveld, tussen de bergen en de woestijn. Een van de weinige plekken met bruikbare olie.\nOndanks dat het verboden is, zijn er wel krachtige vijanden in de buurt. Onderschat ze niet.\n\n[lightgray]Onderzoek wat je verder allemaal met olie kan doen. +zone.desolateRift.description = Een supergevaarlijk gebied. Veel grondstoffen, maar weinig ruimte. Grote kans op verwoesting. Lanceer zo snel mogelijk. Word niet overmoedig door de lange tijd tussen de rondes. +zone.nuclearComplex.description = Een voormalige installatie voor de productie en verwerking van thorium ligt er nu verlaten bij.\n[lightgray]Onderzoek thorium en de vele toepassingen ervoor.\n\nDe vijand is hier aanwezig in grote getalen, constant waakzaam voor aanvallers. +zone.fungalPass.description = Een transitiegebied tussen de hogergelegen bergen en de lagergelegen, beschimmelde gebieden. Een kleine verkenningsbasis is hier gepositioneerd.\nVernietig het.\nGebruik Dolk en Kruiper units. Maak de twee cores onbruikbaar. zone.impact0078.description = zone.crags.description = -settings.language = Language + +settings.language = Taal settings.data = Game Data -settings.reset = Reset to Defaults -settings.rebind = Rebind -settings.controls = Controls -settings.game = Game -settings.sound = Sound -settings.graphics = Graphics -settings.cleardata = Clear Game Data... -settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! -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. -paused = [accent]< Paused > -clear = Clear -banned = [scarlet]Banned -yes = Yes -no = No -info.title = Info -error.title = [crimson]An error has occured -error.crashtitle = An error has occured +settings.reset = Terug naar standaardinstellingen +settings.rebind = Verander +settings.resetKey = Reset +settings.controls = Bediening +settings.game = Spel +settings.sound = Geluid +settings.graphics = Grafisch +settings.cleardata = Wis Game Data... +settings.clear.confirm = Weet je zeker dat je deze data wilt verwijderen?\nDit is niet terug te draaien! +settings.clearall.confirm = [scarlet]WAARSCHUWING![]\nDit verwijderd alle darta, inclusief saves, mappen, technologie en bedienings-instellingen.\nAls je op doorgaat wist het spel al je data en stopt ie automatisch. +paused = [accent]< Gepauzeerd > +clear = Wis +banned = [scarlet]Verbannen +yes = Ja +no = Nee +info.title = Informatie +error.title = [crimson]Een fout heeft zich voorgedaan +error.crashtitle = Een fout heeft zich voorgedaan blocks.input = Input blocks.output = Output blocks.booster = Booster block.unknown = [LIGHT_GRAY]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot +blocks.powercapacity = Stroom Capaciteit +blocks.powershot = Stroom/Shot blocks.damage = Damage -blocks.targetsair = Targets Air -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches -blocks.shootrange = Range -blocks.size = Size -blocks.liquidcapacity = Liquid Capacity -blocks.powerrange = Power Range -blocks.powerconnections = Max Connections -blocks.poweruse = Power Use -blocks.powerdamage = Power/Damage -blocks.itemcapacity = Item Capacity -blocks.basepowergeneration = Base Power Generation -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range -blocks.drilltier = Drillables -blocks.drillspeed = Base Drill Speed +blocks.targetsair = Luchtdoelwitten +blocks.targetsground = Gronddoelwitten +blocks.itemsmoved = Beweegsnelheid +blocks.launchtime = Tijd tussen lanceringen +blocks.shootrange = Bereik +blocks.size = Formaat +blocks.liquidcapacity = Vloeistof Capaciteit +blocks.powerrange = Stroom Bereik +blocks.powerconnections = Maximale Hoeveelheid Dradem +blocks.poweruse = Stroom verbruik +blocks.powerdamage = Stroom/Damage +blocks.itemcapacity = Materiaal Capaciteit +blocks.basepowergeneration = Standaard Stroom Generatie +blocks.productiontime = Productie Tijd +blocks.repairtime = Volledige Blok Repareertijd +blocks.speedincrease = Snelheidsverhoging +blocks.range = Bereik +blocks.drilltier = Valt te delven +blocks.drillspeed = Standaard mine snelheid blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units +blocks.maxunits = Maximaal Actieve Units blocks.health = Health -blocks.buildtime = Build Time -blocks.buildcost = Build Cost -blocks.inaccuracy = Inaccuracy -blocks.shots = Shots -blocks.reload = Shots/Second -blocks.ammo = Ammo -bar.drilltierreq = Better Drill Required -bar.drillspeed = Drill Speed: {0}/s -bar.pumpspeed = Pump Speed: {0}/s -bar.efficiency = Efficiency: {0}% -bar.powerbalance = Power: {0} -bar.powerstored = Stored: {0}/{1} -bar.poweramount = Power: {0} -bar.poweroutput = Power Output: {0} +blocks.buildtime = Bouw tijd +blocks.buildcost = Bouw kosten +blocks.inaccuracy = Onnauwkeurigheid +blocks.shots = Shoten +blocks.reload = Schoten/Seconde +blocks.ammo = Ammonutie + +bar.drilltierreq = Betere miner nodig +bar.drillspeed = Mining Snelheid: {0}/s +bar.pumpspeed = Pomp Snelheid: {0}/s +bar.efficiency = Rendement: {0}% +bar.powerbalance = Stroom: {0} +bar.powerstored = Opgeslagen: {0}/{1} +bar.poweramount = Stroom: {0} +bar.poweroutput = Stroom Output: {0} bar.items = Items: {0} -bar.capacity = Capacity: {0} -bar.liquid = Liquid -bar.heat = Heat -bar.power = Power -bar.progress = Build Progress +bar.capacity = Capaciteit: {0} +bar.liquid = Vloeistof +bar.heat = Warmte +bar.power = Stroom +bar.progress = Bouw Voortgang bar.spawned = Units: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] dmg -bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles -bullet.incendiary = [stat]incendiary -bullet.homing = [stat]homing -bullet.shock = [stat]shock -bullet.frag = [stat]frag -bullet.knockback = [stat]{0}[lightgray] knockback -bullet.freezing = [stat]freezing -bullet.tarred = [stat]tarred -bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier -bullet.reload = [stat]{0}[lightgray]x reload -unit.blocks = blocks -unit.powersecond = power units/second -unit.liquidsecond = liquid units/second -unit.itemssecond = items/second -unit.liquidunits = liquid units -unit.powerunits = power units -unit.degrees = degrees -unit.seconds = seconds +bullet.splashdamage = [stat]{0}[lightgray] gebied dmg ~[stat] {1}[lightgray] tiles +bullet.incendiary = [stat]brandstichtend +bullet.homing = [stat]doelzoekend +bullet.shock = [stat]schok +bullet.frag = [stat]clusterbom +bullet.knockback = [stat]{0}[lightgray] terugslag +bullet.freezing = [stat]bevriezend +bullet.tarred = [stat]pek +bullet.multiplier = [stat]{0}[lightgray]x ammonutie verdubbelaar +bullet.reload = [stat]{0}[lightgray]x herlaad + +unit.blocks = blokken +unit.powersecond = stroom eenheid/seconde +unit.liquidsecond = vloeistof eenheid/seconde +unit.itemssecond = items/seconde +unit.liquidunits = vloeistof eenheid +unit.powerunits = stroom eenheid +unit.degrees = graden +unit.seconds = secondes unit.persecond = /sec -unit.timesspeed = x speed +unit.timesspeed = x snelheid unit.percent = % unit.items = items -category.general = General -category.power = Power -category.liquids = Liquids +unit.thousands = k +unit.millions = mil +category.general = Algemeen +category.power = Stroom +category.liquids = Vloeisof category.items = Items -category.crafting = Crafting -category.shooting = Shooting -category.optional = Optional Enhancements -setting.landscape.name = Lock Landscape -setting.shadows.name = Shadows -setting.blockreplace.name = Automatic Block Suggestions +category.crafting = Productie +category.shooting = Wapens +category.optional = Optionele Verbeteringen +setting.landscape.name = Vergrendel Landscape +setting.shadows.name = Schaduws +setting.blockreplace.name = Automatische Blok Suggesties setting.linear.name = Linear Filtering setting.hints.name = Hints -setting.animatedwater.name = Animated Water -setting.animatedshields.name = Animated Shields -setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] -setting.indicators.name = Ally Indicators +setting.buildautopause.name = Pauzeer Bouw Automatisch +setting.animatedwater.name = Animeer Water +setting.animatedshields.name = Animeer Schilden +setting.antialias.name = Antialias[LIGHT_GRAY] (herstart vereist)[] +setting.indicators.name = Toon Bondgenoten setting.autotarget.name = Auto-Target -setting.keyboard.name = Mouse+Keyboard Controls +setting.keyboard.name = Muis+Toetsenbord Controls setting.touchscreen.name = Touchscreen Controls setting.fpscap.name = Max FPS setting.fpscap.none = None setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] -setting.swapdiagonal.name = Always Diagonal Placement -setting.difficulty.training = training -setting.difficulty.easy = easy -setting.difficulty.normal = normal +setting.uiscale.name = UI Schaal[lightgray] (herstart vereist)[] +setting.swapdiagonal.name = Altijd Diagonaal Plaatsen +setting.difficulty.training = kalm +setting.difficulty.easy = makkelijk +setting.difficulty.normal = normaal setting.difficulty.hard = hard -setting.difficulty.insane = insane -setting.difficulty.name = Difficulty: -setting.screenshake.name = Screen Shake -setting.effects.name = Display Effects -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding -setting.sensitivity.name = Controller Sensitivity +setting.difficulty.insane = krankzinnig +setting.difficulty.name = Moeilijkheidsgraad: +setting.screenshake.name = Schuddend Scherm +setting.effects.name = Toon Effecten +setting.destroyedblocks.name = Toon Vernietigde Blokken +setting.conveyorpathfinding.name = Lopendeband Plaats Hulp +setting.coreselect.name = Sta cores toe in blauwdrukken +setting.sensitivity.name = Gevoeligheid Controller setting.saveinterval.name = Autosave Interval -setting.seconds = {0} Seconds -setting.fullscreen.name = Fullscreen -setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) +setting.seconds = {0} Seconden +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} millisecondes +setting.fullscreen.name = Volledig scherm +setting.borderlesswindow.name = Borderless Venster[LIGHT_GRAY] (wellicht herstart vereist) setting.fps.name = Show FPS +setting.blockselectkeys.name = Toon Blok Selectie Toetscombinaties setting.vsync.name = VSync -setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) -setting.minimap.name = Show Minimap -setting.position.name = Show Player Position -setting.musicvol.name = Music Volume -setting.ambientvol.name = Ambient Volume -setting.mutemusic.name = Mute Music +setting.pixelate.name = Pixelate [LIGHT_GRAY](mogelijk verminderde performance) +setting.minimap.name = Toon Minimap +setting.position.name = Toon Speler Posities +setting.musicvol.name = Muziek Volume +setting.ambientvol.name = Achtergronds Volume +setting.mutemusic.name = Demp Muziek setting.sfxvol.name = SFX Volume -setting.mutesound.name = Mute Sound -setting.crashreport.name = Send Anonymous Crash Reports -setting.savecreate.name = Auto-Create Saves -setting.publichost.name = Public Game Visibility -setting.chatopacity.name = Chat Opacity -setting.lasersopacity.name = Power Laser Opacity -setting.playerchat.name = Display In-Game Chat -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. -uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... -uiscale.cancel = Cancel & Exit +setting.mutesound.name = Demp Geluid +setting.crashreport.name = Stuur Anonieme Crashmeldingen +setting.savecreate.name = Bewaar Saves Automatisch +setting.publichost.name = Publieke Server Zichtbaarheid +setting.chatopacity.name = Chat Transparantie +setting.lasersopacity.name = Stroom Draad Transparantie +setting.playerchat.name = Toon chat +public.confirm = Wil je je game publiek maken?\n[accent]Iedereen kan dan je games joinen.\n[lightgray]Dit kan je later veranderen in Instellingen->Spel->Publieke Server Zichtbaarheid. +public.beta = Onthoud dat beta versies van het spel niet publiek kunnen lobbyen. +uiscale.reset = UI formaat is geweizigd.\nKlik op "OK" om het te bevestigen.\n[scarlet]Anders word het in[accent] {0}[] ongedaan gemaakt... +uiscale.cancel = Anuleer & Exit setting.bloom.name = Bloom -keybind.title = Rebind Keys -keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. -category.general.name = General -category.view.name = View +keybind.title = Verander Keys +keybinds.mobile = [scarlet]De meeste keybinds werken niet voor mobiel. Enkel standaard bewegingen zijn gesupport. +category.general.name = Algemeen +category.view.name = Toon category.multiplayer.name = Multiplayer -command.attack = Attack -command.rally = Rally -command.retreat = Retreat -keybind.clear_building.name = Clear Building -keybind.press = Press a key... -keybind.press.axis = Press an axis or key... -keybind.screenshot.name = Map Screenshot -keybind.move_x.name = Move x -keybind.move_y.name = Move y -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y -keybind.fullscreen.name = Toggle Fullscreen -keybind.select.name = Select/Shoot -keybind.diagonal_placement.name = Diagonal Placement -keybind.pick.name = Pick Block -keybind.break_block.name = Break Block -keybind.deselect.name = Deselect -keybind.shoot.name = Shoot +command.attack = Val aan +command.rally = Groepeer +command.retreat = Terugtrekken +placement.blockselectkeys = \n[lightgray]Toets: [{0}, +keybind.clear_building.name = Stop met bouwen +keybind.press = Druk op een toets... +keybind.press.axis = Druk of swipe een toets... +keybind.screenshot.name = Map Schermfbeelding +keybind.toggle_power_lines.name = Wel/Geen Stroom Draden +keybind.move_x.name = Beweeg x +keybind.move_y.name = Beweeg y +keybind.mouse_move.name = Volg Muis +keybind.dash.name = Vlieg +keybind.schematic_select.name = Selecteer gebied +keybind.schematic_menu.name = Blauwdruk Menu +keybind.schematic_flip_x.name = Spiegel Blauwdruk X +keybind.schematic_flip_y.name = Spiegel Blauwdruk Y +keybind.category_prev.name = Vorige Categorie +keybind.category_next.name = Volgende Categorie +keybind.block_select_left.name = Selecteer Blok Links +keybind.block_select_right.name = Selecteer Blok Rechts +keybind.block_select_up.name = Selecteer Blok Omhoog +keybind.block_select_down.name = Selecteer Blok Omlaag +keybind.block_select_01.name = Selecteer Categorie/Blok 1 +keybind.block_select_02.name = Selecteer Categorie/Blok 2 +keybind.block_select_03.name = Selecteer Categorie/Blok 3 +keybind.block_select_04.name = Selecteer Categorie/Blok 4 +keybind.block_select_05.name = Selecteer Categorie/Blok 5 +keybind.block_select_06.name = Selecteer Categorie/Blok 6 +keybind.block_select_07.name = Selecteer Categorie/Blok 7 +keybind.block_select_08.name = Selecteer Categorie/Blok 8 +keybind.block_select_09.name = Selecteer Categorie/Blok 9 +keybind.block_select_10.name = Selecteer Categorie/Blok 10 +keybind.fullscreen.name = Schakel Fullscreen +keybind.select.name = Selecteer/Schiet +keybind.diagonal_placement.name = Plaats Diagonaal +keybind.pick.name = Kies Blok +keybind.break_block.name = Breek Blok +keybind.deselect.name = Deselecteer +keybind.shoot.name = Shiet keybind.zoom.name = Zoom keybind.menu.name = Menu -keybind.pause.name = Pause -keybind.pause_building.name = Pause/Resume Building +keybind.pause.name = Pauze +keybind.pause_building.name = Pauzeer/Hervat Bouwen keybind.minimap.name = Minimap -keybind.dash.name = Dash keybind.chat.name = Chat -keybind.player_list.name = Player list +keybind.player_list.name = Speler list keybind.console.name = Console -keybind.rotate.name = Rotate -keybind.rotateplaced.name = Rotate Existing (Hold) -keybind.toggle_menus.name = Toggle menus -keybind.chat_history_prev.name = Chat history prev -keybind.chat_history_next.name = Chat history next +keybind.rotate.name = Roteer +keybind.rotateplaced.name = Roteer bestaand (Houd vast) +keybind.toggle_menus.name = Schakel menus +keybind.chat_history_prev.name = Chat geschiedenis ouder +keybind.chat_history_next.name = Chat geschiedenis nieuwer keybind.chat_scroll.name = Chat scroll keybind.drop_unit.name = Drop Unit keybind.zoom_minimap.name = Zoom minimap -mode.help.title = Description of modes -mode.survival.name = Survival -mode.survival.description = The normal mode. Limited resources and automatic incoming waves. -mode.sandbox.name = Sandbox -mode.sandbox.description = Infinite resources and no timer for waves. +mode.help.title = Beschrijving van modes +mode.survival.name = Overleving +mode.survival.description = De normale mode. Standaard grondstoffen en rondes met vijanden. +mode.sandbox.name = Zandbak +mode.sandbox.description = Oneindige resources en geen automatische vijandelijke rondes. mode.editor.name = Editor mode.pvp.name = PvP -mode.pvp.description = Fight against other players locally. -mode.attack.name = Attack -mode.attack.description = No waves, with the goal to destroy the enemy base. -mode.custom = Custom Rules -rules.infiniteresources = Infinite Resources -rules.wavetimer = Wave Timer -rules.waves = Waves -rules.attack = Attack Mode -rules.enemyCheat = Infinite AI Resources +mode.pvp.description = Vecht tegen andere spelers. +mode.attack.name = Aanvallen +mode.attack.description = Geen rondes, maar met als doel de vijandlijke core(s) te vernietigen. +mode.custom = Aangepaste regels + +rules.infiniteresources = Oneindige Resources +rules.reactorexplosions = Ontploffende Reactors +rules.wavetimer = Ronde timer +rules.waves = Rondes +rules.attack = Aanval modus +rules.enemyCheat = Oneindige AI grondstoffen rules.unitdrops = Unit Drops -rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier -rules.unithealthmultiplier = Unit Health Multiplier -rules.playerhealthmultiplier = Player Health Multiplier -rules.playerdamagemultiplier = Player Damage Multiplier -rules.unitdamagemultiplier = Unit Damage Multiplier -rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles) -rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec) -rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec) -rules.buildcostmultiplier = Build Cost Multiplier -rules.buildspeedmultiplier = Build Speed Multiplier -rules.waitForWaveToEnd = Waves wait for enemies -rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles) -rules.respawns = Max respawns per wave -rules.limitedRespawns = Limit Respawns -rules.title.waves = Waves -rules.title.respawns = Respawns -rules.title.resourcesbuilding = Resources & Building -rules.title.player = Players -rules.title.enemy = Enemies +rules.unitbuildspeedmultiplier = Unit Spawn Snelheid Vermenigvulder +rules.unithealthmultiplier = Unit Health Vermenigvulder +rules.blockhealthmultiplier = Blok Health Vermenigvulder +rules.playerhealthmultiplier = Speler Health Vermenigvulder +rules.playerdamagemultiplier = Speler Damage Vermenigvulder +rules.unitdamagemultiplier = Unit Damage Vermenigvulder +rules.enemycorebuildradius = Niet-Bouw Bereik Vijandelijke Cores:[LIGHT_GRAY] (tegels) +rules.respawntime = Herspawn Tijd:[LIGHT_GRAY] (sec) +rules.wavespacing = Tijd Tussen Rondes:[LIGHT_GRAY] (sec) +rules.buildcostmultiplier = Bouw kosten Vermenigvulder +rules.buildspeedmultiplier = Bouw snelheid Vermenigvulder +rules.waitForWaveToEnd = Rondes wachten tot alles is verslagen +rules.dropzoneradius = Vijandelijke Spawn Diameter:[LIGHT_GRAY] (tegels) +rules.respawns = Maximale Levens Per Ronde +rules.limitedRespawns = Maximale Levens +rules.title.waves = Rondes +rules.title.respawns = Respawn +rules.title.resourcesbuilding = Grondstoffen & Bouwen +rules.title.player = Spelers +rules.title.enemy = Tegenstanders rules.title.unit = Units +rules.title.experimental = Experimenteel +rules.lighting = Belichting +rules.ambientlight = Mist + content.item.name = Items -content.liquid.name = Liquids +content.liquid.name = Vloeisof content.unit.name = Units -content.block.name = Blocks -content.mech.name = Mechs -item.copper.name = Copper -item.lead.name = Lead -item.coal.name = Coal -item.graphite.name = Graphite +content.block.name = Blokken +content.mech.name = Behuizing +item.copper.name = Coper +item.lead.name = Lood +item.coal.name = Steenkool +item.graphite.name = Grafiet item.titanium.name = Titanium item.thorium.name = Thorium -item.silicon.name = Silicon +item.silicon.name = Silicium item.plastanium.name = Plastanium item.phase-fabric.name = Phase Fabric item.surge-alloy.name = Surge Alloy item.spore-pod.name = Spore Pod -item.sand.name = Sand +item.sand.name = Zand item.blast-compound.name = Blast Compound item.pyratite.name = Pyratite -item.metaglass.name = Metaglass +item.metaglass.name = Glas item.scrap.name = Scrap liquid.water.name = Water liquid.slag.name = Slag -liquid.oil.name = Oil -liquid.cryofluid.name = Cryofluid +liquid.oil.name = Olie +liquid.cryofluid.name = Koelvloeistof mech.alpha-mech.name = Alpha mech.alpha-mech.weapon = Heavy Repeater mech.alpha-mech.ability = Drone Swarm @@ -752,142 +824,147 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Bomb Bay mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Flame Repeater -item.explosiveness = [LIGHT_GRAY]Explosiveness: {0}% -item.flammability = [LIGHT_GRAY]Flammability: {0}% -item.radioactivity = [LIGHT_GRAY]Radioactivity: {0}% +item.corestorable = [lightgray]Kan in de Core: {0} +item.explosiveness = [LIGHT_GRAY]Explosivieit: {0}% +item.flammability = [LIGHT_GRAY]Vlambaarheid: {0}% +item.radioactivity = [LIGHT_GRAY]Radioactiviteit: {0}% unit.health = [LIGHT_GRAY]Health: {0} -unit.speed = [LIGHT_GRAY]Speed: {0} -mech.weapon = [LIGHT_GRAY]Weapon: {0} +unit.speed = [LIGHT_GRAY]Snelheid: {0} +mech.weapon = [LIGHT_GRAY]Wapen: {0} mech.health = [LIGHT_GRAY]Health: {0} -mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0} -mech.minespeed = [LIGHT_GRAY]Mining Speed: {0} -mech.minepower = [LIGHT_GRAY]Mining Power: {0} +mech.itemcapacity = [LIGHT_GRAY]Item Capaciteit: {0} +mech.minespeed = [LIGHT_GRAY]Mining Snelheid: {0} +mech.minepower = [LIGHT_GRAY]Mining Hardheid: {0} mech.ability = [LIGHT_GRAY]Ability: {0} -mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% -liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} -liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} -liquid.temperature = [LIGHT_GRAY]Temperature: {0} -block.sand-boulder.name = Sand Boulder -block.grass.name = Grass -block.salt.name = Salt -block.saltrocks.name = Salt Rocks -block.pebbles.name = Pebbles +mech.buildspeed = [LIGHT_GRAY]Bouw Snelheid: {0}% +liquid.heatcapacity = [LIGHT_GRAY]Warmte Capaciteit: {0} +liquid.viscosity = [LIGHT_GRAY]Viscositeit: {0} +liquid.temperature = [LIGHT_GRAY]Tempratuur: {0} + +block.sand-boulder.name = Zandkei +block.grass.name = Gras +block.salt.name = Zout +block.saltrocks.name = Zoutsteen +block.pebbles.name = Steentjes block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks -block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock -block.snow-pine.name = Snow Pine +block.sandrocks.name = Zandsteen +block.spore-pine.name = Sporenden +block.sporerocks.name = Spore Steens +block.rock.name = Steen +block.snowrock.name = Sneeuwsteen +block.snow-pine.name = Sneeuwden block.shale.name = Shale block.shale-boulder.name = Shale Boulder -block.moss.name = Moss -block.shrubs.name = Shrubs +block.moss.name = Mos +block.shrubs.name = Plantje block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks -block.scrap-wall.name = Scrap Wall -block.scrap-wall-large.name = Large Scrap Wall -block.scrap-wall-huge.name = Huge Scrap Wall -block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.shalerocks.name = Shale Steens +block.scrap-wall.name = Scrap Muur +block.scrap-wall-large.name = Large Scrap Muur +block.scrap-wall-huge.name = Huge Scrap Muur +block.scrap-wall-gigantic.name = Gigantic Scrap Muur block.thruster.name = Thruster -block.kiln.name = Kiln -block.graphite-press.name = Graphite Press -block.multi-press.name = Multi-Press -block.constructing = {0} [LIGHT_GRAY](Constructing) -block.spawn.name = Enemy Spawn +block.kiln.name = Glasoven +block.graphite-press.name = Grafiet Pers +block.multi-press.name = Super-Pers +block.constructing = {0} [LIGHT_GRAY](Bouwen) +block.spawn.name = Vijandelijke Spawn block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.deepwater.name = Deep Water +block.deepwater.name = Diep Water block.water.name = Water -block.tainted-water.name = Tainted Water -block.darksand-tainted-water.name = Dark Sand Tainted Water -block.tar.name = Tar -block.stone.name = Stone -block.sand.name = Dark Sand -block.darksand.name = Dark Sand -block.ice.name = Ice -block.snow.name = Snow -block.craters.name = Craters -block.sand-water.name = Sand water -block.darksand-water.name = Dark Sand Water +block.tainted-water.name = Vervuild Water +block.darksand-tainted-water.name = Donker Zand Vervuild Water +block.tar.name = Olie +block.stone.name = Steen +block.sand.name = Donker Zand +block.darksand.name = Donker Zand +block.ice.name = Ijs +block.snow.name = Sneeuw +block.craters.name = Krarters +block.sand-water.name = Zand water +block.darksand-water.name = Donker Zand Water block.char.name = Char block.holostone.name = Holo stone block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks -block.pine.name = Pine -block.white-tree-dead.name = White Tree Dead -block.white-tree.name = White Tree +block.rocks.name = Stenen +block.icerocks.name = Ijs Stenen +block.snowrocks.name = Snow Steens +block.dunerocks.name = Dune Steens +block.pine.name = Den +block.white-tree-dead.name = Witte Boom Dood +block.white-tree.name = Witte Boom block.spore-cluster.name = Spore Cluster -block.metal-floor.name = Metal Floor -block.metal-floor-2.name = Metal Floor 2 -block.metal-floor-3.name = Metal Floor 3 -block.metal-floor-5.name = Metal Floor 5 -block.metal-floor-damaged.name = Metal Floor Damaged -block.dark-panel-1.name = Dark Panel 1 -block.dark-panel-2.name = Dark Panel 2 -block.dark-panel-3.name = Dark Panel 3 -block.dark-panel-4.name = Dark Panel 4 -block.dark-panel-5.name = Dark Panel 5 -block.dark-panel-6.name = Dark Panel 6 -block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock -block.hotrock.name = Hot Rock -block.magmarock.name = Magma Rock +block.metal-floor.name = Metalen Vloer +block.metal-floor-2.name = Metalen Vloer 2 +block.metal-floor-3.name = Metalen Vloer 3 +block.metal-floor-5.name = Metalen Vloer 5 +block.metal-floor-damaged.name = Metalen Vloer Beschadigd +block.dark-panel-1.name = Donker Paneel 1 +block.dark-panel-2.name = Donker Paneel 2 +block.dark-panel-3.name = Donker Paneel 3 +block.dark-panel-4.name = Donker Paneel 4 +block.dark-panel-5.name = Donker Paneel 5 +block.dark-panel-6.name = Donker Paneel 6 +block.dark-metal.name = Donker Metaal +block.ignarock.name = Igna Steen +block.hotrock.name = Lava Steen +block.magmarock.name = Magma Steen block.cliffs.name = Cliffs -block.copper-wall.name = Copper Wall -block.copper-wall-large.name = Large Copper Wall -block.titanium-wall.name = Titanium Wall -block.titanium-wall-large.name = Large Titanium Wall -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall -block.phase-wall.name = Phase Wall -block.phase-wall-large.name = Large Phase Wall -block.thorium-wall.name = Thorium Wall -block.thorium-wall-large.name = Large Thorium Wall -block.door.name = Door -block.door-large.name = Large Door +block.copper-wall.name = Koperen Muur +block.copper-wall-large.name = Grote Koperen Muur +block.titanium-wall.name = Titanium Muur +block.titanium-wall-large.name = Grote Titanium Muur +block.plastanium-wall.name = Plastanium Muur +block.plastanium-wall-large.name = Grote Plastanium Muur +block.phase-wall.name = Phase Muur +block.phase-wall-large.name = Grote Phase Muur +block.thorium-wall.name = Thorium Muur +block.thorium-wall-large.name = Grote Thorium Muur +block.door.name = Deur +block.door-large.name = Grote Deur block.duo.name = Duo block.scorch.name = Scorch block.scatter.name = Scatter block.hail.name = Hail block.lancer.name = Lancer -block.conveyor.name = Conveyor -block.titanium-conveyor.name = Titanium Conveyor -block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors. -block.junction.name = Junction +block.conveyor.name = Lopende Band +block.titanium-conveyor.name = Titanium Lopende Band +block.armored-conveyor.name = Gepantserde Lopende Band +block.armored-conveyor.description = Verplaatst items met dezelfde snelheid als een van titanium, maar heeft meer levenspunten. accepteert alleen items van de zijkanten als het ook lopende banden zijn. +block.junction.name = Kruising block.router.name = Router block.distributor.name = Distributor -block.sorter.name = Sorter -block.inverted-sorter.name = Inverted Sorter -block.message.name = Message +block.sorter.name = Sorteerder +block.inverted-sorter.name = Omgekeerder Sorteerder +block.message.name = Bericht +block.illuminator.name = Lamp +block.illuminator.description = Een kleine aanpasbare lamp, heef stroom nodig. block.overflow-gate.name = Overflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer block.cryofluidmixer.name = Cryofluid Mixer block.melter.name = Melter -block.incinerator.name = Incinerator +block.incinerator.name = Verbrander block.spore-press.name = Spore Press block.separator.name = Separator block.coal-centrifuge.name = Coal Centrifuge -block.power-node.name = Power Node -block.power-node-large.name = Large Power Node -block.surge-tower.name = Surge Tower -block.battery.name = Battery -block.battery-large.name = Large Battery -block.combustion-generator.name = Combustion Generator +block.power-node.name = Stroompaal +block.power-node-large.name = Grote Stroompaal +block.surge-tower.name = Hoogspanningsmast +block.diode.name = Batterij Diode +block.battery.name = Batterij +block.battery-large.name = Grote Batterij +block.combustion-generator.name = Fossiele Generator block.turbine-generator.name = Turbine Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor -block.mechanical-drill.name = Mechanical Drill -block.pneumatic-drill.name = Pneumatic Drill +block.mechanical-drill.name = Mechanische Drill +block.pneumatic-drill.name = Pneumatische Drill block.laser-drill.name = Laser Drill -block.water-extractor.name = Water Extractor +block.water-extractor.name = Water Put block.cultivator.name = Cultivator block.dart-mech-pad.name = Dart Mech Pad block.delta-mech-pad.name = Delta Mech Pad @@ -896,15 +973,16 @@ block.trident-ship-pad.name = Trident Ship Pad block.glaive-ship-pad.name = Glaive Ship Pad block.omega-mech-pad.name = Omega Mech Pad block.tau-mech-pad.name = Tau Mech Pad -block.conduit.name = Conduit -block.mechanical-pump.name = Mechanical Pump +block.conduit.name = Pijp +block.mechanical-pump.name = Mechanische Pomp block.item-source.name = Item Source block.item-void.name = Item Void block.liquid-source.name = Liquid Source +block.liquid-void.name = Liquid Void block.power-void.name = Power Void block.power-source.name = Power Infinite block.unloader.name = Unloader -block.vault.name = Vault +block.vault.name = Kluis block.wave.name = Wave block.swarmer.name = Swarmer block.salvo.name = Salvo @@ -914,9 +992,9 @@ block.bridge-conveyor.name = Bridge Conveyor block.plastanium-compressor.name = Plastanium Compressor block.pyratite-mixer.name = Pyratite Mixer block.blast-mixer.name = Blast Mixer -block.solar-panel.name = Solar Panel -block.solar-panel-large.name = Large Solar Panel -block.oil-extractor.name = Oil Extractor +block.solar-panel.name = Zonnepaneeltje +block.solar-panel-large.name = Zonnepaneel +block.oil-extractor.name = Olie put block.command-center.name = Command Center block.draug-factory.name = Draug Miner Drone Factory block.spirit-factory.name = Spirit Drone Factory @@ -930,10 +1008,11 @@ block.fortress-factory.name = Fortress Mech Factory block.revenant-factory.name = Revenant Fighter Factory block.repair-point.name = Repair Point block.pulse-conduit.name = Pulse Conduit +block.plated-conduit.name = Gepantserde Pijp block.phase-conduit.name = Phase Conduit block.liquid-router.name = Liquid Router -block.liquid-tank.name = Liquid Tank -block.liquid-junction.name = Liquid Junction +block.liquid-tank.name = Vloeistof Tank +block.liquid-junction.name = Vloeistof Kruising block.bridge-conduit.name = Bridge Conduit block.rotary-pump.name = Rotary Pump block.thorium-reactor.name = Thorium Reactor @@ -944,32 +1023,32 @@ block.thermal-generator.name = Thermal Generator block.alloy-smelter.name = Alloy Smelter block.mender.name = Mender block.mend-projector.name = Mend Projector -block.surge-wall.name = Surge Wall -block.surge-wall-large.name = Large Surge Wall +block.surge-wall.name = Surge Muur +block.surge-wall-large.name = Grote Surge Muur block.cyclone.name = Cyclone block.fuse.name = Fuse -block.shock-mine.name = Shock Mine +block.shock-mine.name = Electrische Landmijn block.overdrive-projector.name = Overdrive Projector -block.force-projector.name = Force Projector +block.force-projector.name = Krachtveld block.arc.name = Arc block.rtg-generator.name = RTG Generator block.spectre.name = Spectre block.meltdown.name = Meltdown -block.container.name = Container +block.container.name = Doos block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad -team.blue.name = blue -team.crux.name = red -team.sharded.name = orange -team.orange.name = orange -team.derelict.name = derelict -team.green.name = green -team.purple.name = purple +team.blue.name = blauw +team.crux.name = rood +team.sharded.name = oranje +team.orange.name = oranje +team.derelict.name = wees +team.green.name = groen +team.purple.name = paars unit.spirit.name = Spirit Drone unit.draug.name = Draug Miner Drone unit.phantom.name = Phantom Drone -unit.dagger.name = Dagger -unit.crawler.name = Crawler +unit.dagger.name = Dolk +unit.crawler.name = Kruiper unit.titan.name = Titan unit.ghoul.name = Ghoul Bomber unit.wraith.name = Wraith Fighter @@ -980,27 +1059,28 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.next = [lightgray] -tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then 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.\nPlace one on a copper vein. -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.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to 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.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. -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.next = [lightgray] +tutorial.intro = Welkom bij de[scarlet] Mindustry Tutorial.[]\nBegin met het[accent] delven van koper[]. Klik op een vakje die het heeft om het te delven.\n\n[accent]{0}/{1} koper +tutorial.intro.mobile = Welkom bij de[scarlet] Mindustry Tutorial.[]\nVeeg over het scherm om te bewegen.\n[accent]Knijp met 2 vingers [] om in en uit te zoomen.\nBegin met het[accent] delven van koper[]. Beweeg dichterbij, en klik er dan op.\n\n[accent]{0}/{1} koper +tutorial.drill = Met de hand delven is inefficient.\n[accent]Drills []kunnen automatisch voor je delven.\nPlaats er een op de koper. +tutorial.drill.mobile = Met de hand delven is inefficient.\n[accent]Drills []kunnen automatisch voor je delven.\nZoek de drill rechts onderin.\nSelecter de[accent] mechanische drill[].\nPlaats het op de koper door erop te klikken, druk dan op het[accent] vinkje[] om het bouwen te bevestigen.\nKlik op de[accent] X knop[] om het te anuleren. +tutorial.blockinfo = Elk blok heeft andere statistieken. Elke drill kan enkel bepaalde dingen delven.\nOm het van een blok te checken,[accent] druk op de "?" knop terwijl je het blok vast hebt.[]\n\n[accent]Lees de stats van de Mechanische Drill maar eens.[] +tutorial.conveyor = [accent]Lopende Banden[] worden gebruikt om je items naar je core te krijgen.\nLeg een line aan van je drills tot aan je core. +tutorial.conveyor.mobile = [accent]Lopende Banden[] worden gebruikt om je items naar je core te krijgen.\nLeg een line aan van je drills tot aan je core.\n[accent] Doe dit door je vinger een paar seconden stil te houden[] en dan in een richting te slepen.\n\n[accent]{0}/{1} lopende banden in 1x geplaatst\n[accent]0/1 items afgeleverd +tutorial.turret = Defensieve gebouwen moeten worden gebouwd tegen de[LIGHT_GRAY] vijand[].\nBouw een duo kannon bij je basis. +tutorial.drillturret = Duo's hebben[accent] koperen ammonutie []nodig om te schieten.\nPlaatst een drill ernaast om het van koper te voorzien. +tutorial.pause = Tijdens een gevecht is het mogelijk[accent] het spel te pauzeren.[]\nJe kan nog wel je gebouwen plannen dan.\n\n[accent]Pauzeer het spel (spatie) nu. 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.unpause = Now press space again to unpause. -tutorial.unpause.mobile = Now press it again to unpause. -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.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.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.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.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -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.unpause = Doe het opnieuw om weer verder te gaan. +tutorial.unpause.mobile = Doe het opnieuw om weer verder te gaan. +tutorial.breaking = Vaak moet je blokken weer verwijderen.\n[accent]Houd rechts-klik ingedrukt[] om alle geselecteerde blokken te vernietigen.[]\n\n[accent]Vernietig de scrap blokken links van je core om verder te gaan. +tutorial.breaking.mobile = Vaak moet je blokken weer verwijderen.\n[accent]klik op de hamer voor vernietigigs-mode[], klik dan op een blok om het te breken.\nVernietig een heel gebied door je vinger een paar seconden still te houden en dan te slepen in een richting.\nKlik dan op het vinkje om het te bevestigen.\n\n[accent]Vernietig de scrap blokken links van je core om verder te gaan. +tutorial.withdraw = In sommige situaties, is het nodig om items uit een blok te kunnen pakken.\nOm dit te doen, [accent]klik je op een blok[] waar items in zitten, en dan [accent]op het item te klikken[] in het zwarte menu.\nMeerdere items tegelijk kan je eruit halen door [accent]het ingedrukt te houden[].\n\n[accent]Pak wat koper uit de core.[] +tutorial.deposit = Je kan de items weer terugstoppen door van je schip het terug te slepen naar waar je het wilt.\n\n[accent]Stop het nu weer terug in de core.[] +tutorial.waves = De[LIGHT_GRAY] vijand[] naderd.\n\nVerdedig je core voor 2 rondes. Bouw meer verdedigingen. +tutorial.waves.mobile = De[LIGHT_GRAY] vijand[] naderd.\n\nVerdedig je core voor 2 rondes. Je schip schiet automatisch op vijanden.\nBouw meer verdedigingen, en mine meer koper. +tutorial.launch = Tijdens sommige waves, kan je je core[accent] lanceren[], hiermee verlaat je de basis permanent[accent] maar je neemt wel alles dat in de core zit met je mee.[]\nVervolgens valt ermee te onderzoeken.\n\n[accent]Druk op de lanceer knop. + item.copper.description = A useful structure material. Used extensively in all types of 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. @@ -1062,6 +1142,7 @@ block.power-source.description = Infinitely outputs power. Sandbox only. block.item-source.description = Infinitely outputs items. Sandbox only. block.item-void.description = Destroys any items which go into it without using power. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = An advanced pump which doubles up speed by using block.thermal-pump.description = The ultimate pump. Three times as fast as a mechanical pump and the only pump which is able to retrieve lava. block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. block.liquid-tank.description = Stores a large amount of liquids. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. @@ -1105,6 +1187,7 @@ block.phase-conduit.description = Advanced liquid transport block. Uses power to block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. 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-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 21e2410cfe..696ecf76e3 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -12,6 +12,7 @@ link.itch.io.description = Itch.io pagina met de PC downloads en online versie link.google-play.description = Mindustry op Google Play link.f-droid.description = F-Droid catalogus link.wiki.description = Officiële Mindustry-wiki +link.feathub.description = Suggest new features linkfail = Openen van link mislukt!\nDe link is gekopiëerd naar je klembord. screenshot = Locatie screenshot: {0} screenshot.invalid = Kaart te groot, mogelijks te weinig geheugen voor een screenshot te kunnen maken. @@ -19,12 +20,22 @@ gameover = Game Over gameover.pvp = Het[accent] {0}[] team heeft gewonnen! highscore = [accent]Nieuw record! copied = Gekopieerd. + load.sound = Geluiden load.map = Kaarten load.image = Afbeeldingen load.content = Inhoud load.system = Systeem load.mod = Mods +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Blauwdruk schematic.add = Blauwdruk Opslaan... schematics = Blauwdrukken @@ -41,6 +52,7 @@ schematic.saved = Blauwdruk opgeslagen. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Blauwdruk Hernoemen schematic.info = {0}x{1}, {2} blokken + stat.wave = Je overleefde tot aanvalsgolf: [accent]{0}[]. stat.enemiesDestroyed = Vijanden vernietigd:[accent] {0} stat.built = Gebouwen gebouwd:[accent] {0} @@ -48,6 +60,7 @@ stat.destroyed = Gebouwen vernietigd:[accent] {0} stat.deconstructed = Gebouwen afgebroken:[accent] {0} stat.delivered = Gronstoffen meegenomen: stat.rank = Eindresultaat: [accent]{0} + launcheditems = [accent]Meegenomen grondstoffen launchinfo = [unlaunched][[LAUNCH] je kern om de met blauw aangeduide voorwerpen te verkrijgen. map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen? @@ -75,6 +88,7 @@ maps.browse = Bekijk Kaarten continue = Ga verder maps.none = [LIGHT_GRAY]Geen kaarten gevonden! invalid = Ongeldig +pickcolor = Pick Color preparingconfig = Configuratie Voorbereiden preparingcontent = Inhoud Voorbereiden uploadingcontent = Inhoud Uploaden @@ -82,6 +96,7 @@ uploadingpreviewfile = Voorbeeldbestand Uploaden committingchanges = Veranderingen Toepassen done = Klaar feature.unsupported = Uw apparaat ondersteunt deze functie niet. + mods.alphainfo = Mods zijn nog in alfa en [scarlet] kunnen zeer onstabiel zijn[].\nMeld problemen die je ondervindt op de Mindustry Github of Discord. mods.alpha = [accent](Alfa) mods = Mods @@ -93,18 +108,25 @@ mod.enabled = [lightgray]Ingeschakeld mod.disabled = [scarlet]Uitgeschakeld mod.disable = Schakel uit mod.delete.error = Kan mod niet verwijderen. Bestand is mogelijk in gebruik. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]De volgende vereisten ontbreken voor mod '{0}':[accent] {1}\n[lightgray]Deze mods moeten eerst gedownload worden.\nDeze mod wordt automatisch uitgeschakeld. mod.enable = Schakel in mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Herladen Vereist mod.import = Importeer Mod mod.import.github = Importeer GitHub Mod +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = Deze mod zal worden verwijderd. mod.author = [LIGHT_GRAY]Auteur:[] {0} mod.missing = Dit opslagbestand bevat mods die zijn geupdate of recentelijk zijn verwijderd. Uw opslagbestand kan beschadigd geraken. Bent u zeker dat u wil verdergaan?\n[lightgray]Mods:\n{0} mod.preview.missing = Voordat je de mod publiceert moet je een afbeelding voor de voorvertoning toevoegen.\nPlaats een afbeelding met de naam[accent] preview.png[] in de modfolder. mod.folder.missing = Mods kunnen enkel gepubliceerd worden in foldervorm.\nOm een mod in foldervorm te zetten exporteer je het modbestand uit de zipfile en verwijder je de oude zipfile. Herlaad vervolgens je mods of herstart het spel. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Over name = Naam: noname = Kies eerst[accent] een naam[]. @@ -133,6 +155,7 @@ server.kicked.nameEmpty = Je gekozen naam is ongeldig. server.kicked.idInUse = Je bent al verbonden met de server! Verbinden met 2 clients tegelijk is verboden. server.kicked.customClient = Deze server ondersteunt geen aangepaste versies (mods). Download een officiële versie. server.kicked.gameover = Game over! +server.kicked.serverRestarting = The server is restarting. server.versions = Jouw versie:[accent] {0}[]\nServerversie:[accent] {1}[] host.info = Ook de [accent]host[] knop hosts een server op poort [scarlet]6567[]. \nIedereen die verbonden is met dezelfde [LIGHT_GRAY]wifi of lokaal netwerk[] zou je server moeten zien in zijn server lijst.\n\nAls je wil dat personen kunnen verbinden met je server van ergens anders via IP. Dan is [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Nota: Als iemand problemen heeft met het verbinden tot je LAN spel, zorg dan dat mindustry toestemming heeft tot je lokale netwerk in de Firewall instellingen. join.info = Hier kan je een [accent]server IP[] invullen waarmee je wil verbinden. Je kan hier ook verbinden met servers op je [accent]lokale netwerk[]. LAN en WAN multiplayer wordt ondersteund.\n\n[LIGHT_GRAY]Belangrijk: er is geen automatische globale server lijst; als je met iemand wil verbinden via een IP adres moet je zijn/haar IP adres vragen. @@ -272,6 +295,7 @@ publishing = [accent]Publishing... publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.error = Error publishing item: {0} steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = Brush editor.openin = Open In Editor editor.oregen = Ore Generation @@ -348,6 +372,7 @@ 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.exists = A map with this name already exists. editor.selectmap = Select a map to load: + toolmode.replace = Replace toolmode.replace.description = Draws only on solid blocks. toolmode.replaceall = Replace All @@ -362,6 +387,7 @@ toolmode.fillteams = Fill Teams toolmode.fillteams.description = Fill teams instead of blocks. toolmode.drawteams = Draw Teams toolmode.drawteams.description = Draw teams instead of blocks. + filters.empty = [LIGHT_GRAY]No filters! Add one with the button below. filter.distort = Distort filter.noise = Noise @@ -393,6 +419,7 @@ filter.option.floor2 = Secondary Floor filter.option.threshold2 = Secondary Threshold filter.option.radius = Radius filter.option.percentile = Percentile + width = Width: height = Height: menu = Menu @@ -408,6 +435,7 @@ tutorial = Tutorial tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Map Editor + abandon = Abandon abandon.text = This zone and all its resources will be lost to the enemy. locked = Locked @@ -438,6 +466,7 @@ zone.objective.survival = Survive zone.objective.attack = Destroy Enemy Core add = Add... boss.health = Boss Health + connectfail = [crimson]Failed to connect to server:\n\n[accent]{0} error.unreachable = Server unreachable.\nIs the address spelled correctly? error.invalidaddress = Invalid address. @@ -448,6 +477,7 @@ error.mapnotfound = Map file not found! error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. + zone.groundZero.name = Ground Zero zone.desertWastes.name = Desert Wastes zone.craters.name = The Craters @@ -462,6 +492,7 @@ zone.saltFlats.name = Salt Flats zone.impact0078.name = Impact 0078 zone.crags.name = Crags 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.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.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. @@ -476,10 +507,12 @@ 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.impact0078.description = zone.crags.description = + settings.language = Language settings.data = Game Data settings.reset = Reset to Defaults settings.rebind = Rebind +settings.resetKey = Reset settings.controls = Controls settings.game = Game settings.sound = Sound @@ -530,6 +563,7 @@ blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo + bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s @@ -545,6 +579,9 @@ bar.heat = Heat bar.power = Power bar.progress = Build Progress bar.spawned = Units: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] damage bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary @@ -556,6 +593,7 @@ bullet.freezing = [stat]freezing bullet.tarred = [stat]tarred bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.reload = [stat]{0}[lightgray]x fire rate + unit.blocks = blocks unit.powersecond = power units/second unit.liquidsecond = liquid units/second @@ -568,6 +606,8 @@ unit.persecond = /sec unit.timesspeed = x speed unit.percent = % unit.items = items +unit.thousands = k +unit.millions = mil category.general = General category.power = Power category.liquids = Liquids @@ -580,6 +620,7 @@ setting.shadows.name = Shadows setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animated Water setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] @@ -602,12 +643,16 @@ setting.screenshake.name = Screen Shake setting.effects.name = Display Effects setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Autosave Interval setting.seconds = {0} Seconds +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) setting.fps.name = Show FPS +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance, disables animations) setting.minimap.name = Show Minimap @@ -636,16 +681,36 @@ category.multiplayer.name = Multiplayer command.attack = Attack command.rally = Rally command.retreat = Retreat +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Clear Building keybind.press = Press a key... keybind.press.axis = Press an axis or key... keybind.screenshot.name = Map Screenshot +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Move x keybind.move_y.name = Move y +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Dash keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_y.name = Flip Schematic Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Toggle Fullscreen keybind.select.name = Select/Shoot keybind.diagonal_placement.name = Diagonal Placement @@ -658,7 +723,6 @@ keybind.menu.name = Menu keybind.pause.name = Pause keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap -keybind.dash.name = Dash keybind.chat.name = Chat keybind.player_list.name = Player list keybind.console.name = Console @@ -681,7 +745,9 @@ mode.pvp.description = Fight against other players locally. mode.attack.name = Attack mode.attack.description = No waves, with the goal to destroy the enemy base. mode.custom = Custom Rules + rules.infiniteresources = Infinite Resources +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode @@ -689,6 +755,7 @@ rules.enemyCheat = Infinite AI (Red Team) Resources rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Player Health Multiplier rules.playerdamagemultiplier = Player Damage Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier @@ -707,6 +774,10 @@ rules.title.resourcesbuilding = Resources & Building rules.title.player = Players rules.title.enemy = Enemies rules.title.unit = Units +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Items content.liquid.name = Liquids content.unit.name = Units @@ -753,6 +824,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Bomb Bay mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Flame Repeater +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [LIGHT_GRAY]Explosiveness: {0}% item.flammability = [LIGHT_GRAY]Flammability: {0}% item.radioactivity = [LIGHT_GRAY]Radioactivity: {0}% @@ -768,6 +840,7 @@ mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} liquid.temperature = [LIGHT_GRAY]Temperature: {0} + block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.salt.name = Salt @@ -866,6 +939,8 @@ block.distributor.name = Distributor block.sorter.name = Sorter block.inverted-sorter.name = Inverted Sorter block.message.name = Message +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Overflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver @@ -879,6 +954,7 @@ block.coal-centrifuge.name = Coal Centrifuge block.power-node.name = Power Node block.power-node-large.name = Large Power Node block.surge-tower.name = Surge Tower +block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator @@ -902,6 +978,7 @@ block.mechanical-pump.name = Mechanical Pump block.item-source.name = Item Source block.item-void.name = Item Void block.liquid-source.name = Liquid Source +block.liquid-void.name = Liquid Void block.power-void.name = Power Void block.power-source.name = Power Infinite block.unloader.name = Unloader @@ -931,6 +1008,7 @@ block.fortress-factory.name = Fortress Mech Factory block.revenant-factory.name = Revenant Fighter Factory block.repair-point.name = Repair Point block.pulse-conduit.name = Pulse Conduit +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Phase Conduit block.liquid-router.name = Liquid Router block.liquid-tank.name = Liquid Tank @@ -1002,6 +1080,7 @@ tutorial.deposit = Deposit items into blocks by dragging from your ship to the d tutorial.waves = De [LIGHT_GRAY] vijand[] nadert.\n\nVerdedig jouw kern voor 2 golven. Bouw meer geschutstorens. 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. + item.copper.description = A useful structure material. Used extensively in all types of 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. @@ -1063,6 +1142,7 @@ block.power-source.description = Infinitely outputs power. Sandbox only. block.item-source.description = Infinitely outputs items. Sandbox only. block.item-void.description = Destroys any items which go into it without using power. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. @@ -1098,6 +1178,7 @@ block.rotary-pump.description = An advanced pump which doubles up speed by using block.thermal-pump.description = The ultimate pump. block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. block.liquid-tank.description = Stores a large amount of liquids. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. @@ -1106,6 +1187,7 @@ block.phase-conduit.description = Advanced liquid transport block. Uses power to block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. 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-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index fd97dca25f..6d9f3d3dba 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -12,13 +12,14 @@ link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania link.google-play.description = Strona na sklepie Google Play link.f-droid.description = F-Droid catalogue listing link.wiki.description = Oficjana Wiki Mindustry +link.feathub.description = Zaproponuj nowe funkcje linkfail = Nie udało się otworzyć linku!\nURL został skopiowany. screenshot = Zapisano zdjęcie w {0} screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje miejsca w pamięci urządzenia. gameover = Koniec Gry gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! highscore = [YELLOW] Nowy rekord! -copied = Copied. +copied = Skopiowano. load.sound = Dźwięki load.map = Mapy @@ -26,6 +27,14 @@ load.image = Obrazy load.content = Treść load.system = System load.mod = Mody +load.scripts = Skrypty + +be.update = Nowa wersja Bleeding Edge jest dostępna: +be.update.confirm = Pobrać i zainstalować teraz? +be.updating = Aktualizowanie... +be.ignore = Zignoruj +be.noupdates = Nie znaleziono aktualizacji. +be.check = Sprawdź aktualizacje schematic = Schemat schematic.add = Zapisz schemat... @@ -80,7 +89,6 @@ continue = Kontynuuj maps.none = [lightgray]Nie znaleziono żadnych map! invalid = Nieprawidłowy pickcolor = Wybierz kolor - preparingconfig = Przygotowywanie Konfiguracji preparingcontent = Przygotowywanie Zawartości uploadingcontent = Przesyłanie Zawartości @@ -100,22 +108,28 @@ mod.enabled = [lightgray]Włączony mod.disabled = [scarlet]Wyłączony mod.disable = Wyłącz mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu. +mod.requiresversion = [scarlet]Wymaga gry w wersji co najmniej: [accent]{0} mod.missingdependencies = [scarlet]Brakujące zależności: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Wystąpił błąd podczas ładowania treści. +mod.noerrorplay = [scarlet]Twoje mody zawierają błędy.[] Wyłącz je lub napraw błędy przed rozpoczęciem gry. mod.nowdisabled = [scarlet]Brakuje zależności dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba ściągnąć te mody.\nMod zostanie automatycznie wyłączony. mod.enable = Włącz mod.requiresrestart = Gra się wyłączy aby wprowadzić zmiany moda. mod.reloadrequired = [scarlet]Wymagany restart mod.import = Importuj Mod mod.import.github = Importuj mod z GitHuba +mod.item.remove = Ten przedmiot jest częścią moda[accent] '{0}'[]. Aby usunąć go, odinstaluj modyfikację. mod.remove.confirm = Ten mod zostanie usunięty. mod.author = [LIGHT_GRAY]Autor:[] {0} mod.missing = Ten zapis zawiera mody, które zostały niedawno zaktualizowane, bądź nie są już zainstalowane. Zapis może zostać uszkodzony. Czy jesteś pewien, że chcesz go załadować?\n[lightgray]Mody:\n{0} mod.preview.missing = Przed opublikowaniem tego moda na Warsztacie musisz dodać zdjęcie podglądowe.\nDodaj zdjęcie o nazwie[accent] preview.png[] do folderu moda i spróbuj jeszcze raz. -mod.folder.missing = Jedynie mody w formie folderów mogą się znaleźć na Warsztacie.\nBy zamienić moda w folder, wyciągnij go z archiwum, umieść w folderze i usuń archiwum. Później uruchom ponownie grę bądź załaduj ponownie mody. +mod.folder.missing = Jedynie mody w formie folderów mogą się znaleźć na Warsztacie.\nBy zamienić moda w folder, wyciągnij go z archiwum, umieść w folderze i usuń archiwum. Później uruchom ponownie grę lub załaduj ponownie mody. +mod.scripts.unsupported = Twoje urządzenie nie wspiera skryptów. Niektóre mody mogą nie działać poprawnie. about.button = O Grze name = Nazwa: -noname = Najpierw wybierz[accent] nazwę gracza[] +noname = Najpierw wybierz[accent] nazwę gracza[]. filename = Nazwa Pliku: unlocked = Odblokowano nową zawartość! completed = [accent]Ukończony @@ -123,8 +137,8 @@ techtree = Drzewo Technologiczne research.list = [lightgray]Badania: research = Badaj researched = [lightgray]{0} zbadane. -players = {0} graczy online -players.single = {0} gracz online +players = {0} graczy +players.single = {0} gracz server.closing = [accent] Zamykanie serwera... server.kicked.kick = Zostałeś wyrzucony z serwera! server.kicked.whitelist = Nie ma cię tu na białej liście. @@ -141,6 +155,7 @@ server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa. server.kicked.idInUse = Jesteś już na serwerze! Łączenie się z dwóch kont nie jest dozwolone. server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję. server.kicked.gameover = Koniec gry! +server.kicked.serverRestarting = Restart serwera. server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[] host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[]. \nKażdy w tej samej sieci [lightgray]wifi lub hotspocie[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, musisz wykonać [accent]przekierowywanie portów[].\n\n[lightgray]Notka: Jeśli ktokolwiek ma problem z dołączeniem do gry lokalnej, upewnij się, że udostępniłeś Mindustry dostęp do sieci w ustawieniach zapory (firewall). Zauważ, że niektóre sieci publiczne mogą nie zezwalać na wykrycie serwerów. join.info = Tutaj możesz wpisać [accent]adres IP serwera[], aby dołączyć lub wyszukać [accent]serwerów w lokalnej sieci[], do których możesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[lightgray]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać hosta o IP. @@ -240,7 +255,7 @@ 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ę.\nWykryto zapis lub mapę z wersji classic (v3.5 build 40) - czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, do użycia w aplikacji Mindustry Classic? +classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nWykryto zapis lub mapę z wersji classic (v3.5 build 40) - czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, aby móc używać ich w Mindustry Classic? quit.confirm = Czy na pewno chcesz wyjść? quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Ustawienia->Gra->Ponów samouczek.[] loading = [accent]Ładowanie... @@ -248,7 +263,7 @@ reloading = [accent]Przeładowywanie Modów... saving = [accent]Zapisywanie... cancelbuilding = [accent][[{0}][] by wyczyścić plan selectschematic = [accent][[{0}][] by wybrać+skopiować -pausebuilding = [accent][[{0}][] by wtrzymać budowę +pausebuilding = [accent][[{0}][] by wstrzymać budowę resumebuilding = [scarlet][[{0}][] by kontynuować budowę wave = [accent]Fala {0} wave.waiting = Fala za {0} @@ -414,7 +429,6 @@ load = Wczytaj save = Zapisz fps = FPS: {0} ping = Ping: {0}ms - language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować. settings = Ustawienia tutorial = Poradnik @@ -456,7 +470,7 @@ boss.health = Zdrowie Bossa 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.invalidaddress = Niepoprawny adres. -error.timedout = Przekroczono limit czasu!/nUpewnij się, że host ma ustawione przekierowanie portu oraz poprawność wpisanego adresu! +error.timedout = Przekroczono limit czasu!\nUpewnij się, że host ma ustawione przekierowanie portu oraz poprawność wpisanego adresu! error.mismatch = Błąd pakietu:\nprawdopodobne niedopasowanie klienta/serwera.\nUpewnij się, że ty i host macie najnowszą wersję Mindustry! error.alreadyconnected = Jesteś już połączony. error.mapnotfound = Plik mapy nie został znaleziony! @@ -493,10 +507,12 @@ zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, 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 rdzenie. zone.impact0078.description = zone.crags.description = + settings.language = Język settings.data = Dane Gry settings.reset = Przywróć Domyślne settings.rebind = Zmień +settings.resetKey = Resetuj settings.controls = Sterowanie settings.game = Gra settings.sound = Dźwięk @@ -563,8 +579,8 @@ bar.heat = Ciepło bar.power = Prąd bar.progress = Postęp Budowy bar.spawned = Jednostki: {0}/{1} -bar.input = Input -bar.output = Output +bar.input = Wejście +bar.output = Wyjście bullet.damage = [stat]{0}[lightgray] Obrażenia bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki @@ -590,6 +606,8 @@ unit.persecond = /sekundę unit.timesspeed = x prędkość unit.percent = % unit.items = przedmioty +unit.thousands = tys. +unit.millions = mln category.general = Główne category.power = Prąd category.liquids = Płyny @@ -621,19 +639,20 @@ setting.difficulty.normal = Normalny setting.difficulty.hard = Trudny setting.difficulty.insane = Szalony setting.difficulty.name = Poziom trudności -setting.screenshake.name = Wstrząsy ekranu +setting.screenshake.name = Siła wstrząsów ekranu setting.effects.name = Wyświetlanie efektów setting.destroyedblocks.name = Wyświetl zniszczone bloki -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.conveyorpathfinding.name = Ustalanie ścieżki przenośników +setting.coreselect.name = Zezwalaj na schematyczne rdzenie setting.sensitivity.name = Czułość kontrolera setting.saveinterval.name = Interwał automatycznego zapisywania setting.seconds = {0} sekund setting.blockselecttimeout.name = Block Select Timeout -setting.milliseconds = {0} millisekund +setting.milliseconds = {0} milisekund setting.fullscreen.name = Pełny ekran setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu) setting.fps.name = Pokazuj FPS oraz ping -setting.blockselectkeys.name = Show Block Select Keys +setting.blockselectkeys.name = Pokazuj skróty klawiszowe bloków setting.vsync.name = Synchronizacja pionowa setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje) setting.minimap.name = Pokaż Minimapę @@ -653,7 +672,7 @@ public.confirm = Czy chcesz ustawić swoją grę jako publiczną?\n[accent]Każd public.beta = Wersje beta gry nie mogą tworzyć publicznych pokoi. 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 = Anuluj i Wyjdź -setting.bloom.name = Bloom +setting.bloom.name = Efekt Bloom keybind.title = Zmień 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 @@ -662,15 +681,15 @@ category.multiplayer.name = Wielu graczy command.attack = Atakuj command.rally = Zbierz command.retreat = Wycofaj -placement.blockselectkeys = \n[lightgray]Key: [{0}, +placement.blockselectkeys = \n[lightgray]Klawisz: [{0}, keybind.clear_building.name = Wyczyść budynek keybind.press = Naciśnij wybrany klawisz... keybind.press.axis = Naciśnij oś lub klawisz... keybind.screenshot.name = Zrzut ekranu mapy -keybind.toggle_power_lines.name = Toggle Power Lines +keybind.toggle_power_lines.name = Zmień widoczność linii energetycznych keybind.move_x.name = Poruszanie w poziomie keybind.move_y.name = Poruszanie w pionie -keybind.mouse_move.name = Follow Mouse +keybind.mouse_move.name = Podążaj Za Myszą keybind.dash.name = Dash keybind.schematic_select.name = Wybierz region keybind.schematic_menu.name = Menu schematów @@ -682,16 +701,16 @@ keybind.block_select_left.name = Block Select Left keybind.block_select_right.name = Block Select Right keybind.block_select_up.name = Block Select Up keybind.block_select_down.name = Block Select Down -keybind.block_select_01.name = Category/Block Select 1 -keybind.block_select_02.name = Category/Block Select 2 -keybind.block_select_03.name = Category/Block Select 3 -keybind.block_select_04.name = Category/Block Select 4 -keybind.block_select_05.name = Category/Block Select 5 -keybind.block_select_06.name = Category/Block Select 6 -keybind.block_select_07.name = Category/Block Select 7 -keybind.block_select_08.name = Category/Block Select 8 -keybind.block_select_09.name = Category/Block Select 9 -keybind.block_select_10.name = Category/Block Select 10 +keybind.block_select_01.name = Wybór bloku/kategorii 1 +keybind.block_select_02.name = Wybór bloku/kategorii 2 +keybind.block_select_03.name = Wybór bloku/kategorii 3 +keybind.block_select_04.name = Wybór bloku/kategorii 4 +keybind.block_select_05.name = Wybór bloku/kategorii 5 +keybind.block_select_06.name = Wybór bloku/kategorii 6 +keybind.block_select_07.name = Wybór bloku/kategorii 7 +keybind.block_select_08.name = Wybór bloku/kategorii 8 +keybind.block_select_09.name = Wybór bloku/kategorii 9 +keybind.block_select_10.name = Wybór bloku/kategorii 10 keybind.fullscreen.name = Przełącz Pełny Ekran keybind.select.name = Zaznacz keybind.diagonal_placement.name = Budowa po skosie @@ -736,6 +755,7 @@ rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespo rules.unitdrops = Surowce ze zniszczonych jednostek rules.unitbuildspeedmultiplier = Mnożnik prędkości tworzenia jednostek rules.unithealthmultiplier = Mnożnik życia jednostek +rules.blockhealthmultiplier = Mnożnik życia bloków rules.playerhealthmultiplier = Mnożnik życia gracza rules.playerdamagemultiplier = Mnożnik obrażeń gracza rules.unitdamagemultiplier = Mnożnik obrażeń jednostek @@ -804,6 +824,7 @@ mech.trident-ship.name = Trójząb mech.trident-ship.weapon = Wnęka bombowa mech.glaive-ship.name = Glewia mech.glaive-ship.weapon = Zapalający Karabin +item.corestorable = [lightgray]Przechowywalne w rdzeniu: {0} item.explosiveness = [lightgray]Wybuchowość: {0} item.flammability = [lightgray]Palność: {0} item.radioactivity = [lightgray]Promieniotwórczość: {0} @@ -957,6 +978,7 @@ block.mechanical-pump.name = Mechaniczna Pompa block.item-source.name = Źródło przedmiotów block.item-void.name = Próżnia przedmiotów block.liquid-source.name = Źródło płynów +block.liquid-void.name = Liquid Void block.power-void.name = Próżnia prądu block.power-source.name = Nieskończony Prąd block.unloader.name = Ekstraktor @@ -1120,12 +1142,13 @@ block.power-source.description = Wydziela prąd w nieskończoność. Dostępny t block.item-source.description = Wydziela przedmioty w nieskończoność. Dostępny tylko w trybie sandbox. block.item-void.description = Niszczy wszystkie przedmioty, które idą do tego bloku, który nie wymaga prądu. Dostępny tylko w trybie sandbox. block.liquid-source.description = Wydziela ciecz w nieskończoność. Dostępny tylko w trybie sandbox. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach. block.copper-wall-large.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach.\nObejmuje wiele kratek. block.titanium-wall.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami. block.titanium-wall-large.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.\nObejmuje wiele kratek. -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Specjajny typ ściany, który pochłania łuki elektryczne oraz blokuje automatyczne łączenie węzłów. +block.plastanium-wall-large.description = Specjajny typ ściany, który pochłania łuki elektryczne oraz blokuje automatyczne łączenie węzłów.\nObejmuje wiele kratek. block.thorium-wall.description = Silny blok obronny.\nDobra ochrona przed wrogami. block.thorium-wall-large.description = Silny blok obronny.\nDobra ochrona przed wrogami.\nObejmuje wiele kratek. block.phase-wall.description = Ściana pokryta specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków. @@ -1164,7 +1187,7 @@ block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Uży 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 = 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 = Węzęł prądu z bardzo dużym zasięgiem, posiadający mniej możliwych podłączeń. -block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. +block.diode.description = Energia może przepływać przez ten blok tylko w jednym kierunku, ale tylko kiedy inne strony mają zmagazynowane mniej energii. 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 = Przechowuje o wiele wiecej prądu niż standardowa bateria. block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów. @@ -1205,7 +1228,7 @@ block.ripple.description = Duża wieża artyleryjska, która strzela jednocześn block.cyclone.description = Duża szybkostrzelna wieża. block.spectre.description = Duże działo dwulufowe, które strzela potężnymi pociskami przebijającymi pancerz w jednostki naziemne i powietrzne. block.meltdown.description = Duże działo laserowe, które strzela potężnymi wiązkami dalekiego zasięgu. Wymaga chłodzenia. -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.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki. block.phantom-factory.description = Produkuje zaawansowane drony które pomagają przy budowie. @@ -1217,7 +1240,7 @@ block.crawler-factory.description = Produkuje szybkie jednostki lądowe typu "ka block.titan-factory.description = Produkuje zaawansowane, opancerzone jednostki lądowe. 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.dart-mech-pad.description = Umożliwia transformacje w podstawowego mecha bojowego.\nUżyj klikając podczas stania na nim. +block.dart-mech-pad.description = Umożliwia transformację w podstawowego mecha bojowego.\nUżyj klikając podczas stania na nim. 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 = 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 = 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. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 1e05466d91..38f865a38c 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -10,11 +10,12 @@ link.dev-builds.description = Desenvolvimentos instáveis link.trello.description = Trello oficial para atualizações planejadas link.itch.io.description = Página da Itch.io com os downloads link.google-play.description = Página da google play store -link.f-droid.description = F-Droid catalogue listing +link.f-droid.description = Listamento de catalogo do F-Droide link.wiki.description = Wiki oficial do Mindustry +link.feathub.description = Suggest new features linkfail = Falha ao abrir o link\nO Url foi copiado para a área de transferência. screenshot = Screenshot salvo para {0} -screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura de tela. +screenshot.invalid = Mapa grande demais, Voce pode estar potencialmente sem memória suficiente para captura de tela. gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [YELLOW]Novo recorde! @@ -26,6 +27,14 @@ load.image = Imagens load.content = Conteúdo load.system = Sistema load.mod = Mods +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates schematic = Esquema schematic.add = Salvar Esquema... @@ -41,8 +50,8 @@ schematic.shareworkshop = Compartilhar na Oficina schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Virar o Esquema schematic.saved = Esquema salvo. schematic.delete.confirm = Esse Esquema será totalmente erradicado. -schematic.rename = Rename Schematic -schematic.info = {0}x{1}, {2} blocks +schematic.rename = Renomear esquema +schematic.info = {0}x{1}, {2} blocos stat.wave = Hordas derrotadas:[accent] {0} stat.enemiesDestroyed = Inimigos Destruídos:[accent] {0} @@ -99,19 +108,24 @@ mod.enabled = [lightgray]Ativado mod.disabled = [scarlet]Desativado mod.disable = Desati-\nvar mod.delete.error = Incapaz de deletar o Mod. O arquivo talvez esteja em uso. -mod.requiresversion = [scarlet]Requer versão [accent]{0} [scarlet]do jogo. +mod.requiresversion = [scarlet]Requer no mínimo versão [accent]{0} [scarlet]do jogo. mod.missingdependencies = [scarlet]Dependências ausentes: {0} +mod.erroredcontent = [scarlet]Erros no Conteúdo +mod.errors = Erros ocorreram ao carregar o conteúdo. +mod.noerrorplay = [scarlet]Você tem mods com erros.[] Desative os mods afetados ou conserte os erros antes de jogar. mod.nowdisabled = [scarlet]O Mod '{0}' está com dependências ausentes:[accent] {1}\n[lightgray]Esses Mods precisam ser baixados primeiro.\nEsse Mod será desativado automaticamente. mod.enable = Ativar mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do Mod. mod.reloadrequired = [scarlet]Recarregamento necessário mod.import = Importar Mod mod.import.github = Importar Mod do GitHub -mod.remove.confirm = Esse Mod será deletado. +mod.item.remove = Este item é parte do mod[accent] '{0}'[]. Para removê-lo, desinstale esse mod. +mod.remove.confirm = Este mod será deletado. mod.author = [LIGHT_GRAY]Author:[] {0} -mod.missing = Esse jogo salvo foi criado antes de você atualizar ou desinstalar um mod. O jogo salvo pode se corromper. Você tem certeza que quer carregar?\n[lightgray]Mods:\n{0} +mod.missing = Esse jogo salvo foi criado antes de você atualizar ou desinstalar um mod. Pode ocorrer uma corrupção no salvamento. Você tem certeza que quer carregar?\n[lightgray]Mods:\n{0} mod.preview.missing = Antes de publicar esse mod na Oficina, você deve adicionar uma imagem de pré-visualização.\nColoque uma imagem com o nome[accent] preview.png[] na pasta do Mod e tente novamente. mod.folder.missing = Somente Mods no formato de pasta serão publicados na Oficina.\nPara converter qualquer Mod em uma pasta, Simplesmente descompacte seu arquivo numa pasta e delete a compactação antiga, então reinicie seu jogo ou recarregue os Mods. +mod.scripts.unsupported = Seu dispositivo não suporta scripts de mods. Alguns mods não funcionarão corretamente. about.button = Sobre name = Nome: @@ -141,6 +155,7 @@ server.kicked.nameEmpty = Você deve ter pelo menos uma letra ou número no nome server.kicked.idInUse = Você ja está neste servidor! Conectar com duas contas não é permitido. server.kicked.customClient = Este servidor não suporta versões customizadas. Baixe a versão original. server.kicked.gameover = Fim de jogo! +server.kicked.serverRestarting = The server is restarting. server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] host.info = The [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguém esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[LIGHT_GRAY]Note: Não há uma lista de servidores automáticos; Se você quer conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. @@ -189,9 +204,9 @@ disconnect.data = Falha ao abrir os dados do mundo! cantconnect = Impossível conectar ([accent]{0}[]). connecting = [accent]Conectando... connecting.data = [accent]Carregando dados do mundo... -server.port = Porte: +server.port = Port: server.addressinuse = Senha em uso! -server.invalidport = Numero de porta invalido! +server.invalidport = Numero de port inválido! server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} save.new = Novo salvamento save.overwrite = Você tem certeza que quer sobrescrever este salvamento? @@ -273,11 +288,11 @@ workshop.error = Erro buscando os detalhes da Oficina: {0} map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados! workshop.menu = Selecione oquê você gostaria de fazer com esse Item. workshop.info = Informação do Item -changelog = Changelog (optional): +changelog = Mudanças (opcional): eula = EULA da Steam -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = você tem certeza de que quer publicar isso?\n\n[lightgray]Primeiramente tenha certeza de que você concorda com o EULA da Oficina, ou seus itens não irão aparecer! +missing = Este item foi deletado ou movido.\n[lightgray]O listamento da oficina foi automaticamente des-ligado. +publishing = [accent]Publicando... +publish.confirm = Você tem certeza de que quer publicar isso?\n\n[lightgray]Primeiramente tenha certeza de que você concorda com o EULA da Oficina, ou seus itens não irão aparecer! publish.error = Erro publicando o Item: {0} steam.error = Falha em iniciar os serviços da Steam.\nError: {0} @@ -364,11 +379,11 @@ toolmode.replaceall = Substituir tudo toolmode.replaceall.description = Substituir todos os blocos no mapa toolmode.orthogonal = Linha reta toolmode.orthogonal.description = Desenha apenas linhas retas. -toolmode.square = Square +toolmode.square = Quadrado toolmode.square.description = Pincel quadrado. toolmode.eraseores = Apagar minérios toolmode.eraseores.description = Apaga apenas minérios. -toolmode.fillteams = Encher times +toolmode.fillteams = Preencher times toolmode.fillteams.description = Muda o time do qual todos os blocos pertencem. toolmode.drawteams = Desenhar times toolmode.drawteams.description = Muda o time do qual o bloco pertence. @@ -490,8 +505,8 @@ zone.tarFields.description = Nos arredores de uma zona de produção de petróle zone.desolateRift.description = Uma zona extremamente perigosa. Recursos abundantes, porém pouco espaço. Alto risco de destruição. Saia o mais rápido possível. Não seja enganado pelo longo espaço de tempo entre os ataques inimigos. zone.nuclearComplex.description = Uma antiga instalação para produção e processamento de tório, reduzido a ruínas.\n[lightgray]Pesquise o tório e seus muitos usos.\n\nO inimigo está presente aqui em grandes números, constantemente à procura de atacantes. zone.fungalPass.description = Uma area de transição entre montanhas altas e baixas, terras cheias de esporos. Uma pequena base de reconhecimento inimiga está localizada aqui.\nDestrua-a.\nUse as unidades crawler e dagger. Destrua os dois núcleos. -zone.impact0078.description = -zone.crags.description = +zone.impact0078.description = +zone.crags.description = settings.language = Idioma settings.data = Dados do jogo @@ -506,7 +521,7 @@ settings.cleardata = Apagar dados... settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar todo os arquivos, incluindo jogos salvos, mapas, teclas personalizadas e desbloqueados.\nQuando apertar 'ok' todos os arquivos serão apagados e o jogo irá sair automaticamente. paused = Pausado -clear = Clear +clear = Limpo banned = [scarlet]Banido yes = Sim no = Não @@ -515,7 +530,7 @@ error.title = [crimson]Ocorreu um Erro. error.crashtitle = Ocorreu um Erro blocks.input = Entrada blocks.output = Saída -blocks.booster = Booster +blocks.booster = Apoio block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Capacidade de Energia blocks.powershot = Energia/tiro @@ -591,12 +606,14 @@ unit.persecond = por segundo unit.timesspeed = x Velocidade unit.percent = % unit.items = itens +unit.thousands = k +unit.millions = m category.general = Geral -category.power = Poder +category.power = Energia category.liquids = Líquidos category.items = Itens -category.crafting = Construindo -category.shooting = Atirando +category.crafting = Entrada/Saída +category.shooting = Atiradores category.optional = Melhoras opcionais setting.landscape.name = Travar panorama setting.shadows.name = Sombras @@ -626,6 +643,7 @@ setting.screenshake.name = Balanço da Tela setting.effects.name = Efeitos setting.destroyedblocks.name = Mostrar Blocos Destruídos setting.conveyorpathfinding.name = Esteiras Encontram Caminho +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Sensibilidade do Controle setting.saveinterval.name = Intervalo de Auto Salvamento setting.seconds = {0} segundos @@ -651,7 +669,7 @@ setting.chatopacity.name = Opacidade do chat setting.lasersopacity.name = Opacidade do laser setting.playerchat.name = Mostrar chat em jogo public.confirm = Você quer fazer sua partida pública?\n[accent]Qualquer um será capaz de entrar na sua partida.\n[lightgray]Isso pode ser mudado depois em Configurações->Jogo->Visibilidade da partida pública. -public.beta = Note that beta versions of the game cannot make public lobbies. +public.beta = Note que as versões beta do jogo não podem fazer salas publicas. uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings... uiscale.cancel = Cancelar e sair setting.bloom.name = Bloom @@ -719,10 +737,10 @@ keybind.zoom_minimap.name = Zoom do minimapa mode.help.title = Descrição dos modos mode.survival.name = Sobrevivência mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. -mode.sandbox.name = Sandbox +mode.sandbox.name = Caixa de areia mode.sandbox.description = Recursos infinitos e sem tempo para ataques. mode.editor.name = Editor -mode.pvp.name = JXJ +mode.pvp.name = JxJ mode.pvp.description = Lutar contra outros jogadores locais. mode.attack.name = Ataque mode.attack.description = Sem hordas, com o objetivo de destruir a base inimiga. @@ -737,6 +755,7 @@ rules.enemyCheat = Recursos de IA Infinitos rules.unitdrops = Inimigos dropam itens rules.unitbuildspeedmultiplier = Multiplicador de velocidade de criação de unidade rules.unithealthmultiplier = Multiplicador de vida de unidade +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Multiplicador da vida de jogador rules.playerdamagemultiplier = Multiplicador do dano de jogador rules.unitdamagemultiplier = Multiplicador de dano de Unidade @@ -805,6 +824,7 @@ mech.trident-ship.name = Tridente mech.trident-ship.weapon = Carga de bombas mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Repetidor de fogo +item.corestorable = [lightgray]Armazenável no núcleo: {0} item.explosiveness = [LIGHT_GRAY]Explosibilidade: {0} item.flammability = [LIGHT_GRAY]Inflamabilidade: {0} item.radioactivity = [LIGHT_GRAY]Radioatividade: {0} @@ -958,6 +978,7 @@ block.mechanical-pump.name = Bomba Mecânica block.item-source.name = Criador de itens block.item-void.name = Destruidor de itens block.liquid-source.name = Criador de líquidos +block.liquid-void.name = Liquid Void block.power-void.name = Anulador de energia block.power-source.name = Criador de energia block.unloader.name = Descarregador @@ -980,9 +1001,9 @@ block.spirit-factory.name = Fábrica de drone de reparo Spirit block.phantom-factory.name = Fábrica de drone de construção Phantom block.wraith-factory.name = Fábrica de lutadores Wraith block.ghoul-factory.name = Fábrica de Bombardeiros Ghoul -block.dagger-factory.name = Fábrica de mech Dagger -block.crawler-factory.name = Fábrica de mech Crawler -block.titan-factory.name = Fábrica de mech titan +block.dagger-factory.name = Fábrica de Mecas Dagger +block.crawler-factory.name = Fábrica de Mecas Crawler +block.titan-factory.name = Fábrica de Mecas Titan block.fortress-factory.name = Fábrica de mech Fortress block.revenant-factory.name = Fábrica de lutadores Revenant block.repair-point.name = Ponto de Reparo @@ -1039,15 +1060,15 @@ unit.eradicator.name = Erradicador unit.lich.name = Lich unit.reaper.name = Ceifador tutorial.next = [lightgray] -tutorial.intro = Você entrou no[scarlet] Tutorial do Mindustry.[]\nComeçe[accent] minerando cobre[]. Toque em um veio de minério de cobre para fazer isso.\n\n[accent]{0}/{1} copper -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.intro = Você entrou no Tutorial do[scarlet] Mindustry.[]\nUse[accent] [[WASD][] para se mover.\n[accent]Roda do mouse[] para aumentar e diminuir o zoom.\nComece[accent] minerando cobre[]. Toque em um veio de minério de cobre para fazer isso.\n\n[accent]{0}/{1} Cobre +tutorial.intro.mobile = Você entrou no Tutorial do[scarlet] Mindustry.[]\nPasse o dedo na tela para se mover.\n[accent]Use os dois dedos [] para alterar o zoom.\nComece[accent] minerando cobre[]. Se aproxime dele, e toque numa veia de cobre perto do seu núcleo.\n\n[accent]{0}/{1} Cobre tutorial.drill = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nColoque uma num veio de cobre. tutorial.drill.mobile = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nToque na aba de brocas no canto inferior direito.\nSelecione a[accent] broca mecânica[].\nToque em um veio de cobre para colocá-la, então pressione a[accent] marca de verificação[] abaixo para confirmar sua seleção.\nPressione o[accent] botão "X"[] para cancelar o posicionamento. tutorial.blockinfo = Cada bloco tem diferentes status. Cada broca pode extrair certos minérios.\nPara checar as informações e os status de um bloco,[accent] toque o botão "?" enquanto o seleciona no menu de construção.[]\n\n[accent]Acesse os status da broca mecânica agora.[] tutorial.conveyor = [accent]Esteiras[] São usadas para transportar itens até o núcleo.\nFaça uma linha de Esteiras da mineradora até o núcleo. tutorial.conveyor.mobile = [accent]Esteiras[] são usadas para transportar itens até o núcleo.\nFaça uma linha de esteiras da broca até o núcleo.\n[accent] Coloque uma linha segurando por alguns segundos[] e arrastando em uma direção.\n\n[accent]{0}/{1} esteiras colocadas em linha\n[accent]0/1 itens entregues tutorial.turret = Estruturas defensivas devem ser construidas para repelir[LIGHT_GRAY] o inimigo[].\nConstrua uma torre dupla perto de sua base. -tutorial.drillturret = Torretas duplas precisam de[accent] cobre[] como munição para atirar.\nColoque uma broca próxima à torre para carregá-la com o cobre minerado. +tutorial.drillturret = Torres duplas precisam de[accent] cobre[] como munição para atirar.\nColoque uma broca próxima à torre para carregá-la com o cobre minerado. tutorial.pause = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione a barra de espaço para pausar. tutorial.pause.mobile = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione este botão no canto superior direito para pausar. tutorial.unpause = Agora pressione novamente a barra de espaço para despausar. @@ -1102,7 +1123,7 @@ unit.revenant.description = Uma matriz de mísseis pesada e flutuante. block.message.description = Armazena uma mensagem. Usado para comunicação entre aliados. block.graphite-press.description = Comprime pedaços de carvão em lâminas de grafite puro. block.multi-press.description = Uma versão melhorada da prensa de grafite. Usa água e energia para processar carvão rápida e eficientemente. -block.silicon-smelter.description = Reduz areia com carvão puro. Produz silício silicio. +block.silicon-smelter.description = Reduz areia a silicio usando carvão puro. Produz silício. block.kiln.description = Derrete chumbo e areia no composto conhecido como metavidro. Requer pequenas quantidades de energia. block.plastanium-compressor.description = Produz plastânio usando petróleo e titânio. block.phase-weaver.description = Produz tecido de fase usando tório radioativo e areia. Requer massivas quantidades de energia para funcionar. @@ -1121,6 +1142,7 @@ block.power-source.description = Infinitivamente da energia. Apenas caixa de are block.item-source.description = Infinivamente da itens. Apenas caixa de areia. block.item-void.description = Destroi qualquer item que entre sem requerir energia. Apenas caixa de areia. block.liquid-source.description = Infinitivamente da Liquidos. Apenas caixa de areia. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo. block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo.\nOcupa múltiplos blocos. block.titanium-wall.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos. @@ -1138,9 +1160,9 @@ block.door-large.description = Uma grande porta. Pode ser aberta e fechada ao to block.mender.description = Periodicamente repara blocos vizinhos. Mantem as defesas reparadas em e entre ondas.\nPode usar silício para aumentar o alcance e a eficiência. block.mend-projector.description = Uma versão melhorada do reparador. Repara blocos vizinhos.\nPode usar tecido de fase para aumentar o alcance e a eficiência. block.overdrive-projector.description = Aumenta a velocidade de construções vizinhas.\nPode usar tecido de fase para aumentar o alcance e a eficiência. -block.force-projector.description = Cria um campo de forca hexagonal em volta de si mesmo, Protegendo construções e unidades dentro de dano por balas. +block.force-projector.description = Cria um campo de força hexagonal ao redor de si, protegendo construções e unidades.\nSuperaquece se suportar muito dano. Pode usar líquidos para evitar superaquecimento. Pode-se usar tecido de fase para aumentar o tamanho do escudo. block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo. -block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionavel. +block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionável. block.titanium-conveyor.description = Bloco de transporte de item avançado. Move itens mais rapidos que esteiras padrões. block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes. block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. @@ -1176,16 +1198,16 @@ block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos qu block.solar-panel.description = Gera pequenas quantidades de energia do sol. block.solar-panel-large.description = Uma versão significantemente mais eficiente que o painel solar padrão. block.thorium-reactor.description = Gera altas quantidades de energia do torio radioativo. Requer resfriamento constante. Vai explodir violentamente Se resfriamento insuficiente for fornecido. -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 = Um gerador avançado, capaz de criar quantidades enormes de energia em seu poder total. Requer uma entrada significativa de energia ao iniciar. block.mechanical-drill.description = Uma broca barata. Quando colocado em blocos apropriados, retira itens em um ritmo lento e indefinitavamente. block.pneumatic-drill.description = Uma broca improvisada que é mais rápida e capaz de processar materiais mais duros usando a pressão do ar block.laser-drill.description = Possibilita a mineração ainda mais rapida usando tecnologia a laser, Mas requer poder adcionalmente torio radioativo pode ser recuperado com essa mineradora block.blast-drill.description = A melhor mineradora. Requer muita energia. -block.water-extractor.description = Extrai água do chão. Use quando não tive nenhum lago proximo -block.cultivator.description = Cultiva o solo com agua para pegar bio materia. block.water-extractor.description = Extrai água subterrânea. Usado em locais sem água superficial disponível. block.cultivator.description = Cultiva pequenas concentrações de esporos na atmosfera em cápsulas prontas. block.oil-extractor.description = Usa altas quantidades de energia para extrair petróleo da areia. Use quando não tiver fontes de petróleo por perto. +block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen. +block.core-foundation.description = The second version of the core. Better armored. Stores more resources. block.core-nucleus.description = A terceira e ultima iteração do núcleo. Extremamente bem armadurada. Guarda quantidades massivas de recursos. block.vault.description = Carrega uma alta quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. diff --git a/core/assets/bundles/bundle_pt.properties b/core/assets/bundles/bundle_pt_PT.properties similarity index 89% rename from core/assets/bundles/bundle_pt.properties rename to core/assets/bundles/bundle_pt_PT.properties index a0300813f5..1375245580 100644 --- a/core/assets/bundles/bundle_pt.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1,4 +1,4 @@ -credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +credits.text = Criado por [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Créditos contributors = Tradutores e contribuidores discord = Junte-se ao Discord do Mindustry! (Lá falamos inglês) @@ -10,7 +10,9 @@ link.dev-builds.description = Desenvolvimentos Instáveis link.trello.description = Trello Oficial para Atualizações Planejadas link.itch.io.description = Pagina da Itch.io com os Descarregamentos link.google-play.description = Listamento do google play store +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Wiki oficial do Mindustry +link.feathub.description = Suggest new features linkfail = Falha ao abrir a ligação\nO Url foi copiado screenshot = Screenshot gravado para {0} screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura. @@ -18,28 +20,39 @@ gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [YELLOW]Novo recorde! copied = Copiado. + load.sound = Sons load.map = Mapas load.image = Imagens load.content = Conteúdo load.system = Sistema load.mod = Mods +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Esquema schematic.add = Gravar Esquema... schematics = Esquemas -schematic.replace = A schematic by that name already exists. Replace it? +schematic.replace = Um esquema com esse nome já existe. Deseja substituí-lo? schematic.import = Importar Esquema... schematic.exportfile = Exportar Ficheiro schematic.importfile = Importar Ficheiro -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Tornar Esquema +schematic.browseworkshop = Pesquisar no Workshop +schematic.copy = Copiar para a área de transferência +schematic.copy.import = Importar da área de transferência +schematic.shareworkshop = Partilhar na Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Rodar Esquema schematic.saved = Esquema gravado. schematic.delete.confirm = Este esquema irá ser completamente apagado. schematic.rename = Renomear Esquema schematic.info = {0}x{1}, {2} blocos + stat.wave = Hordas derrotadas:[accent] {0} stat.enemiesDestroyed = Inimigos Destruídos:[accent] {0} stat.built = Construções construídas:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = Construções destruídas:[accent] {0} stat.deconstructed = Construções desconstruídas:[accent] {0} stat.delivered = Recursos lançados: stat.rank = Rank Final: [accent]{0} + launcheditems = [accent]Itens lançados launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? @@ -56,7 +70,7 @@ level.mode = Modo de Jogo: showagain = Não mostrar na proxima sessão coreattack = < O núcleo está sobre ataque! > nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nANIQUILAÇÃO IMINENTE -database = banco do núcleo +database = Banco do núcleo savegame = Gravar Jogo loadgame = Carregar Jogo joingame = Entrar no Jogo @@ -74,36 +88,45 @@ maps.browse = Pesquisar mapas continue = Continuar maps.none = [LIGHT_GRAY]Nenhum Mapa Encontrado! invalid = Inválido +pickcolor = Pick Color preparingconfig = Preparando configuração preparingcontent = Preparando conteúdo uploadingcontent = Enviando conteúdo uploadingpreviewfile = Enviando ficheiro de pré-visualização committingchanges = Enviando mudanças done = Feito -feature.unsupported = Your device does not support this feature. -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. +feature.unsupported = O teu dispositivos não suporta esta característica. + +mods.alphainfo = Lembre-se de que os mods estão em alfa, e [scarlet] pode estar cheio de falhas[].\nReporta qualquer problema que encontres no the Mindustry GitHub ou Discord. mods.alpha = [accent](Alpha) mods = Mods -mods.none = [LIGHT_GRAY]No mods found! -mods.guide = Modding Guide -mods.report = Report Bug +mods.none = [LIGHT_GRAY]Mods não encontrados! +mods.guide = Guia de mods +mods.report = Reportar Bug mods.openfolder = Open Mod Folder mod.enabled = [lightgray]Ativado mod.disabled = [scarlet]Desativado mod.disable = Desativar -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.delete.error = Incapaz de apagar o mod. Ficheiro já em uso. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.missingdependencies = [scarlet]Dependências ausentes: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. +mod.nowdisabled = [scarlet]Mod '{0}' está faltando dependências:[accent] {1}\n[lightgray]Esses mods precisam ser baixados primeiro. NEste mod será automaticamente desativado mod.enable = Ativar -mod.requiresrestart = The game will now close to apply the mod changes. +mod.requiresrestart = O jogo será fechado agora para aplicar as alterações no mod. mod.reloadrequired = [scarlet]Reload Required mod.import = Importar Mod -mod.import.github = Importar Mod da GitHub +mod.import.github = Importar Mod pelo GitHub +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = Este mod irá ser apagado. mod.author = [LIGHT_GRAY]Autor:[] {0} -mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.missing = Este save contém mods que foram recentemente atualizados ou que não estão mais instalados. Ao guardar pode ocorreu corrupção. Tem certeza de que deseja carregá-lo?\n[lightgray]Mods:\n{0} +mod.preview.missing = Antes de publicar este mod no workshop, você deve adicionar uma visualização da imagem.\nNome da imagem -> [accent] preview.png[] na pasta de mods e tenta outra vez. +mod.folder.missing = Apenas mods na pasta podem ser publicados no Workshop.\nPara converter qualquer mod para uma pasta, simplesmentes descomprime os ficheiros para a pasta e apague o ficheiro zip antigo, e depois reinicia o jogo ou os teus mods. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. @@ -132,8 +155,9 @@ server.kicked.nameEmpty = Você deve ter pelo menos uma letra ou número no nome server.kicked.idInUse = Você ja está neste servidor! Conectar com duas contas não é permitido. server.kicked.customClient = Este servidor não suporta versões customizadas. Baixe a versão original. server.kicked.gameover = Fim de jogo! +server.kicked.serverRestarting = The server is restarting. server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] -host.info = The [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall +host.info = O [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[LIGHT_GRAY]Note: Não há uma lista de servidores automáticos; Se você quer conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. hostserver = Hospedar servidor invitefriends = Convidar amigos @@ -235,12 +259,12 @@ classic.export.text = [accent]Mindustry[] acabou de ter uma grande atualização quit.confirm = Você tem certeza que quer sair? quit.confirm.tutorial = Você tem certeza você sabe o que você esta fazendo?\nO tutorial pode ser refeito nas [accent] Configurações->Jogo->Refazer Tutorial.[] loading = [accent]Carregando... -reloading = [accent]Reloading Mods... +reloading = [accent]Recarregar mods... saving = [accent]Gravando... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][] para apagar o plano +selectschematic = [accent][[{0}][] para selecionar+copy +pausebuilding = [accent][[{0}][] para pausar construção +resumebuilding = [scarlet][[{0}][] para resumir construção wave = [accent]Horda {0} wave.waiting = Horda em {0} wave.waveInProgress = [LIGHT_GRAY]Horda Em Progresso @@ -262,15 +286,16 @@ map.invalid = Erro ao carregar o mapa: Ficheiro de mapa invalido ou corrupto. workshop.update = Atualizar Item workshop.error = Error fetching workshop details: {0} map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados! -workshop.menu = Select what you would like to do with this item. +workshop.menu = Seleciona o que tu gostarias de fazer com este item. workshop.info = Item Info changelog = Changelog (optional): eula = EULA do Steam -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +missing = Este item foi apagodo ou movido.\n[lightgray]A listagem da oficina foi automaticamente desassociada. +publishing = [accent]A publicar... +publish.confirm = Tens a certeza que queres publicar isto?\n\n[lightgray]Certifique-se de concordar com o EULA do workshpop primeiro, ou seus itens não aparecerão! +publish.error = Erro ao publicao os items: {0} +steam.error = Falha ao iniciar os serviços da Steam.\nError: {0} + editor.brush = Pincel editor.openin = Abrir no Editor editor.oregen = Geração de minério @@ -347,6 +372,7 @@ editor.overwrite = [accent]Aviso!\nIsso Substitui um mapa existente. editor.overwrite.confirm = [scarlet]Aviso![] Um mapa com esse nome já existe. Tem certeza que deseja substituir? editor.exists = Já existe um mapa com este nome. editor.selectmap = Selecione uma mapa para carregar: + toolmode.replace = Substituir toolmode.replace.description = Desenha apenas em blocos sólidos. toolmode.replaceall = Substituir tudo @@ -361,6 +387,7 @@ toolmode.fillteams = Encher times toolmode.fillteams.description = Muda o time do qual todos os blocos pertencem. toolmode.drawteams = Desenhar times toolmode.drawteams.description = Muda o time do qual o bloco pertence. + filters.empty = [LIGHT_GRAY]Sem filtro! Adicione um usando o botão abaixo. filter.distort = Distorcedor filter.noise = Geração aleatória @@ -392,6 +419,7 @@ filter.option.floor2 = Chão secundário filter.option.threshold2 = Margem secundária filter.option.radius = Raio filter.option.percentile = Percentual + width = Largura: height = Altura: menu = Menu @@ -407,13 +435,14 @@ tutorial = Tutorial tutorial.retake = Refazer Tutorial editor = Editor mapeditor = Editor de mapa + abandon = Abandonar abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. locked = Trancado complete = [LIGHT_GRAY]Completo: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.wave = Ronda alcançada {0} / {1} +requirement.core = Destruir Núcleo Inimigo em {0} +requirement.unlock = Destrava {0} resume = Resumir Zona:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Melhor: {0} launch = Lançar @@ -424,19 +453,20 @@ launch.confirm = Isto vai lançar todos os seus recursos no seu núcleo.\nVoce n launch.skip.confirm = Se você pular a horda agora, você não será capaz de lançar até hordas mais avançadas. uncover = Descobrir configure = Configurar carregamento -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Blocos banidos +addall = Adiciona tudo configure.locked = [LIGHT_GRAY]Alcançe a horda {0}\npara configurar o carregamento. configure.invalid = A quantidade deve ser um número entre 0 e {0}. zone.unlocked = [LIGHT_GRAY]{0} Desbloqueado. zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.config.unlocked = Loadout destravada:[lightgray]\n{0} zone.resources = Recursos detectados: zone.objective = [lightgray]Objetivo: [accent]{0} zone.objective.survival = Sobreviver zone.objective.attack = Destruir o núcleo inimigo add = Adicionar... boss.health = Saúde do chefe + connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} error.unreachable = Servidor inalcançável. error.invalidaddress = Endereço inválido. @@ -447,6 +477,7 @@ error.mapnotfound = Ficheiro de mapa não encontrado! error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. error.bloom = Falha ao inicializar bloom.\nSeu aparelho talvez não o suporte. + zone.groundZero.name = Marco zero zone.desertWastes.name = Ruínas do Deserto zone.craters.name = As crateras @@ -461,6 +492,7 @@ zone.saltFlats.name = Planícies de sal zone.impact0078.name = Impacto 0078 zone.crags.name = Penhascos zone.fungalPass.name = Passagem Fúngica + zone.groundZero.description = Uma ótima localização para começar de novo. Baixa ameaça inimiga. Poucos recursos.\nColete o máximo de chumbo e cobre possível.\nContinue! zone.frozenForest.description = Até aqui, perto das montanhas, os esporos se espalharam. As baixas temperaturas não podem contê-los para sempre.\n\nComeçe a busca por energia. Construa geradores à combustão. Aprenda a usar os reparadores (menders). zone.desertWastes.description = Estas ruínas são vastas, imprevisíveis, e cruzadas por estruturas abandonadas.\nCarvão está presente na região. O queime por energia, ou sintetize grafite.\n\n[lightgray]Este local de pouso não pode ser garantido. @@ -475,10 +507,12 @@ zone.nuclearComplex.description = Uma antiga instalação para produção e proc zone.fungalPass.description = Uma area de transição entre montanhas altas e baixas, terras cheias de esporos. Uma pequena base de reconhecimento inimiga está localizada aqui.\nDestrua-a.\nUse as unidades crawler e dagger. Destrua os dois núcleos. zone.impact0078.description = zone.crags.description = + settings.language = Linguagem settings.data = Dados do jogo settings.reset = Restaurar Padrões settings.rebind = Religar +settings.resetKey = Reset settings.controls = Controles settings.game = Jogo settings.sound = Som @@ -487,8 +521,8 @@ settings.cleardata = Apagar dados... settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. paused = Pausado -clear = Clear -banned = [scarlet]Banned +clear = Limpar +banned = [scarlet]Banido yes = Sim no = Não info.title = [accent]Informação @@ -529,6 +563,7 @@ blocks.inaccuracy = Imprecisão blocks.shots = Tiros blocks.reload = Tiros por segundo blocks.ammo = Munição + bar.drilltierreq = Broca melhor necessária. bar.drillspeed = Velocidade da broca: {0}/s bar.pumpspeed = Pump Speed: {0}/s @@ -544,6 +579,9 @@ bar.heat = Aquecimento bar.power = Poder bar.progress = Progresso da construção bar.spawned = Unidades: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] dano bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos bullet.incendiary = [stat]Incendiário @@ -555,6 +593,7 @@ bullet.freezing = [stat]Congelamento bullet.tarred = [stat]Grudento bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição bullet.reload = [stat]{0}[lightgray]x cadência de tiro + unit.blocks = Blocos unit.powersecond = Unidades de energia/segundo unit.liquidsecond = Unidades de líquido/segundo @@ -567,6 +606,8 @@ unit.persecond = por segundo unit.timesspeed = x Velocidade unit.percent = % unit.items = itens +unit.thousands = k +unit.millions = mil category.general = Geral category.power = Poder category.liquids = Líquidos @@ -579,6 +620,7 @@ setting.shadows.name = Sombras setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Filtragem linear setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Água animada setting.animatedshields.name = Escudos animados setting.antialias.name = Filtro suavizante[LIGHT_GRAY] (reinicialização requerida)[] @@ -601,12 +643,16 @@ setting.screenshake.name = Balanço do Ecrã setting.effects.name = Efeitos setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Sensibilidade do Controle setting.saveinterval.name = Intervalo de autogravamento setting.seconds = {0} Segundos +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Ecrã inteiro setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reiniciar) setting.fps.name = Mostrar FPS +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelizado [LIGHT_GRAY](Pode diminuir a performace) setting.minimap.name = Mostrar minimapa @@ -620,10 +666,10 @@ setting.crashreport.name = Enviar denuncias de crash anonimas setting.savecreate.name = Criar gravamentos automaticamente setting.publichost.name = Visibilidade do jogo público setting.chatopacity.name = Opacidade do chat -setting.lasersopacity.name = Power Laser Opacity +setting.lasersopacity.name = Opacidade do Power Laser setting.playerchat.name = Mostrar chat em jogo -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. +public.confirm = Queres que o teu jogo fique publico?\n[accent]Qualquer jogador vai conseguir juntar-se ao teu jogo.\n[lightgray]Isto pode ser alterado mais tarde in Settings->Game->Public Game Visibility. +public.beta = Observe que as versões beta do jogo não podem criar lobbies públicos. uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings... uiscale.cancel = Cancelar e sair setting.bloom.name = Bloom @@ -635,18 +681,38 @@ category.multiplayer.name = Multijogador command.attack = Atacar command.rally = Reunir command.retreat = Recuar +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Limpar Edificio keybind.press = Pressione uma tecla... keybind.press.axis = Pressione uma Axis ou tecla... keybind.screenshot.name = Captura do mapa +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = mover_x keybind.move_y.name = mover_y -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Correr +keybind.schematic_select.name = Selecionar região +keybind.schematic_menu.name = Menu esquemático +keybind.schematic_flip_x.name = Rodar esquema X +keybind.schematic_flip_y.name = Rodar esquema Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Alterar ecrã inteiro -keybind.select.name = selecionar +keybind.select.name = Selecionar keybind.diagonal_placement.name = Colocação diagonal keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco @@ -655,21 +721,20 @@ keybind.shoot.name = Atirar keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pausar -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Pausar/Resumir construção keybind.minimap.name = Minimapa -keybind.dash.name = Correr keybind.chat.name = Conversa keybind.player_list.name = Lista_de_jogadores keybind.console.name = console keybind.rotate.name = Girar -keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.rotateplaced.name = Rodar existente (Hold) keybind.toggle_menus.name = Ativar menus -keybind.chat_history_prev.name = Historico do chat anterior -keybind.chat_history_next.name = Historico do proximo chat +keybind.chat_history_prev.name = Histórico do chat anterior +keybind.chat_history_next.name = Histórico do proximo chat keybind.chat_scroll.name = Rolar chat keybind.drop_unit.name = Soltar unidade keybind.zoom_minimap.name = Zoom do minimapa -mode.help.title = Descrição dos modos +mode.help.title = Descrição dos mods mode.survival.name = Sobrevivência mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. mode.sandbox.name = Sandbox @@ -680,7 +745,9 @@ mode.pvp.description = Lutar contra outros jogadores locais. mode.attack.name = Ataque mode.attack.description = Sem hordas, com o objetivo de destruir a base inimiga. mode.custom = Regras personalizadas + rules.infiniteresources = Recursos infinitos +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Tempo de horda rules.waves = Hordas rules.attack = Modo de ataque @@ -688,6 +755,7 @@ rules.enemyCheat = Recursos de IA Infinitos rules.unitdrops = Unidade solta rules.unitbuildspeedmultiplier = Multiplicador de velocidade de criação de unidade rules.unithealthmultiplier = Multiplicador de vida de unidade +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Multiplicador da vida de jogador rules.playerdamagemultiplier = Multiplicador do dano de jogador rules.unitdamagemultiplier = Multiplicador de dano de Unidade @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = Recursos e Construções rules.title.player = Jogadores rules.title.enemy = Inimigos rules.title.unit = Unidades +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Itens content.liquid.name = Liquidos content.unit.name = Unidades @@ -752,6 +824,7 @@ mech.trident-ship.name = Tridente mech.trident-ship.weapon = Carga de bombas mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Repetidor de fogo +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [LIGHT_GRAY]Explosibilidade: {0} item.flammability = [LIGHT_GRAY]Inflamabilidade: {0} item.radioactivity = [LIGHT_GRAY]Radioatividade: {0} @@ -767,6 +840,7 @@ mech.buildspeed = [LIGHT_GRAY]Velocidade de construção: {0}% liquid.heatcapacity = [LIGHT_GRAY]Capacidade de aquecimento: {0} liquid.viscosity = [LIGHT_GRAY]Viscosidade: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} + block.sand-boulder.name = Pedregulho de areia block.grass.name = Grama block.salt.name = Sal @@ -865,6 +939,8 @@ block.distributor.name = Distribuidor block.sorter.name = Ordenador block.inverted-sorter.name = Inverted Sorter block.message.name = Mensagem +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Portão Sobrecarregado block.silicon-smelter.name = Fundidora de silicio block.phase-weaver.name = Palheta de fase @@ -878,6 +954,7 @@ block.coal-centrifuge.name = Centrifuga de carvão block.power-node.name = Célula de energia block.power-node-large.name = Célula de energia Grande block.surge-tower.name = Torre de surto +block.diode.name = Battery Diode block.battery.name = Bateria block.battery-large.name = Bateria Grande block.combustion-generator.name = Gerador a combustão @@ -901,6 +978,7 @@ block.mechanical-pump.name = Bomba Mecânica block.item-source.name = Criador de itens block.item-void.name = Destruidor de itens block.liquid-source.name = Criador de líquidos +block.liquid-void.name = Liquid Void block.power-void.name = Anulador de energia block.power-source.name = Criador de energia block.unloader.name = Descarregador @@ -930,6 +1008,7 @@ block.fortress-factory.name = Fábrica de mech Fortress block.revenant-factory.name = Fábrica de lutadores Revenant block.repair-point.name = Ponto de Reparo block.pulse-conduit.name = Cano de Pulso +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Cano de Fase block.liquid-router.name = Roteador de Líquido block.liquid-tank.name = Tanque de Líquido @@ -981,8 +1060,8 @@ unit.eradicator.name = Erradicador unit.lich.name = Lich unit.reaper.name = Ceifador tutorial.next = [lightgray] -tutorial.intro = Você entrou no[scarlet] Tutorial do Mindustry.[]\nComeçe[accent] minerando cobre[]. Toque em um veio de minério de cobre para fazer isso.\n\n[accent]{0}/{1} copper -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.intro = Entraste no[scarlet] Tutorial do Mindustry.[]\nComeçe[accent] minerando cobre[]. Toque em um veio de minério de cobre para fazer isso.\n\n[accent]{0}/{1} copper +tutorial.intro.mobile = Entraste no[scarlet] Mindustry Tutorial.[]\nPasse o dedo na tela para mover.\n[accent]Use 2 dedos [] para manipular o zoom.\nComeça por by[accent] minerar cobre[].Aproxime-se dele e toque uma veia de minério de cobre perto do seu núcleo para fazer isso.\n\n[accent]{0}/{1} copper tutorial.drill = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nColoque uma num veio de cobre. tutorial.drill.mobile = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nToque na aba de brocas no canto inferior direito.\nSelecione a[accent] broca mecânica[].\nToque em um veio de cobre para colocá-la, então pressione a[accent] marca de verificação[] abaixo para confirmar sua seleção.\nPressione o[accent] botão "X"[] para cancelar o posicionamento. tutorial.blockinfo = Cada bloco tem diferentes status. Cada broca pode extrair certos minérios.\nPara checar as informações e os status de um bloco,[accent] toque o botão "?" enquanto o seleciona no menu de construção.[]\n\n[accent]Acesse os status da broca mecânica agora.[] @@ -1001,6 +1080,7 @@ tutorial.deposit = Deposite itens em blocos arrastando da sua nave até o bloco. tutorial.waves = O[LIGHT_GRAY] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Construa mais torretas. tutorial.waves.mobile = O[lightgray] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Seu drone vai atirar nos inimigos automaticamente.\nConstrua mais torretas e brocas. Minere mais cobre. tutorial.launch = Quando você atinge uma horda específica, Você é capaz de[accent] lançar o núcleo[], deixando suas defesas para trás e[accent] obtendo todos os recursos em seu núcleo.[]\nEstes recursos podem ser usados para pesquisar novas tecnologias.\n\n[accent]Pressione o botão lançar. + item.copper.description = O material mais básico. Usado em todos os tipos de blocos. item.lead.description = Material de começo basico. usado extensivamente em blocos de transporte de líquidos e eletrônicos. item.metaglass.description = Composto de vidro super resistente. Extensivamente usado para distribuição e armazenagem de líquidos. @@ -1062,6 +1142,7 @@ block.power-source.description = Infinitivamente da energia. Apenas caixa de are block.item-source.description = Infinivamente da itens. Apenas caixa de areia. block.item-void.description = Destroi qualquer item que entre sem requerir energia. Apenas caixa de areia. block.liquid-source.description = Infinitivamente da Liquidos. Apenas caixa de areia. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo. block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo.\nOcupa múltiplos blocos. block.titanium-wall.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = Uma bomba avançada. Bombeia mais líquido, mas block.thermal-pump.description = A bomba final. block.conduit.description = Bloco básico de transporte de líquidos. Move líquidos para a frente. Usado em conjunto com bombas e outros canos. block.pulse-conduit.description = Bloco avancado de transporte de liquido. Transporta liquidos mais rápido e armazena mais que os canos padrões. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Aceita liquidos de uma direcão e os joga em 3 direções igualmente. Pode armazenar uma certa quantidade de liquido. Util para espalhar liquidos de uma fonte para multiplos alvos. block.liquid-tank.description = Armazena grandes quantidades de liquido. Use quando a demanda de materiais não for constante ou para guardar itens para resfriar blocos vitais. block.liquid-junction.description = Age como uma ponte para dois canos que se cruzam. Útil em situações em que há dois cano carregando liquidos diferentes até localizações diferentes. @@ -1105,6 +1187,7 @@ block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa e block.power-node.description = Transmite energia para células conectadas. A célula vai receber energia ou alimentar qualquer bloco adjacente. block.power-node-large.description = Uma célula de energia avançada com maior alcance e mais conexões. block.surge-tower.description = Uma célula de energia com um extremo alcance mas com menos conexões disponíveis. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Armazena energia em tempos de energia excedente. Libera energia em tempos de déficit. block.battery-large.description = Guarda muito mais energia que uma beteria comum. block.combustion-generator.description = Gera energia usando combustível ou petróleo. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index ed7294fa27..40c86a18b1 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1247,4 +1247,4 @@ block.tau-mech-pad.description = Обеспечивает превращение block.omega-mech-pad.description = Обеспечивает превращение в тяжелобронированный ракетный мех.\nИспользуйте, нажав, стоя на нём. block.javelin-ship-pad.description = Обеспечивает превращение в быстрый перехватчик в лёгкой броне.\nИспользуйте, нажав, стоя на нём. block.trident-ship-pad.description = Обеспечивает превращение в тяжёлый бомбардировщик поддержки.\nИспользуйте, нажав, стоя на нём. -block.glaive-ship-pad.description = Обеспечивает превращение в большой, хорошо бронированный боевой корабль.\nИспользуйте, нажав, стоя на нём. +block.glaive-ship-pad.description = Обеспечивает превращение в большой, хорошо бронированный боевой корабль.\nИспользуйте, нажав, стоя на нём. \ No newline at end of file diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 13ad6cdfae..429fe7df5d 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -10,7 +10,9 @@ link.dev-builds.description = Unstable development builds link.trello.description = Officiell Trello tavla för plannerade funktioner link.itch.io.description = itch.io sida med nedladdningar link.google-play.description = Mindustry på Google Play +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Officiell wiki-sida för Mindustry +link.feathub.description = Suggest new features linkfail = Kunde inte öppna länken!\nURL:en har kopierats till ditt urklipp. screenshot = Skärmdump har sparats till {0} screenshot.invalid = Karta för stor, potentiellt inte tillräckligt minne för . @@ -18,12 +20,22 @@ gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]Nytt rekord! copied = Kopierad. + load.sound = Ljud load.map = Kartor load.image = Bilder load.content = Innehåll load.system = System load.mod = Mods +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -40,6 +52,7 @@ schematic.saved = Schematic saved. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks + stat.wave = Besegrade vågor:[accent] {0} stat.enemiesDestroyed = Besegrade fiender:[accent] {0} stat.built = Buildings Built:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: stat.rank = Final Rank: [accent]{0} + launcheditems = [accent]Launched Items launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Are you sure you want to delete the map "[accent]{0}[]"? @@ -74,6 +88,7 @@ maps.browse = Bläddra bland kartor continue = Fortsätt maps.none = [lightgray]Inga kartor hittade! invalid = Ogiltig +pickcolor = Pick Color preparingconfig = Förbereder konfiguration preparingcontent = Förbereder innehåll uploadingcontent = Laddar upp innehåll @@ -81,6 +96,7 @@ uploadingpreviewfile = Laddar upp förhandsgranskningsfil committingchanges = Comitting Changes done = Klar feature.unsupported = Your device does not support this feature. + mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. mods.alpha = [accent](Alpha) mods = Mods @@ -92,18 +108,25 @@ mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required mod.import = Import Mod mod.import.github = Import GitHub Mod +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = This mod will be deleted. mod.author = [LIGHT_GRAY]Author:[] {0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Om name = Namn: noname = Välj ett[accent] namn[] först. @@ -132,6 +155,7 @@ server.kicked.nameEmpty = Ditt namn är ogiltigt. server.kicked.idInUse = Du är redan på den här servern! Det är inte tillåtet att koppla med två konton. server.kicked.customClient = This server does not support custom builds. Ladda ned en officiell verision. server.kicked.gameover = Game over! +server.kicked.serverRestarting = The server is restarting. server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. @@ -271,6 +295,7 @@ publishing = [accent]Publishing... publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.error = Error publishing item: {0} steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = Pensel editor.openin = Open In Editor editor.oregen = Ore Generation @@ -347,6 +372,7 @@ 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.exists = A map with this name already exists. editor.selectmap = Select a map to load: + toolmode.replace = Byt ut toolmode.replace.description = Draws only on solid blocks. toolmode.replaceall = Byt ut alla @@ -361,6 +387,7 @@ toolmode.fillteams = Fyll Lag toolmode.fillteams.description = Fill teams instead of blocks. toolmode.drawteams = Rita Lag toolmode.drawteams.description = Draw teams instead of blocks. + filters.empty = [lightgray]No filters! Add one with the button below. filter.distort = Distort filter.noise = Brus @@ -392,6 +419,7 @@ filter.option.floor2 = Secondary Floor filter.option.threshold2 = Secondary Threshold filter.option.radius = Radie filter.option.percentile = Percentile + width = Bredd: height = Höjd: menu = Meny @@ -407,6 +435,7 @@ tutorial = Tutorial tutorial.retake = Ta Om Tutorial editor = Editor mapeditor = Map Editor + abandon = Ge upp abandon.text = Zonen och alla dess resurser förloras till fienden. locked = Låst @@ -437,6 +466,7 @@ zone.objective.survival = Survive zone.objective.attack = Destroy Enemy Core add = Lägg till... boss.health = Boss Health + connectfail = [crimson]Connection error:\n\n[accent]{0} error.unreachable = Server unreachable.\nIs the address spelled correctly? error.invalidaddress = Ogiltig adress. @@ -447,6 +477,7 @@ error.mapnotfound = Map file not found! error.io = Network I/O error. error.any = Okänt nätverksfel. error.bloom = Failed to initialize bloom.\nYour device may not support it. + zone.groundZero.name = Ground Zero zone.desertWastes.name = Desert Wastes zone.craters.name = Kratrar @@ -461,6 +492,7 @@ zone.saltFlats.name = Salt Flats zone.impact0078.name = Impact 0078 zone.crags.name = Crags 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.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.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. @@ -475,10 +507,12 @@ 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.impact0078.description = zone.crags.description = + settings.language = Språk settings.data = Game Data settings.reset = Återställ till Standardvärden settings.rebind = Byt +settings.resetKey = Reset settings.controls = Kontroller settings.game = Spel settings.sound = Ljud @@ -529,6 +563,7 @@ blocks.inaccuracy = Inaccuracy blocks.shots = Skott blocks.reload = Shots/Second blocks.ammo = Ammunition + bar.drilltierreq = Bättre Borr Krävs bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s @@ -544,6 +579,9 @@ bar.heat = Hetta bar.power = Power bar.progress = Build Progress bar.spawned = Units: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] skada bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary @@ -555,6 +593,7 @@ bullet.freezing = [stat]freezing bullet.tarred = [stat]tarred bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.reload = [stat]{0}[lightgray]x fire rate + unit.blocks = block unit.powersecond = power units/second unit.liquidsecond = liquid units/second @@ -567,6 +606,8 @@ unit.persecond = /sek unit.timesspeed = x hastighet unit.percent = % unit.items = föremål +unit.thousands = k +unit.millions = mil category.general = Allmänt category.power = Energi category.liquids = Vätskor @@ -579,6 +620,7 @@ setting.shadows.name = Skuggor setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animerat Vatten setting.animatedshields.name = Animerade Sköldar setting.antialias.name = Antialias[lightgray] (requires restart)[] @@ -601,12 +643,16 @@ setting.screenshake.name = Skärmskak setting.effects.name = Visa Effekter setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Save Interval setting.seconds = {0} Sekunder +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullskärm setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) setting.fps.name = Show FPS +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixellera[lightgray] (disables animations) setting.minimap.name = Visa Minikarta @@ -635,16 +681,36 @@ category.multiplayer.name = Multiplayer command.attack = Attack command.rally = Rally command.retreat = Retreat +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Clear Building keybind.press = Press a key... keybind.press.axis = Press an axis or key... keybind.screenshot.name = Map Screenshot +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Move x keybind.move_y.name = Move y +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Dash keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_y.name = Flip Schematic Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Toggle Fullscreen keybind.select.name = Select/Shoot keybind.diagonal_placement.name = Diagonal Placement @@ -657,7 +723,6 @@ keybind.menu.name = Menu keybind.pause.name = Pause keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap -keybind.dash.name = Dash keybind.chat.name = Chat keybind.player_list.name = Player list keybind.console.name = Console @@ -680,7 +745,9 @@ mode.pvp.description = Fight against other players locally.\n[gray]Requires at l 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.custom = Custom Rules + rules.infiniteresources = Infinite Resources +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Vågtimer rules.waves = Vågor rules.attack = Attack Mode @@ -688,6 +755,7 @@ rules.enemyCheat = Infinite AI (Red Team) Resources rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Player Health Multiplier rules.playerdamagemultiplier = Player Damage Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = Resources & Building rules.title.player = Spelare rules.title.enemy = Fiender rules.title.unit = Units +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Föremål content.liquid.name = Vätskor content.unit.name = Units @@ -752,6 +824,7 @@ mech.trident-ship.name = Treudd mech.trident-ship.weapon = Bomb Bay mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Flame Repeater +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% @@ -767,6 +840,7 @@ mech.buildspeed = [lightgray]Building Speed: {0}% liquid.heatcapacity = [lightgray]Heat Capacity: {0} liquid.viscosity = [lightgray]Viskositet: {0} liquid.temperature = [lightgray]Temperatur: {0} + block.sand-boulder.name = Sandbumling block.grass.name = Gräs block.salt.name = Salt @@ -865,6 +939,8 @@ block.distributor.name = Distributor block.sorter.name = Sorterare block.inverted-sorter.name = Inverted Sorter block.message.name = Meddelande +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Överflödesgrind block.silicon-smelter.name = Kiselsmältare block.phase-weaver.name = Phase Weaver @@ -878,6 +954,7 @@ block.coal-centrifuge.name = Kolcentrifug block.power-node.name = Energinod block.power-node-large.name = Stor Energinod block.surge-tower.name = Surge Tower +block.diode.name = Battery Diode block.battery.name = Batteri block.battery-large.name = Stort Batteri block.combustion-generator.name = Combustion Generator @@ -901,6 +978,7 @@ block.mechanical-pump.name = Mechanical Pump block.item-source.name = Föremålskälla block.item-void.name = Föremålsförstörare block.liquid-source.name = Vätskekälla +block.liquid-void.name = Liquid Void block.power-void.name = Energiätare block.power-source.name = Energikälla block.unloader.name = Urladdare @@ -930,6 +1008,7 @@ block.fortress-factory.name = Fortress Mech Factory block.revenant-factory.name = Revenant Fighter Factory block.repair-point.name = Repairationspunkt block.pulse-conduit.name = Pulse Conduit +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Phase Conduit block.liquid-router.name = Liquid Router block.liquid-tank.name = Vätsketank @@ -1001,6 +1080,7 @@ 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.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. + 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.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. @@ -1062,6 +1142,7 @@ block.power-source.description = Infinitely outputs power. Sandbox only. block.item-source.description = Infinitely outputs items. Sandbox only. block.item-void.description = Destroys any items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = An advanced pump. Pumps more liquid, but require block.thermal-pump.description = The ultimate pump. block.conduit.description = Basic liquid transport block. Moves liquids forward. Used in conjunction with pumps and other conduits. block.pulse-conduit.description = An advanced liquid transport block. Transports liquids faster and stores more than standard conduits. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. block.liquid-tank.description = Stores a large amount of liquids. Use for creating buffers in situations with non-constant demand of materials or as a safeguard for cooling vital blocks. block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. @@ -1105,6 +1187,7 @@ block.phase-conduit.description = Advanced liquid transport block. Uses power to block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. block.power-node-large.description = An advanced power node with greater range and more connections. block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 90b72d7312..9a8e9ac61c 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -10,7 +10,9 @@ link.dev-builds.description = เวอร์ชั่นระหว่าง link.trello.description = Official Trello board for planned features link.itch.io.description = itch.io page with PC downloads link.google-play.description = Google Play store listing +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Official Mindustry wiki +link.feathub.description = Suggest new features linkfail = ไม่สามารถเปิดลิ้งค์ได้\nคัดลอก URL ลงในคลิปบอร์ดแล้ว screenshot = Screenshot บันทึกที่ {0} screenshot.invalid = แมพใหญ่เกินไป, หน่วยความจำอาจจะไม่พอสำหรับ screenshot. @@ -25,11 +27,19 @@ load.image = รูป load.content = Content load.system = ระบบ load.mod = มอด +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates schematic = Schematic schematic.add = กำลังบันทึก Schematic... schematics = Schematics -schematic.replace = มี schematic ที่ใช้ชื่อนี้แล้ว. แทนที่มัน? +schematic.replace = มี schematic ที่ใช้ชื่อนี้แล้ว. แทนที่เลยไม? schematic.import = นำเข้า Schematic... schematic.exportfile = ส่งออก File schematic.importfile = นำเข้า File @@ -60,7 +70,7 @@ level.mode = เกมโหมด: showagain = ไม่แสดงอีกในครั้งต่อไป coreattack = < Core กำลังถูกโจมตี! > nearpoint = [[ [scarlet]ออกจากดรอปพอยท์ด่วน IMMEDIATELY[] ]\nการทำลายล้างกำลังใกล้เข้ามา -database = Core Database +database = ฐานข้อมูหลัง savegame = เซฟเกม loadgame = โหลดเกม joingame = เข้าร่วมเกม @@ -78,6 +88,7 @@ maps.browse = ค้นหาแมพ continue = ต่อ maps.none = [lightgray]ไม่มีแมพ! invalid = ไม่ถูกต้อง +pickcolor = Pick Color preparingconfig = กำลังเตรียม Config preparingcontent = กำลังเตรียม Content uploadingcontent = กำลังอัปโหลด Content @@ -97,18 +108,24 @@ mod.enabled = [lightgray]เปิดใช้งาน mod.disabled = [scarlet]ปิดใช้งาน mod.disable = ปิดใช้งาน mod.delete.error = ไม่สามารถลบมอดได้. ไฟล์อาจอยู่ในระหว่างการใช้งาน. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]dependencies หาย: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]มอด '{0}' ไม่มี dependencies:[accent] {1}\n[lightgray]จำเป็นต้องโหลดมอดพวกนี้ก่อน\nมอดนี้จะถูกปิดใช้งานโดยอัตโนมัติ mod.enable = เปิดใช้งาน mod.requiresrestart = เกมจะปิดลงเพื่อใส่มอด mod.reloadrequired = [scarlet]จำเป็นต้องรีโหลด mod.import = นำเข้ามอด mod.import.github = นำเข้ามอดจาก Github +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = มอดนี้จะถูกลบ mod.author = [LIGHT_GRAY]ผู้สร้าง:[] {0} mod.missing = เซฟนี้มีมอดที่คุณอัปเดตหรือไม่ได้ติดตั้งแล้ว. อาจทำให้เซฟเสีย. คุณแน่จะหรือว่าจะโหลดเซฟนี้?\n[lightgray]Mods:\n{0} mod.preview.missing = ก่อนที่จะนำมอดไปลงใน workshop, คุณต้องใส่รูปพรีวิวก่อน\nใส่รูปชื่อ[accent] preview.png[] ลงในโฟลเดอร์ของมอดแล้วลองอีกครั้ง mod.folder.missing = มอดที่อยู่ในรูปแบบโฟลเดอร์เท่านั้นที่สามารถลงใน workshop ได้\nunzip ไฟล์แล้วลบไฟล์ zip เก่า แล้วรีสตาร์ทเกมหรือรีโหลดมอด +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. about.button = เกี่ยวกับ name = ชื่อ: @@ -116,7 +133,7 @@ noname = ใส่ชื่อ[accent] ผู้เล่น[] ก่อน. filename = ชื่อไฟล์: unlocked = content ใหม่ปลดล็อค! completed = [accent]สำเร็จ -techtree = สายวิจัย +techtree = ความคืบหน้าในการวิจัย research.list = [lightgray]วิจัย: research = วิจัย researched = [lightgray]{0} วิจัยแล้ว. @@ -126,9 +143,9 @@ server.closing = [accent]กำลังปิดเซิฟเวอร์... server.kicked.kick = คุณถูกเตะออกจากเซิฟเวอร์! server.kicked.whitelist = คุณไม่ได้อยู่ใน whitelisted server.kicked.serverClose = เซิฟเวอร์ถูกปิด. -server.kicked.vote = คุณถูกโหวตเตะออก. บายบาย. -server.kicked.clientOutdated = client ล่าสมัย! กรุณาอัปเดตเกมของคุณ! -server.kicked.serverOutdated = server ล่าสมัย! โปรดถามเจ้าของเซิฟเพื่ออัปเดต! +server.kicked.vote = คุณถูกโหวตเตะออก. บัยบาย. +server.kicked.clientOutdated = client เก่า! กรุณาอัปเดตเกมของคุณ! +server.kicked.serverOutdated = server เก่า! โปรดถามเจ้าของเซิฟเพื่ออัปเดต! server.kicked.banned = คุณถูกแบนในเซิฟเวอร์นี้ server.kicked.typeMismatch = เซิฟเวอร์นี้ไม่เข้ากับ build type ของคุณ. server.kicked.playerLimit = เซิฟเวอร์เต็ม. กรุณารอให้เซิฟเวอร์ว่างก่อน. @@ -138,6 +155,7 @@ server.kicked.nameEmpty = ชื่อของคุณไม่สามาร server.kicked.idInUse = คุณเชื่อมต่อกับเซิฟเวอร์นี้อยู่แล้ว เราไม่อนุญาตให้เชื่อมต่อ 2 บัญชีในเซฟเวอร์เดียวกัน server.kicked.customClient = เซิฟเวอร์นี้ไม่รองรับ builds ปรับแต่ง. กรุณาโหลดของ official. server.kicked.gameover = Game over! +server.kicked.serverRestarting = The server is restarting. server.versions = เวอร์ชั่นของคุณ:[accent] {0}[]\nเวอร์ชั่นของเซิฟเวอร์:[accent] {1}[] host.info = ปุ่ม [accent]โฮสต์[] นั้นโฮสต์เซฟเวอร์ที่พอร์ท [scarlet]6567[]. \nทุกคนที่อยู่ใน [lightgray]wifi หรือ local network[] เดียวกันจะสามารถเห็นเซิฟเวอร์ของคุณในลิสของเซิฟเวอร์ได้\n\nถ้าคุณต้องการให้ผู้เล่นอื่นๆสามารถเชื่อมต่อได้จากทุกที่โดยใช้ IP, จำเป็นจะต้องใช้การ [accent]port forwarding[] \n\n[lightgray]Note: ถ้าผู้เล่นคนใดมีปัญหาในการเชื่อมต่อ LAN ของคุณ เช็คให้แน่ใจว่าคุณได้อนุญาตให้ Mindustry เข้าถึง local network ของคุณในการตั้งค่า firewall. จำให้ว่า network สาธารณะบางครั้งไม่อนุญาตการค้นหาเซิฟเวอร์ join.info = คุณสามารถใส่ [accent]IP ของเซิฟเวอร์[] เพื่อที่จะเชื่อมต่อหรือค้นหา เซิฟเวอร์ที่ใช้[accent]local network[] จะสามารถเชื่อมโดยใช้\n LAN หรือ WAN ก็ได้\n\n[lightgray]โน้ต: เกมนี้ไม่มีระบบค้นหาเซิฟเวอร์ global ให้อัตโนมัติserver list; ถ้าคุณต้องการเชื่อมต่อกับเซิฟเวอร์โดยใช้ IP, คุณจำเป็นต้องถาม IP ผู้เล่นที่โฮสต์เซิฟเวอร์นั้นๆ. @@ -170,7 +188,6 @@ server.outdated = [crimson]Server ล้าสมัย![] server.outdated.client = [crimson]Client ล้าสมัย![] server.version = [gray]เวอร์ชั่น{0} {1} server.custombuild = [accent]Build -ที่กำหนดเอง confirmban = คุณแน่ใจหรือว่าจะแบนผู้เล่นนี้? confirmkick = คุณแน่ใจหรือว่าจะเตะผู้เล่นนี้ออก? confirmvotekick = คุณแน่ใจหรือว่าจะโหวตเตะผู้เล่นนี้ออก? @@ -202,9 +219,7 @@ save.delete = ลบ save.export = ส่งออกเซฟ save.import.invalid = [accent]เซฟนี้ไม่ถูกต้อง! save.import.fail = [crimson]ไม่สามารถนำเข้าเซฟ: [accent]{0} -ได้ save.export.fail = [crimson]ไม่สามารถส่งออกเซฟ: [accent]{0} -ได้ save.import = นำเข้าเซฟ save.newslot = ชื่อเซฟ: save.rename = เปลี่ยนชื่อ @@ -497,6 +512,7 @@ settings.language = ภาษา settings.data = ข้อมูลเกม settings.reset = รีเซ็ตเป็นค่าเริ่มต้น settings.rebind = Rebind +settings.resetKey = Reset settings.controls = การควบคุม settings.game = เกม settings.sound = เสียง @@ -563,7 +579,6 @@ bar.heat = ความร้อน bar.power = พลังงาน bar.progress = ความคืบหน้าในการสร้าง bar.spawned = จำนวนยูนิตทั้งหมด: {0}/{1} - ยูนิต bar.input = นำเข้า bar.output = ส่งออก @@ -591,6 +606,8 @@ unit.persecond = /วินาที unit.timesspeed = เท่าเร็วขึ้น unit.percent = % unit.items = ไอเท็ม +unit.thousands = k +unit.millions = mil category.general = ทั่วไป category.power = พลังงาน category.liquids = ของเหลว @@ -598,7 +615,7 @@ category.items = ไอเท็ม category.crafting = นำเข้า/ส่งออก category.shooting = การยิง category.optional = การเพิ่มประสิทธิภาพทางเลือก -setting.landscape.name = ล็อค Landscape +setting.landscape.name = ล็อค Landscape แนวนอน setting.shadows.name = เงา setting.blockreplace.name = แนะนำบล็อคโดยอัตโนมัติ setting.linear.name = การกรองเชิงเส้น @@ -612,7 +629,6 @@ setting.autotarget.name = เล็งเป้าอัตโนมัติ setting.keyboard.name = การควบคุมแบบ เม้าส์+คีย์บอร์ด setting.touchscreen.name = การควบคุมแบบหน้าจอสัมผัส setting.fpscap.name = FPS -สูงสุด setting.fpscap.none = ไม่มี setting.fpscap.text = {0} FPS setting.uiscale.name = ขนาด UI[lightgray] (จำเป็นต้องรีสตาร์ท)[] @@ -627,13 +643,16 @@ setting.screenshake.name = การสั่นของจอ setting.effects.name = แสดงเอฟเฟ็ค setting.destroyedblocks.name = แสดงบล็อคที่ถูกทำลาย setting.conveyorpathfinding.name = Pathfinding -ของการวางสายพาน +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = ความไวของตัวควบคุม setting.saveinterval.name = ระยะห่าวระหว่างเซฟ setting.seconds = {0} วินาที +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = เต็มจอ setting.borderlesswindow.name = วินโดว์แบบไร้ขอบ[lightgray] (อาจจะต้องรีตาร์ท) setting.fps.name = แสดง FPS และ Ping +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelate[lightgray] (ปิดใช้งานแอนิเมชั่น) setting.minimap.name = แสดงมินิแมพ @@ -662,17 +681,36 @@ category.multiplayer.name = ผู้เล่นหลายคน command.attack = โจมตี command.rally = ชุมนุม command.retreat = ถอยกลับ +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = เคลียร์สิ่งก็สร้าง keybind.press = กดปุ่มใดก็ได้... keybind.press.axis = กดแกนหรือปุ่มใดก็ได้... keybind.screenshot.name = แมพ Screenshot +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = เคลื่อนที่ในแกน x keybind.move_y.name = เคลี่อนที่ในแกน y keybind.mouse_move.name = ตามเม้าส์ +keybind.dash.name = พุ่ง keybind.schematic_select.name = เลือกภูมิภาค keybind.schematic_menu.name = เมนู Schematic keybind.schematic_flip_x.name = กลับ Schematic ในแกน X keybind.schematic_flip_y.name = กลับ Schematic ในแกน Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = เปิด/ปิด Fullscreen keybind.select.name = เลือก/ยิง keybind.diagonal_placement.name = วางเป็นแนวทแยง @@ -680,13 +718,11 @@ keybind.pick.name = เลือกบล็อค keybind.break_block.name = ทุบบล็อค keybind.deselect.name = ยกเลิกการเบือก keybind.shoot.name = ยิง -keybind.zoom_hold.name = ซูม กดค้าง keybind.zoom.name = ซูม keybind.menu.name = เมนู keybind.pause.name = หยุดชั่วคราว keybind.pause_building.name = หยุด/สร้างต่อ keybind.minimap.name = มินิแมะ -keybind.dash.name = พุ่ง keybind.chat.name = แชท keybind.player_list.name = รายชื่อผู้เล่น keybind.console.name = คอนโซล์ @@ -711,6 +747,7 @@ mode.attack.description = ทำลายฐานของศัตรู ไ mode.custom = กฎแบบกำหนดเอง rules.infiniteresources = ทรัพยากรไม่จำกัด +rules.reactorexplosions = Reactor Explosions rules.wavetimer = ตัวตั้งเวลา Wave rules.waves = Waves rules.attack = โหมดการโจมตี @@ -718,6 +755,7 @@ rules.enemyCheat = AI (ทีมสีแดง) มีทรัพยากร rules.unitdrops = ยูนิตดรอป rules.unitbuildspeedmultiplier = ตัวคูณความเร็วในการสร้างยูนิต rules.unithealthmultiplier = ตัวคูณเลือดของยูนิต +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = ตัวคูณเลือดผู้เล่น rules.playerdamagemultiplier = ตัวคูณดาเมจผู้เล่น rules.unitdamagemultiplier = ตัวคูณดาเมจยูนิต @@ -736,6 +774,9 @@ rules.title.resourcesbuilding = ทรัพยากรและสิ่งก rules.title.player = ผู้เล่น rules.title.enemy = ศัตรู rules.title.unit = ยูนิต +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light content.item.name = ไอเท็ม content.liquid.name = ของเหลว @@ -761,28 +802,29 @@ item.scrap.name = เศษเหล็ก liquid.water.name = น้ำ liquid.slag.name = กากแร่ liquid.oil.name = น้ำมัน -liquid.cryofluid.name = ไครโยฟลูอิด +liquid.cryofluid.name = โครโรฟิวล์ mech.alpha-mech.name = อัลฟ้า mech.alpha-mech.weapon = เฮฟวี้รีพีทเตอร์ mech.alpha-mech.ability = รีเจเนเรชั่น mech.delta-mech.name = เดลต้า mech.delta-mech.weapon = เครื่องกำเนิดประกายไฟฟ้า -mech.delta-mech.ability = ปล่อย +mech.delta-mech.ability = ปล่อยสายฟ้า mech.tau-mech.name = เทา mech.tau-mech.weapon = รีสตัคเลเซอร์ mech.tau-mech.ability = เบิสต์ซ่อมแซม mech.omega-mech.name = โอเมก้า -mech.omega-mech.weapon = ฝูงขีปนาวุธ +mech.omega-mech.weapon = ขีปนาวุธมหาปลัย mech.omega-mech.ability = ตัวเสริมเกราะ mech.dart-ship.name = ลูกดอก (Dart) mech.dart-ship.weapon = รีพีตเตอร์ -mech.javelin-ship.name = หอก (Javelin) +mech.javelin-ship.name = จาวาลีน (Javelin) mech.javelin-ship.weapon = ขีปนาวุธเบิสต์ mech.javelin-ship.ability = ดิสชาร์จบูสเตอร์ mech.trident-ship.name = ตรีศูล (Trident) -mech.trident-ship.weapon = ห้องเก็บระเบิด +mech.trident-ship.weapon = ตัวปล่อยระเบิด mech.glaive-ship.name = เกลฟว์ mech.glaive-ship.weapon = รีพีตเตอร์ไฟ +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [lightgray]ค่าการระเบิด: {0}% item.flammability = [lightgray]ไวไฟ: {0}% item.radioactivity = [lightgray]ค่ากัมมันตภาพรังสี: {0}% @@ -809,8 +851,8 @@ block.sandrocks.name = หินทราย block.spore-pine.name = ต้นสนสปอร์ block.sporerocks.name = หินสปอร์ block.rock.name = หิน -block.snowrock.name = หินหิมะ -block.snow-pine.name = ต้นสนหิมะ +block.snowrock.name = ก้อนหิมะ +block.snow-pine.name = ต้นสนที่คลุมหิมะ block.shale.name = หินดินดาน block.shale-boulder.name = ก้อนหินดินดาน block.moss.name = ตะไคร่น้ำ @@ -897,6 +939,8 @@ block.distributor.name = เร้าเตอร์ขนาดใหญ่ block.sorter.name = เครื่องแยก block.inverted-sorter.name = เครื่องแยกกลับด้าน block.message.name = ตัวเก็บข้อความ +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = ประตูล้น block.silicon-smelter.name = เตาเผาซิลิก้อน block.phase-weaver.name = เครื่องทอเฟสต์ @@ -905,9 +949,8 @@ block.cryofluidmixer.name = เครื่องผสมไครโยฟล block.melter.name = เตาหลอม block.incinerator.name = เตาเผาขยะ block.spore-press.name = เครื่องอัดสปอร์ -block.separator.name = -เครื่องแยก -block.coal-centrifuge.name = เครื่องปั่นเหวี่งถ่านหิน +block.separator.name = เครื่องแยก +block.coal-centrifuge.name = เครื่องผลิตถ่านหิน block.power-node.name = โหนดพลังงาน block.power-node-large.name = โหนดพลังงานขนาดใหญ่ block.surge-tower.name = เสาเสิร์จ @@ -916,7 +959,7 @@ block.battery.name = แบตเตอรี่ block.battery-large.name = แบตเตอรี่ขนาดใหญ่ block.combustion-generator.name = เครื่องกำเนิดไฟฟ้าเผาไหม้ block.turbine-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ -block.differential-generator.name = เครื่องกำเนิดไฟฟ้าดิฟเฟอเร่นเชี่ยว +block.differential-generator.name = เครื่องกำเนิดไฟฟ้าดิฟเฟอเร่นเตอร์ block.impact-reactor.name = เตาปฏิกรณ์อิมแพ็ค block.mechanical-drill.name = เครื่องขุดเชิงกล block.pneumatic-drill.name = เครื่องขุดนิวมาติก @@ -930,11 +973,12 @@ block.trident-ship-pad.name = ฐานปล่อยยานตรีศู block.glaive-ship-pad.name = ฐานปล่อยยานเกลฟว์ block.omega-mech-pad.name = ฐานปล่อยเม็คโอเมก้า block.tau-mech-pad.name = ฐานปล่อยเม็คเทา (Tau) -block.conduit.name = รางน้ำ +block.conduit.name = ท่อน้ำ block.mechanical-pump.name = ปั๊มเชิงกล block.item-source.name = จุดกำเนิดไอเท็ม block.item-void.name = จุดลบไอเท็ม block.liquid-source.name = จุดกำเนิดของเหลว +block.liquid-void.name = Liquid Void block.power-void.name = จุดลบพลังงาน block.power-source.name = พลังงานไม่จำกัด block.unloader.name = ตัวถ่ายของ @@ -943,8 +987,8 @@ block.wave.name = เวฟ block.swarmer.name = สวอร์มเมอร์ block.salvo.name = ซาวโว block.ripple.name = ริปเปิ้ล -block.phase-conveyor.name = สายพานเฟส -block.bridge-conveyor.name = สะพานสายพาน +block.phase-conveyor.name = สายพานความเร็วแสง +block.bridge-conveyor.name = สะพาน block.plastanium-compressor.name = เครื่องอัดพลาสตาเนียม block.pyratite-mixer.name = เครื่องผสมไพราไทต์ block.blast-mixer.name = เครื่องผสมสารประกอบระเบิด @@ -964,11 +1008,12 @@ block.fortress-factory.name = โรงงานผลิตฟอร์เท block.revenant-factory.name = โรงงานผลิตยานไฟต์เตอร์เรเวแนนท์ block.repair-point.name = จุดซ่อมแซม block.pulse-conduit.name = รางน้ำโพวส์ -block.phase-conduit.name = รางน้ำเฟส +block.plated-conduit.name = Plated Conduit +block.phase-conduit.name = ท่อน้ำความเร็วแสง block.liquid-router.name = เร้าเตอร์ของเหลว -block.liquid-tank.name = แทงค์เก็บของเหลว +block.liquid-tank.name = แทงค์น้ำ block.liquid-junction.name = ทางแยกของเหลว -block.bridge-conduit.name = สะพานรางน้ำ +block.bridge-conduit.name = ท่อน้ำยกระดับ block.rotary-pump.name = ปั๊มโรตารี้ block.thorium-reactor.name = เตาปฏิกรณ์ทอเรี่ยม block.mass-driver.name = แมสไดรฟ์เวอร์ @@ -982,8 +1027,8 @@ block.surge-wall.name = กำแพงเสิร์จ block.surge-wall-large.name = กำแพงเสิร์จขนาดใหญ่ block.cyclone.name = ไซโคลน block.fuse.name = ฟิวส์ -block.shock-mine.name = กับระเบิดไฟฟ้าซ็อต -block.overdrive-projector.name = โอเวอร์ไดรฟ์โปรเจ็คเตอร์ +block.shock-mine.name = กับระเบิดไฟฟ้า +block.overdrive-projector.name = เครื่องเร่งประสิทธิภาพ block.force-projector.name = ฟอร์สโปรเจ็คเตอร์ block.arc.name = อาร์ค block.rtg-generator.name = เครื่องกำเนิดไฟฟ้า อาร์ทีจี @@ -1013,7 +1058,7 @@ unit.eruptor.name = อีรัฟเตอร์ unit.chaos-array.name = เคออสอาเรย์ unit.eradicator.name = อีเรดิเคเตอร์ unit.lich.name = ลิช -unit.reaper.name = รีฟเฟอร์ +unit.reaper.name = รีฟเปอร์ tutorial.next = [lightgray]<กดเพื่อดำเนินการต่อ> tutorial.intro = คุณได้เข้าสู่[scarlet] การสอนเล่นของ Mindustry.[]\nใช้ [[WASD] เพื่อเคลื่อนที่.\n[accent]กด [[Ctrl] ค้างระหว่างกลิ้งลูกกลิ้งเม้าส์[] เพื่อซูมเข้าและออก.\nเริ่มด้วยการ[accent] ขุดทองแดง[]. เคลื่อนที่ไปใกล้มัน, แล้วกดที่สายแร่ทองแดงใกล้ๆกับ core ของคุณ\n\n[accent]ทองแดง {0}/{1} ชิ้น tutorial.intro.mobile = คุณได้เข้าสู่[scarlet] การสอนเล่นของ Mindustry.[]\nเลื่อนหน้าจอเพื่อเคลื่อนที่.\n[accent]ใส่สองนิ้ว []เพื่อซูมเข้าและออก.\nเริ่มด้วยการ[accent] ขุดทองแดง[]. เคลื่อนที่ไปใกล้มัน, แล้วกดที่สายแร่ทองแดงใกล้ๆกับ core ของคุณ\n\n[accent]ทองแดง {0}/{1} ชิ้น @@ -1097,6 +1142,7 @@ block.power-source.description = ส่งออกพลังงานไม block.item-source.description = ส่งออกไอเท็มไม่จำกัด. เฉพาะ Sandbox เท่านั้น. block.item-void.description = ทำลายทุกไอเท็ม . เฉพาะ Sandbox เท่านั้น. block.liquid-source.description = ส่งออกของเหลวไม่จำกัด. เฉพาะ Sandbox เท่านั้น. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = บล็อคป้องกันราคาถูก.\nมีประโยชน์สำหรับป้องกัน core และป้อมปืนใน wave แรกๆ. block.copper-wall-large.description = บล็อคป้องกันราคาถูก.\nมีประโยชน์สำหรับป้องกัน core และป้อมปืนใน wave แรกๆ.\nคลอบคลุมหลายข่อง. block.titanium-wall.description = บล็อคป้องกันแข็งแกร่งปานกลาง.\nป้องกันศัตรูได้ในระดับหนึ่ง. @@ -1110,7 +1156,7 @@ block.phase-wall-large.description = A wall coated with special phase-based refl block.surge-wall.description = บล็อคป้องกันที่มีทนทานสูง.\nสะสมพลังงานจากกระสุน, แล้วปล่อยออกมาแบบสุ่ม. block.surge-wall-large.description = บล็อคป้องกันที่มีทนทานสูง.\nสะสมพลังงานจากกระสุน, แล้วปล่อยออกมาแบบสุ่ม.\nคลอบคลุมหลายช่อง. block.door.description = ประตูขนาดเล็ก. สามารถเปิดได้โดยการกด. -block.door-large.description = ประตูขนาดใหญ่. สามารถเปิดได้โดยการกด.\nคลอบคลุมหลายช่อง. +block.door-large.description = ประตูขนาดใหญ่. สามารถเปิดและปิดได้โดยการกด.\nคลอบคลุมหลายช่อง. block.mender.description = ซ่อมแซมบล็อคในวงของมันเป็นระยะๆ. ช่วยซ่อมแซมแนวป้องกันระหว่าง wave.\nสามารถใช้ซิลิก้อนเพื่อเพิ่มรัศมีและประสิทธิภาพได้ block.mend-projector.description = เมนเดอร์ที่ได้รับการอัปเกรด. ซ่อมแซมบล็อคในระยะของมัน.\nสามารถใช้ใยเฟสเพื่อเพิ่มระยะและประสิทธิภาพได้. block.overdrive-projector.description = เพิ่มความเร็วของสิ่งก่อสร้างรอบๆ.\nสามารถใช้ใยเฟสเพื่อเพิ่มระยะและประสิทธิภาพ. @@ -1123,7 +1169,7 @@ block.bridge-conveyor.description = บล็อคขนส่งไอเท block.phase-conveyor.description = บล็อคขนส่งไอเท็มขั้นสูง. ใช้พลังงานเพื่อส่งไอเท็มไปยังสายพานเฟสอีกอัน ข้ามได้หลายช่อง. block.sorter.description = แยกไอเท็ม. ถ้าไอเท็มตรงกับที่เลือกไว้, จะผ่านได้. แต่ถ้าไม่ตรง, ไอเท็มจะออกทางซ้ายหรือขวา (ใช้ทางที่ไอเท็มเข้าเป็นหลัก) block.inverted-sorter.description = แยกไอเท็มคล้ายเครื่องแยกธรรมดา, แต่ไอเท็มที่เลือกจะออกข้างแทน. -block.router.description = รับไอเท็มแล้วส่งออก 3 ทางเท่ากัน. มีประโยชน์สำหรับแยกไอเท็มจากแหล่งเดียวไปหลายที่.\n\n[scarlet]อย่าวางไว้ติดกับทางส่งไอเท็มเข้าเพราะของออกจะไปอุดตันได้.[] +block.router.description = รับไอเท็มแล้วส่งออก 3 ทางเท่าๆกัน. มีประโยชน์สำหรับแยกไอเท็มจากแหล่งเดียวไปหลายที่.\n\n[scarlet]อย่าวางไว้ติดกับทางส่งไอเท็มเข้าเพราะของออกจะไปอุดตันได้.[] block.distributor.description = เร้าเตอร์ขั้นสูง. แยกไอเท็มออก 7 ทางอย่างเท่าๆกัน. block.overflow-gate.description = ของจะออกจากข้างๆเมื่อทางข้างหน้ถูกบล็อคเท่านั้น. block.mass-driver.description = บล็อคขนส่งไอเท็มขั้นสุดยอด. รวบรวมไอเท็มจำนวนหนึ่งแล้วยิงไปหาแมสไดรเวอร์อีกอันที่อยู่ไกลออกไป. ต้องใช้พลังงานในการใช้งาน. @@ -1132,6 +1178,7 @@ block.rotary-pump.description = ปั๊มขั้นสูง. ปั๊ม block.thermal-pump.description = ปั๊มขั้นสุดยอด. block.conduit.description = บล็อคขนส่งของเหลวพื้นฐาน. เคลื่อนของเหลวไปข้างหน้า. ใช้ร่วมกับปั๊มและรางน้ำอื่นๆ. block.pulse-conduit.description = บล็อคขนส่งของเหลวขั้นสูง. เคลื่อนย้ายของเหลวเร็วขึ้นและเก็บเยอะกว่ารางน้ำธรรมดา. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = รับของเหลวจากทางเดียวแล้วส่งออก 3 ทางเท่าๆกัน. สามารถเก็บของ้หลวได้จำนวนหนึ่ง. มีประโยชน์สำหรับการแยกของเหลวจากแหล่งเดียวไปหลายที่. block.liquid-tank.description = เก็บของเหลวจำนวนมาก. ใช่สำหรับสร้างบัฟเฟอร์ในเวลาที่ความต้องการของทรัพยากรไม่คงที่หรือเป็นตัวเซฟสำหรับบล็อคที่จำเป็นต้องใช้การหล่อเย็น. block.liquid-junction.description = ทำหน้าที่เป็นสะพานสำหรับรางน้ำ 2 รางที่ข้ามกันที่มีของเหลว 2 ชนิด ซึ่งต้องการจะไปคนละที่. @@ -1150,7 +1197,7 @@ block.differential-generator.description = ผลิตไฟฟ้าจำน block.rtg-generator.description = เครื่องกำเนิดไฟฟ้าที่ใช้ง่ายและไว้ใจได้. ใช้ความร้อนจากการสลายของสารกัมมัตภาพรังสีเพื่อใช้ผลิตพลังงานอย่างช้าๆ. block.solar-panel.description = ให้พลังงานจากแสงอาทิตย์จำนวนน้อย. block.solar-panel-large.description = เวอร์ชั่นของแผงโซล่าเซลล์ที่มีประสิทธิภาพมากขึ้นกว่าแผงโซล่าเซลล์ธรรมดา. -block.thorium-reactor.description = ผลิตพลังงานจำนวนมากจากทอเรี่ยม. ตำเป็นต้องใช้สารหล่อเย็นตลอดเวลา. จะระเบิดอย่างรุนแรงหากไม่ได้รับสารหล่อเย็นในจำนวนที่ต้องการ. จำนวนพลังงานที่ผลิตขึ้นอยู่กับความเต็ม และผลิตพลังงานเริ่มต้นที่ความสามารถสูงสุด. +block.thorium-reactor.description = ผลิตพลังงานจำนวนมากจากทอเรี่ยม. จำเป็นต้องใช้สารหล่อเย็นตลอดเวลา. จะระเบิดอย่างรุนแรงหากไม่ได้รับสารหล่อเย็นในจำนวนที่ต้องการ. จำนวนพลังงานที่ผลิตขึ้นอยู่กับความเต็ม และผลิตพลังงานเริ่มต้นที่ความสามารถสูงสุด. block.impact-reactor.description = เครื่องกำเนิดไฟฟ้าขั้นสูง, สามารถผลิตไฟฟ้าได้จำนวนมหาศาลที่ประสิทธิภาพสูงสุด. จำเป็นต้องใช้พลังงานจำนวนมากในการสตาร์ทเครื่อง. block.mechanical-drill.description = เครื่องขุดราคาถูก. เมื่อวางบนบล็อคที่ถูกต้อง, จะส่งไอเท็มของมันออกมาเรื่อยๆแบบไม่มีที่สิ้นสุด. ขุดได้แค่ทรัพยากรพื้นฐาน. block.pneumatic-drill.description = เครื่องขุดได้รับการปรับปรุง, สามารถขุดไทเทเนี่ยมได้. ขุดไวกว่าเครื่องขุดเชิงกล. @@ -1186,16 +1233,16 @@ block.draug-factory.description = ผลิตโดรนขุดเจาะ block.spirit-factory.description = ผลิตโดรนซ่อมแซมสปิริต. block.phantom-factory.description = ผลิตโดรนก่อสร้างขั้นสูง. block.wraith-factory.description = ผลิตยูนิตเร็ว โจมตีแบบ hit-and-run (จู่โจมแล้วหนี) -block.ghoul-factory.description = ผลิตยานทิ้งระเบิดปูพรมหนัก (heavy carpet bomber) +block.ghoul-factory.description = ผลิตยานทิ้งระเบิดแบบโหดๆ (heavy carpet bomber) block.revenant-factory.description = ผลิตยูนิตที่ใช้ขีปนาวุธเป็นหลัก. block.dagger-factory.description = ผลิตยูนิตภาคพื้นดินพื้นฐาน. -block.crawler-factory.description = ผลิตยูนิตพลีชีพเร็ว. +block.crawler-factory.description = ผลิตยูนิตที่ระเบิดตัวเอง. block.titan-factory.description = ผลิตยูนิตภาคพื้นดินเสริมเกราะขั้นสูง. -block.fortress-factory.description = ผลิตยูนิตหนักติดปืนใหญ่. +block.fortress-factory.description = ผลิตยูนิตที่ถึกและติดปืนใหญ่. block.repair-point.description = ซ่อมแซมยูนิตที่อยู่ในรัศมีอย่างต่อเนื่อง. block.dart-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คโจมตีพื้นฐาน.\nใช้โดยการกดเมื่อยืนทับมัน. -block.delta-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คเกราะบางโจมตีแบบ hit-and-run (จู่โจมแล้วหนี).\nใช้โดยการกดเมื่อยืนทับมัน. -block.tau-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คสนับสนุนขั้นสูง.\nใช้โดยการกดเมื่อยืนทับมัน. +block.delta-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คเกราะบางโจมตีแบบ hit-and-run (จูค).\nใช้โดยการกดเมื่อยืนทับมัน. +block.tau-mech-pad.description = ใช้เปลี่ยนร่างเป็นตัวที่ฮีลได้ดีมาก.\nใช้โดยการกดเมื่อยืนทับมัน. block.omega-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คใช้ขีปนาวุธเกราะหนา.\nใช้โดยการกดเมื่อยืนทับมัน. block.javelin-ship-pad.description = ใช้เปลี่ยนร่างเป็นเป็นอินเทอร์เซ็ปเตอร์เร็วแบะเกราะบาง.\nใช้โดยการกดเมื่อยืนทับมัน. block.trident-ship-pad.description = ใช้เปลี่ยนร่างเป็นเป็นยานทิ้งระเบิดสนับสนุน.\nใช้โดยการกดเมื่อยืนทับมัน. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index ef01140591..0f368815c4 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -10,7 +10,9 @@ link.dev-builds.description = Bitirilmemis Yapim Surumu link.trello.description = Planlanmis Hersey icin Tablo link.itch.io.description = Bilgisayar ve Site versiyonunun bulundugu Site link.google-play.description = Google Play magaza sayfasi +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Orjinal Mindustry Bilgilendirme Sayfasi +link.feathub.description = Suggest new features linkfail = Link Acilamadi!\nLink sizin icin kopyalandi. screenshot = Screenshot saved to {0} screenshot.invalid = Map too large, potentially not enough memory for screenshot. @@ -18,12 +20,22 @@ gameover = Cekirdegin yok edildi. gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]Yeni Yuksek skor! copied = Copied. + load.sound = Sounds load.map = Maps load.image = Images load.content = Content load.system = System load.mod = Mods +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -40,6 +52,7 @@ schematic.saved = Schematic saved. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks + stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.built = Buildings Built:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: stat.rank = Final Rank: [accent]{0} + launcheditems = [accent]Launched Items launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Su haritayi silmek istediginden emin misin? "[accent]{0}[]"? @@ -74,6 +88,7 @@ maps.browse = Browse Maps continue = Devam et maps.none = [LIGHT_GRAY]Harita bulunamadi! invalid = Invalid +pickcolor = Pick Color preparingconfig = Preparing Config preparingcontent = Preparing Content uploadingcontent = Uploading Content @@ -81,6 +96,7 @@ uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Done feature.unsupported = Your device does not support this feature. + mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. mods.alpha = [accent](Alpha) mods = Mods @@ -92,18 +108,25 @@ mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required mod.import = Import Mod mod.import.github = Import GitHub Mod +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = This mod will be deleted. mod.author = [LIGHT_GRAY]Author:[] {0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Hakkinda name = isim: noname = Pick a[accent] player name[] first. @@ -132,6 +155,7 @@ server.kicked.nameEmpty = ismin gecerli degil. server.kicked.idInUse = Zaten oyundasin! iki ayri hesapla oyuna katilamazsin! server.kicked.customClient = Bu oyun ayarlanmis vesiyonlara izin vermiyor. Orijinal bir versiyon dene! server.kicked.gameover = Game over! +server.kicked.serverRestarting = The server is restarting. server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = [accent]host[] su linkte bir oyun acti! [scarlet]6567[]. \nSeninle [LIGHT_GRAY]ayni internete[] sahip olan kisiler oyunu gorebilir.\n\neger baska yerlerden kisilerind de gelmesini istiyorsan, [accent]oyun acmak[]zorunludur.\n\n[LIGHT_GRAY]Not: eger baglanmakta gucluk cekiliyorsa, antivirusunun internetine baglanmasini izin vermesini sagla. join.info = Buradan,[accent]Oyunun linkini[] kullanarak katilabilir, yada, [accent]internetinle[] baglanacak oyun bulabilirsin\ninternetli ve Linkli oyunlar desteklenir.\n\n[LIGHT_GRAY]Not: Otomatik bir oyun listesi goruntulenemez. Yapimcidan linkini iste. @@ -271,6 +295,7 @@ publishing = [accent]Publishing... publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.error = Error publishing item: {0} steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = Firca editor.openin = Editorde ac editor.oregen = Maden Yaratilma hizi @@ -347,6 +372,7 @@ editor.overwrite = [accent]Dikkat et!\nBu bir haritanin uzerinden cececek. editor.overwrite.confirm = [scarlet]uyari![] bu isimde bir harita zaten var. Uzerinden gececek misin? editor.exists = A map with this name already exists. editor.selectmap = Yukleyecek bir harita sec: + toolmode.replace = Replace toolmode.replace.description = Draws only on solid blocks. toolmode.replaceall = Replace All @@ -361,6 +387,7 @@ toolmode.fillteams = Fill Teams toolmode.fillteams.description = Fill teams instead of blocks. toolmode.drawteams = Draw Teams toolmode.drawteams.description = Draw teams instead of blocks. + filters.empty = [LIGHT_GRAY]No filters! Add one with the button below. filter.distort = Distort filter.noise = Noise @@ -392,6 +419,7 @@ filter.option.floor2 = Secondary Floor filter.option.threshold2 = Secondary Threshold filter.option.radius = Radius filter.option.percentile = Percentile + width = Genislik: height = Yukseklik: menu = Menu @@ -407,6 +435,7 @@ tutorial = Tutorial tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Harita yaraticisi + abandon = Abandon abandon.text = This zone and all its resources will be lost to the enemy. locked = Locked @@ -437,6 +466,7 @@ zone.objective.survival = Survive zone.objective.attack = Destroy Enemy Core add = Add... boss.health = Boss Health + connectfail = [crimson]Su Oyuna baglanilamadi: [accent]{0} error.unreachable = Server unreachable. error.invalidaddress = Invalid address. @@ -447,6 +477,7 @@ error.mapnotfound = Map file not found! error.io = Network I/O error. error.any = Unkown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. + zone.groundZero.name = Ground Zero zone.desertWastes.name = Desert Wastes zone.craters.name = The Craters @@ -461,6 +492,7 @@ zone.saltFlats.name = Salt Flats zone.impact0078.name = Impact 0078 zone.crags.name = Crags 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.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.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. @@ -475,10 +507,12 @@ 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.impact0078.description = zone.crags.description = + settings.language = Dil settings.data = Game Data settings.reset = ilk ayarlara geri al settings.rebind = Geri al +settings.resetKey = Reset settings.controls = Kontroller settings.game = Oyun settings.sound = Ses @@ -529,6 +563,7 @@ blocks.inaccuracy = sekme blocks.shots = vuruslar blocks.reload = Yeniden doldurma blocks.ammo = Ammo + bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s @@ -544,6 +579,9 @@ bar.heat = Heat bar.power = Power bar.progress = Build Progress bar.spawned = Units: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] dmg bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary @@ -555,6 +593,7 @@ bullet.freezing = [stat]freezing bullet.tarred = [stat]tarred bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.reload = [stat]{0}[lightgray]x reload + unit.blocks = Yapilar unit.powersecond = saniyede bir unit.liquidsecond = Saniyede bir @@ -567,6 +606,8 @@ unit.persecond = /sec unit.timesspeed = x speed unit.percent = % unit.items = esya +unit.thousands = k +unit.millions = mil category.general = General category.power = Guc category.liquids = sivilar @@ -579,6 +620,7 @@ setting.shadows.name = Shadows setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animated Water setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] @@ -601,12 +643,16 @@ setting.screenshake.name = Ekran sallanmasi setting.effects.name = Efekleri goster setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Kumanda hassasligi setting.saveinterval.name = Otomatik kaydetme suresi setting.seconds = {0} Saniye +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Tam ekran setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) setting.fps.name = FPS'i goster +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Haritayi goster @@ -635,16 +681,36 @@ category.multiplayer.name = Cok oyunculu command.attack = Attack command.rally = Rally command.retreat = Retreat +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Clear Building keybind.press = Bir tusa bas... keybind.press.axis = Bir yone cevir yada tusa bas... keybind.screenshot.name = Map Screenshot +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Sol/Sag hareket keybind.move_y.name = Yukari/asagi hareket +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Kos keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_y.name = Flip Schematic Y +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Toggle Fullscreen keybind.select.name = Sec/silahi sik keybind.diagonal_placement.name = Diagonal Placement @@ -657,7 +723,6 @@ keybind.menu.name = Menu keybind.pause.name = Durdur keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap -keybind.dash.name = Kos keybind.chat.name = konus keybind.player_list.name = Oyuncu listesi keybind.console.name = Konsol @@ -680,7 +745,9 @@ mode.pvp.description = fight against other players locally. mode.attack.name = Attack mode.attack.description = No waves, with the goal to destroy the enemy base. mode.custom = Custom Rules + rules.infiniteresources = Infinite Resources +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode @@ -688,6 +755,7 @@ rules.enemyCheat = Infinite AI Resources rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Player Health Multiplier rules.playerdamagemultiplier = Player Damage Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = Resources & Building rules.title.player = Players rules.title.enemy = Enemies rules.title.unit = Units +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Esyalar content.liquid.name = Sivilar content.unit.name = Units @@ -752,6 +824,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = mini atomlar mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Orman yakici +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [LIGHT_GRAY]Patlayicilik: {0} item.flammability = [LIGHT_GRAY]Yanbilirlik: {0} item.radioactivity = [LIGHT_GRAY]Radyoaktivite: {0} @@ -767,6 +840,7 @@ mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% liquid.heatcapacity = [LIGHT_GRAY]isinma kapasitesi: {0} liquid.viscosity = [LIGHT_GRAY]Yari sivilik: {0} liquid.temperature = [LIGHT_GRAY]isi: {0} + block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.salt.name = Salt @@ -865,6 +939,8 @@ block.distributor.name = yayici block.sorter.name = secici block.inverted-sorter.name = Inverted Sorter block.message.name = Message +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Kapali dagatici block.silicon-smelter.name = Silikon eritici block.phase-weaver.name = Dokumaci @@ -878,6 +954,7 @@ block.coal-centrifuge.name = Coal Centrifuge block.power-node.name = Guc Dugumu block.power-node-large.name = buyuk Guc Dugumu block.surge-tower.name = Surge Tower +block.diode.name = Battery Diode block.battery.name = batarya block.battery-large.name = buyuk batarya block.combustion-generator.name = sicaklik jenaratoru @@ -901,6 +978,7 @@ block.mechanical-pump.name = Mekanikal pompa block.item-source.name = esya kaynagi block.item-void.name = esya deligi block.liquid-source.name = sivi kaynagi +block.liquid-void.name = Liquid Void block.power-void.name = guc deligi block.power-source.name = sonsuz guc block.unloader.name = bekletici @@ -930,6 +1008,7 @@ block.fortress-factory.name = Fortress Mech Factory block.revenant-factory.name = Revenant Fighter Factory block.repair-point.name = tamirci block.pulse-conduit.name = Pulse borusu +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Phase borusu block.liquid-router.name = sivi ayirici block.liquid-tank.name = sivi tanki @@ -1001,6 +1080,7 @@ tutorial.deposit = Deposit items into blocks by dragging from your ship to the d tutorial.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. 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. + item.copper.description = ise yayar bir materyal. Kazma makineleriyle yada tasimayla alinabilir. item.lead.description = Basit bir baslangic materyali. sivi tasimada kullanilabilir. item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. @@ -1062,6 +1142,7 @@ block.power-source.description = Infinitely outputs power. Sandbox only. block.item-source.description = Infinitely outputs items. Sandbox only. block.item-void.description = Destroys any items which go into it without using power. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = An advanced pump which doubles up speed by using block.thermal-pump.description = The ultimate pump. Three times as fast as a mechanical pump and the only pump which is able to retrieve lava. block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. block.liquid-tank.description = Stores a large amount of liquids. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. @@ -1105,6 +1187,7 @@ block.phase-conduit.description = Advanced liquid transport block. Uses power to block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. 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-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 13550abe69..f388a78ece 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -10,7 +10,9 @@ link.dev-builds.description = Dengesiz oyun sürümleri link.trello.description = Planlanan özellikler için resmi Trello Sayfası link.itch.io.description = Bilgisayar sürümleri için itch.io sayfası link.google-play.description = Google Play mağaza sayfası +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Resmi Mindustry wikisi +link.feathub.description = Suggest new features linkfail = Link açılamadı!\nURL kopyalandı. screenshot = Ekran görüntüsü {0} 'na kaydedildi screenshot.invalid = Harita çok büyük, muhtemelen ekran görüntüsü için yeterli bellek yok. @@ -18,12 +20,22 @@ gameover = Kaybettin gameover.pvp = [accent] {0}[] Takımı kazandı! highscore = [accent]Yeni rekor! copied = Panoya Kopyalandı. + load.sound = Sesler load.map = Haritalar load.image = Resimler load.content = İçerik load.system = Sistem load.mod = Modlar +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates + schematic = Şema schematic.add = Şemayı Kaydet... schematics = Şemalar @@ -40,6 +52,7 @@ schematic.saved = Şema Kaydedildi. schematic.delete.confirm = Bu şema tamamen yokedilecek. schematic.rename = Şemayı yeniden Adlandır schematic.info = {0}x{1}, {2} blok + stat.wave = Yenilen Dalgalar:[accent] {0} stat.enemiesDestroyed = Yok Edilen Düşmanlar:[accent] {0} stat.built = İnşa Edilen Yapılar:[accent] {0} @@ -47,6 +60,7 @@ stat.destroyed = Yok Edilen Yapılar:[accent] {0} stat.deconstructed = Yıkılan Yapılar:[accent] {0} stat.delivered = Gönderilen Kaynaklar: stat.rank = Rütbe: [accent]{0} + launcheditems = [accent]Gönderilen Kaynaklar launchinfo = Mavi ile belirtilen materyallerden edinmek için [unlaunched][[KALKIŞ] yapın. map.delete = "[accent]{0}[]" haritasını silmek istediğine emin misin? @@ -74,6 +88,7 @@ maps.browse = Haritaları gör continue = Devam et maps.none = [lightgray]Harita Bulunamadı! invalid = Geçersiz +pickcolor = Pick Color preparingconfig = Yapılandırma Hazırlanıyor preparingcontent = İçerik Hazırlanıyor uploadingcontent = İçerik Yükleniyor @@ -81,6 +96,7 @@ uploadingpreviewfile = Önizleme Dosyası Yükleniyor committingchanges = Değişiklikler Uygulanıyor done = Bitti feature.unsupported = Your device does not support this feature. + mods.alphainfo = Modların alfa aşamasında olduğunu ve [scarlet]oldukça hatalı olabileceklerini[] unutmayın.\nBulduğunuz sorunları Mindustry GitHub'ı veya Discord'una bildirin. mods.alpha = [accent](Alpha) mods = Modlar @@ -92,18 +108,25 @@ mod.enabled = [lightgray]Etkin mod.disabled = [scarlet]Devre Dışı mod.disable = Devre Dışı Bırak mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Etkinleştir mod.requiresrestart = Oyun mod değişikliklerini uygulamak için kapatılacak. mod.reloadrequired = [scarlet]Yeniden Yükleme Gerekli mod.import = Mod İçeri Aktar mod.import.github = GitHub Modu İçeri Aktar +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = Bu mod silinecek. mod.author = [LIGHT_GRAY]Yayıncı:[] {0} mod.missing = Bu kayıt yakın zamanda güncellediğiniz ya da artık yüklü olmayan modlar içermekte. Kayıt bozulmaları yaşanabilir. Kaydı yüklemek istediğinizden emin misiniz?\n[lightgray]Modlar:\n{0} mod.preview.missing = Bu modu atölyede yayınlamadan önce bir resim önizlemesi eklemelisiniz.\nMod dosyasına [accent]preview.png[] adlı bir resim yerleştirin ve tekrar deneyin. mod.folder.missing = Atölyede sadece klasör halindeki modlar yayınlanabilir.Bir modu klasöre çevirmek için, sadece mod dosyalarını bir klasöre çıkarın ve eski sıkıştırılmış dosyayı silin, sonra da oyunu tekrar başlatın ya da modlarınızı tekrar yükleyin. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. + about.button = Hakkında name = İsim: noname = Bir[accent] kullanıcı adı[] seçmelisin. @@ -132,6 +155,7 @@ 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.customClient = Bu sunucu özel sürümleri kabul etmiyor. Resmi bir sürüm indir. server.kicked.gameover = Oyun bitti! +server.kicked.serverRestarting = The server is restarting. server.versions = Kullandığın surum:[accent] {0}[]\nSunucunun sürümü:[accent] {1}[] host.info = [accent]host[], [scarlet]6567[] portunda bir sunucuya ev sahipliği yapıyor. \nAynı [lightgray]wifi veya yerel ağdaki[] herkes sunucu listelerinde senin sunucunu görebiliyor olmalı.\n\nEğer diğerlerinin herhangi bir yerden IP ile bağlanabilmesini istiyorsan [accent]port yönlendirmesi[] gerekli.\n\n[lightgray]Not: Eğer birisi senin yerel ağ oyununa katılmakta sorun yaşıyorsa güvenlik duvarı ayarlarında Mindustry'ye yerel ağ bağlantısı izni verdiğinden emin olun. Halka açık ağların zaman zaman sunucu aramaya engel olduğunu unutmayın. join.info = Burada, bağlanmak istediğin sunucunun [accent]IP[] adresini girebilir veya [accent]yerel ağ[] sunucularını görebilirsin..\nHem yerel ağ hem de geniş alan ağı çoklu oyuncu için destekleniyor.\n\n[lightgray]Not: Otomatik bir global sunucu listesi yok; eğer birisine IP adresi kullanarak bağlanmak istiyorsan IP adresini istemelisin. @@ -271,6 +295,7 @@ publishing = [accent]Yayınlanıyor... publish.confirm = Bunu yayınlamak istediğinize emin misiniz?\n[lightgray]önce Atölye EULA'sına uyduğunuza emin olun, yoksa yapıtlarınız gözükmeyecektir! publish.error = Nesneyi yayınlarken hata oluştu: {0} steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = Fırça editor.openin = Düzenleyici'de Aç editor.oregen = Maden Oluşumu @@ -347,6 +372,7 @@ editor.overwrite = [accent]Uyarı!\nBu işlem var olan bir haritanın üstüne y editor.overwrite.confirm = [scarlet]Uyarı![] Bu ada sahip bir harita zaten var. Onun üstüne yazmak ister misiniz? editor.exists = Bu ada sahip bir harita zaten var. editor.selectmap = Yüklemek için bir harita seçin: + toolmode.replace = Değiştir toolmode.replace.description = Sadece katı blokların üzerinde çizer. toolmode.replaceall = Hepsini Değiştir @@ -361,6 +387,7 @@ toolmode.fillteams = Takımları Doldur toolmode.fillteams.description = Bloklar yerine takımları doldurur. toolmode.drawteams = Takım Çiz toolmode.drawteams.description = Bloklar yerine takımşarı çizer.. + filters.empty = [lightgray]Hiç filtre yok! Aşağıdaki butonla bir adet ekleyin. filter.distort = Çarpıt filter.noise = Gürültü @@ -392,6 +419,7 @@ filter.option.floor2 = İkincil Duvar filter.option.threshold2 = İkincil Eşik filter.option.radius = Yarıçap filter.option.percentile = Yüzdelik + width = Eni: height = Boyu: menu = Menü @@ -407,6 +435,7 @@ tutorial = Öğretici tutorial.retake = Öğreticiyi Yeniden Al editor = Düzenleyici mapeditor = Harita Düzenleyicisi + abandon = Terk Et abandon.text = Burası ve bütün kaynaklar düşmana kaybedilecek. locked = Kilitli @@ -415,7 +444,7 @@ requirement.wave = Bölge {1}'de Dalga {0} requirement.core = {0}`da Düşman Çekirdeği Yok Et requirement.unlock = {0}'I Aç resume = Bölgeye Devam Et:\n[lightgray]{0} -bestwave = [lightgrayEn İyi Dalga: {0} +bestwave = [lightgray]En İyi Dalga: {0} launch = < KALKIŞ > launch.title = Kalkış Başarılı launch.next = [lightgray]Bir sonraki imkan {0}. dalgada olacak. @@ -437,6 +466,7 @@ zone.objective.survival = Hayatta Kal zone.objective.attack = Düşman Merkezini Yok Et add = Ekle... boss.health = Boss Canı + connectfail = [crimson]Bağlantı hatası:\n\n[accent]{0} error.unreachable = Sunucuya ulaşılamıyor.\nAdrwsin doğru yazıldığına emin misiniz? error.invalidaddress = Geçersiz adres. @@ -447,6 +477,7 @@ error.mapnotfound = Harita dosyası bulunamadı! error.io = Ağ I/O hatası. error.any = Bilinöeyen ağ hatası. error.bloom = Kamaşma başlatılamadı.\nCihazınız bu özelliği desteklemiyor olabilir. + zone.groundZero.name = Sıfır Noktası zone.desertWastes.name = Çöl Harabeleri zone.craters.name = Kraterler @@ -461,6 +492,7 @@ zone.saltFlats.name = Tuz Düzlükleri zone.impact0078.name = Çarpışma 0078 zone.crags.name = Kayalıklar zone.fungalPass.name = Mantar Geçidi + zone.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut.\nMümkün oldukça çok bakır ve kurşun topla.\nİlerle. zone.frozenForest.description = Burada, dağlara yakın bölgelerde bile, sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren. zone.desertWastes.description = Bu harabeler gemiş, öngörülemez, ve sektör yapılarının kalıntılarıyla kesişmekte.\nBölgede kömür mevcut, onu enerji için yak veya ondan grafit üret.\n\n[lightgray]Burada iniş bölgesi garanti edilemez. @@ -475,10 +507,12 @@ zone.nuclearComplex.description = Önceleri toryum üretme ve işleme ile görev zone.fungalPass.description = Dağlar ve sporlarla dolu aşağı bölgeler arasında bir geçiş bölgesi. Burada küçük düşman keşif üssü bulundu.\nBu üssü yok et.\nDagger ve Crawler birimleei kullan ve bölgedeki iki çekirdeği yık. zone.impact0078.description = zone.crags.description = + settings.language = Dil settings.data = Oyun Verisi settings.reset = Varsayılana Sıfırla settings.rebind = Tuşları Yeniden Ata +settings.resetKey = Reset settings.controls = Kontroller settings.game = Oyun settings.sound = Ses @@ -529,6 +563,7 @@ blocks.inaccuracy = İskalama Oranı blocks.shots = Atışlar blocks.reload = Atışlar/Sn blocks.ammo = Mermi + bar.drilltierreq = Daha İyi Matkap Gerekli bar.drillspeed = Matkap Hızı: {0}/s bar.pumpspeed = Pump Speed: {0}/s @@ -544,6 +579,9 @@ bar.heat = Isı bar.power = Enerji bar.progress = Build Progress bar.spawned = Birimler: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] hasar bullet.splashdamage = [stat]{0}[lightgray] alan hasarı ~[stat] {1}[lightgray] kare bullet.incendiary = [stat]yakıcı @@ -555,6 +593,7 @@ bullet.freezing = [stat]dondurucu bullet.tarred = [stat]katranlı bullet.multiplier = [stat]{0}[lightgray]x mermi çarpanı bullet.reload = [stat]{0}[lightgray]x atış hızı + unit.blocks = bloklar unit.powersecond = enerji birimi/saniye unit.liquidsecond = sıvı birimi/saniye @@ -567,6 +606,8 @@ unit.persecond = /sn unit.timesspeed = x hız unit.percent = % unit.items = eşya +unit.thousands = k +unit.millions = mil category.general = Genel category.power = Enerji category.liquids = Sıvılar @@ -579,6 +620,7 @@ setting.shadows.name = Gölgeler setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Lineer Filtreleme setting.hints.name = İpuçları +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animasyonlu Su setting.animatedshields.name = Animasyonlu Kalkanlar setting.antialias.name = Antialias[lightgray] (requires restart)[] @@ -601,12 +643,16 @@ setting.screenshake.name = Ekranı Salla setting.effects.name = Efektleri Görüntüle setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = Kontrolcü Hassasiyeti setting.saveinterval.name = Kayıt Aralığı setting.seconds = {0} Saniye +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Tam Ekran setting.borderlesswindow.name = Kenarsız Pencere[lightgray] (yeniden açmak gerekebilir) setting.fps.name = FPS Göster +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelleştir[lightgray] (animasyonları kapatır) setting.minimap.name = Haritayı Göster @@ -635,16 +681,36 @@ category.multiplayer.name = Çok Oyunculu command.attack = Saldır command.rally = Toplan command.retreat = Geri Çekil +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Binayı Temizle keybind.press = Bir tuşa basın... keybind.press.axis = Bir tuşa ya da yöne basın... keybind.screenshot.name = Harita Ekran Görüntüsü +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = x Ekseninde Hareket keybind.move_y.name = y Ekseninde Hareket +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Sıçrama keybind.schematic_select.name = Bölge Seç keybind.schematic_menu.name = Şema Menüsü keybind.schematic_flip_x.name = Şemayı X ekseninde Döndür keybind.schematic_flip_y.name = Şemayı Y Ekseninde Döndür +keybind.category_prev.name = Previous Category +keybind.category_next.name = Next Category +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Tam Ekran keybind.select.name = Seç/Ateş Et keybind.diagonal_placement.name = Çapraz Yerleştirme @@ -657,7 +723,6 @@ keybind.menu.name = Menü keybind.pause.name = Durdur keybind.pause_building.name = İnşaatı Duraklat/İnşaata Devam Et keybind.minimap.name = Mini Harita -keybind.dash.name = Sıçrama keybind.chat.name = Konuş keybind.player_list.name = Oyuncu Listesi keybind.console.name = Konsol @@ -680,7 +745,9 @@ mode.pvp.description = Yerel olarak başkaları ile savaş.\n[gray]Oynamak için mode.attack.name = Saldırı mode.attack.description = Düşman üssünü yok et. Dalga yok.\n[gray]Oynamak için haritada kırmızı çekirdek olması gerekir. mode.custom = Özel Kurallar + rules.infiniteresources = Sınırsız Kaynaklar +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Dalga Zamanlayıcısı rules.waves = Dalgalar rules.attack = Saldırı Modu @@ -688,6 +755,7 @@ rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Birim Üretim Hızı Çarpanı rules.unithealthmultiplier = Birim Canı Çarpanı +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = Oyuncu Canı Çarpanı rules.playerdamagemultiplier = Oyuncu Hasarı Çarpanı rules.unitdamagemultiplier = Birim Hasarı Çapanı @@ -706,6 +774,10 @@ rules.title.resourcesbuilding = Kaynaklar & İnşa rules.title.player = Oyuncular rules.title.enemy = Düşmanlar rules.title.unit = Unitler +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light + content.item.name = Eşyalar content.liquid.name = Sıvılar content.unit.name = Birimler @@ -752,6 +824,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Bomba Bölmesi mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Alevli Makineli Tüfek +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [lightgray]Patlama: {0}% item.flammability = [lightgray]Yanıcılık: {0}% item.radioactivity = [lightgray]Radyoaktivite: {0}% @@ -767,6 +840,7 @@ mech.buildspeed = [lightgray]İnşaat Hızı: {0}% liquid.heatcapacity = [lightgray]Isı Kapasitesi: {0} liquid.viscosity = [lightgray]Vizkosite: {0} liquid.temperature = [lightgray]Sıcaklık: {0} + block.sand-boulder.name = Kum Kaya Parçaları block.grass.name = Çimen block.salt.name = Tuz @@ -865,6 +939,8 @@ block.distributor.name = Dağıtıcı block.sorter.name = Ayıklayıcı block.inverted-sorter.name = Ters Ayıklayıcı block.message.name = Mesaj +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Taşma Geçiti block.silicon-smelter.name = Silikon Fırını block.phase-weaver.name = Faz Örücü @@ -878,6 +954,7 @@ block.coal-centrifuge.name = Kömür Santrifüjü block.power-node.name = Enerji Noktası block.power-node-large.name = Büyük Enerji Noktası block.surge-tower.name = Akı Kulesi +block.diode.name = Battery Diode block.battery.name = Batarya block.battery-large.name = Büyük Batarya block.combustion-generator.name = Termik Jeneratör @@ -901,6 +978,7 @@ block.mechanical-pump.name = Mekanik Pompa block.item-source.name = Sonsuz Eşya Kaynağı block.item-void.name = Eşya Yokedici block.liquid-source.name = Sonsuz Sıvı Kaynağı +block.liquid-void.name = Liquid Void block.power-void.name = Enerji Yokedici block.power-source.name = Sonsuz Enerji Kaynağı block.unloader.name = Boşaltıcı @@ -930,6 +1008,7 @@ block.fortress-factory.name = Fortress Robot Fabrikası block.revenant-factory.name = Revenant Savaşçı Fabrikası block.repair-point.name = Tamir Noktası block.pulse-conduit.name = Dalga Borusu +block.plated-conduit.name = Plated Conduit block.phase-conduit.name = Faz Borusu block.liquid-router.name = Sıvı Yönlendiricisi block.liquid-tank.name = Sıvı Tankı @@ -1001,6 +1080,7 @@ tutorial.deposit = Malzemeleri geminizden hedef bloğa sürükleyerek malzemeler tutorial.waves = [lightgray]Düşman[] yaklaşıyor.\n\nÇekirdeği 2 dalga boyunca koruyun. Ateş etmek için [accent]tıklayın[].\nDaha fazla taret ve matkap inşa edin ve daha fazla bakır toplayın. tutorial.waves.mobile = [lightgray]Düşman[] yaklaşıyor.\n\nÇekirdeği 2 dalga boyunca koruyun. Geminiz düşmanlara otomatik olarak ateş edecektir.\nDaha fazla taret ve matkap inşa edin ve daha fazla bakır toplayın. tutorial.launch = Belirli bir dalgaya ulaşınca, çekirdeği bulunduğu bölgeden [accent]kaldırabilir[], bütün binalarınızı arkada bırakıp [accent]çekirdeğinizdeki bütün materyallere sahip olabilirsiniz.[]Bu materyaller daha sonra yeni teknolojiler geliştirmek için kullanılabilir.\n\n[accent]Kalkış butonuna basın. + item.copper.description = En basit materyal. Her türlü blokda kullanılır. item.lead.description = Basit bir materyal. Elektronikte ve sıvı taşımada kullanılır. item.metaglass.description = Süper sert camdan bir bileşim. Sıvı dağıtımı ve depolamak için yaygın olarak kullanılır. @@ -1062,6 +1142,7 @@ block.power-source.description = Sonsuz enerji verir. Sadece Yaratıcı Modda. block.item-source.description = Seçilen eşyadan sonsuz verir. Sadece Yaratıcı Modda. block.item-void.description = Verilen eşyaları yok eder. Sadece Yaratıcı Modda. block.liquid-source.description = Seçilen sıvıyı sonsuz verir. Sadece Yaratıcı Modda. +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve silahları korumak için kullanışlıdır. block.copper-wall-large.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve taretleri korumak için kullanışlıdır.\nBirçok blok alan kaplar. block.titanium-wall.description = Orta derecede güçlü savunma bloğu.\nDüşmanlardan orta derecede koruma sağlar. @@ -1097,6 +1178,7 @@ block.rotary-pump.description = Daha gelişmiş bir pompa. Daha fazla sıvı dep block.thermal-pump.description = En iyi pompa. block.conduit.description = Temel sıvı taşıma bloğu. Sıvıları ileri taşır. Pompalar ve diğer borularla birlikte kullanılır. block.pulse-conduit.description = Gelişmiş bir sıvı taşıma bloğu. Sıvıları normal borulardan daha hızlı taşır ve onlardan daha fazla sıvı alır. +block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. block.liquid-router.description = Sıvıları bir yönden alıp diğer üç yöne eşit olarak dağıtır. Ayrıca kendisi de bir miktar sıvı depolayabilir. Sıvıları bir kaynaktan birden fazla hedefe iletmek için kullanılır. block.liquid-tank.description = Çok miktarda sıvıyı depolar. İhtiyaçları devamlı olmayan sıvıları yedek olarak saklamakta ya da önemli blokların devamlı olarak soğutulmasında kullanılabilir. block.liquid-junction.description = Çakışan iki boru hattı arasında bir köprü görevi görür. İki farklı borunun farklı hedeflere farklı sıvıları taşıdığı durumlarda kullanışlıdır. @@ -1105,6 +1187,7 @@ block.phase-conduit.description = Gelişmiş sıvı taşıma bloğu. Sıvıları block.power-node.description = Bağlı düğümlere enerji sağlar. Ayrıca dibindeki bloklardan da enerji alıp onlara enerji verebilir. block.power-node-large.description = Daha fazla menzil ve bağlantıya sahip daha gelişmiş bir güç düğümü block.surge-tower.description = Daha az bağlantı sayısına sahip oldukça uzun menzilli bir güç düğümü. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Enerji fazlasını yedek olarak saklar. Enerji açığında sakladığı enerjiyi salar. block.battery-large.description = Sıradan bataryadan çok daha fazla enerji depolar. block.combustion-generator.description = Kömür gibi yanıcı materyalleri yakarak enerji üretir. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index a0c1edf720..b78e537eff 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -10,8 +10,9 @@ link.dev-builds.description = Нестабільні версії link.trello.description = Офіційна дошка Trello для запланованих функцій link.itch.io.description = Itch.io сторінка, на якій можна завантажити гру link.google-play.description = Завантажити для Android з Google Play -link.f-droid.description = Перелік каталогу F-Droid +link.f-droid.description = Завантажити для Android з F-Droid link.wiki.description = Офіційна Mindustry wiki +link.feathub.description = Запропонувати нові функції linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну. screenshot = Зняток мапи збережено в {0} screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. @@ -19,6 +20,7 @@ gameover = Гра завершена gameover.pvp = [accent] {0}[] команда перемогла! highscore = [YELLOW]Новий рекорд! copied = Скопійовано. + load.sound = Звуки load.map = Мапи load.image = Зображення @@ -27,6 +29,13 @@ load.system = Система load.mod = Модифікації load.scripts = Скрипти +be.update = Доступна нова збірка Bleeding Edge: +be.update.confirm = Завантажити і перезавантажити зараз? +be.updating = Оновлення… +be.ignore = Ігнорувати +be.noupdates = Оновлень не знайдено. +be.check = Перевірити на наявність оновлень + schematic = Схема schematic.add = Зберегти схему… schematics = Схеми @@ -37,12 +46,13 @@ schematic.importfile = Імпортувати файл schematic.browseworkshop = Переглянути в Майстерні schematic.copy = Копіювати в буфер обміну schematic.copy.import = Імпортувати з клавіатури -schematic.shareworkshop = Поширити в Майстерні +schematic.shareworkshop = Поширити в Майстерню schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Відобразити схему schematic.saved = Схема збережена. schematic.delete.confirm = Ця схема буде повністю випалена. schematic.rename = Перейменувати схему. schematic.info = {0}x{1}, {2} блоків + stat.wave = Хвиль відбито:[accent] {0} stat.enemiesDestroyed = Ворогів знищено:[accent] {0} stat.built = Будівель збудувано:[accent] {0} @@ -50,6 +60,7 @@ stat.destroyed = Будівель знищено:[accent] {0} stat.deconstructed = Будівель декоструйовано[accent] {0} stat.delivered = Ресурсів запущено: stat.rank = Фінальний рахунок: [accent]{0} + launcheditems = [accent]Запущені предмети launchinfo = [unlaunched]Натисніть на кнопку «[[ЗАПУСК]», щоб ваше ядро отримало предмети, які виділені синім кольором. map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»? @@ -67,7 +78,7 @@ customgame = Користувацька гра newgame = Нова гра none = <нічого> minimap = Мінімапа -position = Позиція +position = Місцерозташування close = Закрити website = Веб-сайт quit = Вихід @@ -84,41 +95,38 @@ uploadingcontent = Вивантаження вмісту uploadingpreviewfile = Вивантаження файлу передперегляду committingchanges = Здійснення змін done = Зроблено -mods = Модифікації +feature.unsupported = Your device does not support this feature. + mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]може бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.alpha = [scarlet](Альфа) -mods.none = [LIGHT_GRAY]Модифікацій не знайдено! -mod.enabled = [lightgray]Увімкнено -mod.disabled = [scarlet]Вимкнено -mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. -mod.import = Імпортувати модифікацію -mod.remove.confirm = Цю модифікацію буде видалено. -mod.author = [LIGHT_GRAY]Автор:[] {0} -mods.alpha = [scarlet](Альфа) mods = Модифікації mods.none = [LIGHT_GRAY]Модифікацій не знайдено! -mods.guide = Посібник зі створення модифицій +mods.guide = Посібник з модифицій mods.report = Повідомити про ваду mods.openfolder = Відкрити теку модифікацій mod.enabled = [lightgray]Увімкнено mod.disabled = [scarlet]Вимкнено -mod.disable = Вимкнути +mod.disable = Вимкн. mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. -mod.requiresversion = [scarlet]Необхідна версія гри: [accent]{0} +mod.requiresversion = [scarlet]Необхідна мінімальна версія гри: [accent]{0} mod.missingdependencies = [scarlet]Відсутні залежності: {0} +mod.erroredcontent = [scarlet]Помилки при завантаженнні +mod.errors = Сталася помилка при завантаження змісту. +mod.noerrorplay = [scarlet]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх. mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена. -mod.enable = Увімкнути +mod.enable = Увімк. mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.import = Імпортувати модифікацію -mod.import.github = Імпортувати модификацію з GitHub -mod.item.remove =Цей предмет є частиною модифікації [accent] '«{0}»[]. Щоб видалити його, видаліть цю модифікацію. +mod.import.github = Завантажити мод з GitHub +mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоб видалити його, видаліть цю модифікацію. mod.remove.confirm = Цю модифікацію буде видалено. mod.author = [LIGHT_GRAY]Автор:[] {0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} mod.preview.missing = До публікації цієї модифікації в Майстерні, ви повинні додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модификаціями і спробуйте знову. mod.folder.missing = Тільки модификації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модификацію у теку, просто розархівуйте цей файлу теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модификації. mod.scripts.unsupported = Ваш пристрій не підтримує скрипти модифікацій. Деякі модифифікаціх не будуть працювати правильно. + about.button = Про гру name = Ім’я: noname = Спочатку придумайте[accent] собі ім’я[]. @@ -133,7 +141,7 @@ players = Гравців: {0} players.single = {0} гравець на сервері server.closing = [accent]Закриття сервера… server.kicked.kick = Ви були вигнані з сервера! -server.kicked.whitelist = Ви не в білому спискі сервері. +server.kicked.whitelist = Ви не в білому спискі сервера! server.kicked.serverClose = Сервер закрито. server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте. server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру! @@ -147,6 +155,7 @@ server.kicked.nameEmpty = Ваше ім’я має містити принай server.kicked.idInUse = Ви вже на цьому сервері! Підключення двох облікових записів не дозволяється. server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію. server.kicked.gameover = Гра завершена! +server.kicked.serverRestarting = Сервер перезавантажується server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[] host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережі[], повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то[accent] переадресація порту []обов’язкова.\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер. join.info = Тут ви можете ввести [accent]IP сервера[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Тут немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити створювача сервера дати свій ip. @@ -209,8 +218,8 @@ save.delete.confirm = Ви дійсно хочете видалити це зб save.delete = Видалити save.export = Експортувати збереження save.import.invalid = [accent]Це збереження недійсне! -save.import.fail = [crimson]Не вдалося імпортувати збереження: [accent]{0} -save.export.fail = [crimson]Не вдалося експортувати збереження: [accent]{0} +save.import.fail = [crimson]Не вдалося завантажити збереження: [accent]{0} +save.export.fail = [crimson]Не вдалося вивантажити збереження: [accent]{0} save.import = Імпортувати збереження save.newslot = Ім’я збереження: save.rename = Перейменувати @@ -240,12 +249,12 @@ cancel = Скасувати openlink = Відкрити посилання copylink = Скопіювати посилання back = Назад -data.export = Експортувати дані -data.import = Импортувати дані -data.exported = Дані імпортовано. +data.export = Вивантажити дані +data.import = Завантажити дані +data.exported = Дані вивантажено. data.invalid = Це не дійсні ігрові дані. -data.import.confirm = Імпорт зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. -classic.export = Експортувати класичні дані +data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. +classic.export = Вивантажити класичні дані classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у застосунку Mindustry Classic? quit.confirm = Ви впевнені, що хочете вийти? quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання? @@ -286,6 +295,7 @@ publishing = [accent]Публікація… publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться! publish.error = Сталася помилка при публікації предмета: {0} steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0} + editor.brush = Пензлик editor.openin = Відкрити в редакторі editor.oregen = Генерація руд @@ -317,7 +327,7 @@ waves.invalid = Недійсні хвилі у буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Вороги не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. editor.default = [lightgray]<За замовчуванням> -details = Деталі… +details = Подробиці… edit = Редагувати… editor.name = Назва: editor.spawn = Створити бойову одиницю @@ -325,7 +335,7 @@ editor.removeunit = Видалити бойову одиницю editor.teams = Команди editor.errorload = Помилка завантаження зображення:\n[accent] {0} editor.errorsave = Помилка збереження зображення:\n[accent]{0} -editor.errorimage = Це зображення, а не мапа. Не змінюйте розширення, очікуючи, що це запрацює.\n\nЯкщо Ви хочете імпортувати застарілку мапу, то використовуйте кнопку «Імпортувати застаріле зображення» у редакторі. +editor.errorimage = Це зображення, а не мапа. Не змінюйте розширення, очікуючи, що це запрацює.\n\nЯкщо ви хочете імпортувати застарілку мапу, то використовуйте кнопку «Імпортувати застаріле зображення» у редакторі. editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується. editor.errornot = Це не мапа. editor.errorheader = Цей файл мапи недійсний або пошкоджений. @@ -362,6 +372,7 @@ editor.overwrite = [accent]Попередження!\nЦе перезапису editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її? editor.exists = Мапа за такою назвою вже існує. editor.selectmap = Виберіть мапу для завантаження: + toolmode.replace = Замінити toolmode.replace.description = Малює тільки\nна суцільних блоках. toolmode.replaceall = Замінити все @@ -376,6 +387,7 @@ toolmode.fillteams = Змінити блок в команді toolmode.fillteams.description = Змінює належність\nблоків до команди. toolmode.drawteams = Змінити команду блока toolmode.drawteams.description = Змінює належність\nблока до команди. + filters.empty = [lightgray]Немає фільтрів! Додайте хоча б один за допомогою кнопки нижче. filter.distort = Спотворення filter.noise = Шум @@ -407,6 +419,7 @@ filter.option.floor2 = Друга поверхня filter.option.threshold2 = Вторинний граничний порог filter.option.radius = Радіус filter.option.percentile = Спад + width = Ширина: height = Висота: menu = Меню @@ -422,12 +435,13 @@ tutorial = Навчання tutorial.retake = Відкрити навчання editor = Редактор mapeditor = Редактор мап + abandon = Покинути abandon.text = Ця зона і всі її ресурси будуть втрачені. locked = Заблоковано complete = [lightgray]Досягнута: -requirement.wave = Досягніть хвилі {0} у {1} -requirement.core = Знишьте вороже ядро у {0} +requirement.wave = Досягніть хвилі {0} у зоні «{1}» +requirement.core = Знищьте вороже ядро у {0} requirement.unlock = Розблокуйте {0} resume = Відновити зону:\n[lightgray]{0} bestwave = [lightgray]Найкраща хвиля: {0} @@ -436,22 +450,23 @@ launch.title = Запуск вдалий launch.next = [lightgray]наступна можливість на {0}-тій хвилі launch.unable2 = [scarlet]ЗАПУСК неможливий.[] launch.confirm = Це видалить всі ресурси у Вашому ядрі.\nВи не зможете повернутися до цієї бази. -launch.skip.confirm = Якщо Ви пропустите зараз, Ви не зможете не запускати до більш пізніх хвиль. +launch.skip.confirm = Якщо ви пропустите зараз, Ви не зможете не запускати до більш пізніх хвиль. uncover = Розкрити configure = Вивантажити конфігурацію bannedblocks = Заборонені блоки addall = Додати все -configure.locked = [lightgray]Можливість розблокувати вивантаження ресурсів буде доступна на {0}-тій хвилі. +configure.locked = {0}[lightgray]Тільки після цього можливість розблокувати вивантаження ресурсів буде доступна. configure.invalid = Кількість повинна бути числом між 0 та {0}. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. -zone.requirement.complete = Ви досягли {0}-тої хвилі,\nВимоги до зони «{1}» виконані. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.requirement.complete = Ви досягли {0}-тої хвилі. \nВимоги до зони «{1}» виконані. +zone.config.unlocked = Вивантаження розблоковано:[lightgray]\n{0} zone.resources = Виявлені ресурси: zone.objective = [lightgray]Мета: [accent]{0} zone.objective.survival = Вижити zone.objective.attack = Знищити вороже ядро add = Додати… boss.health = Здоров’я босу + connectfail = [crimson]Помилка підключення: [accent]{0} error.unreachable = Сервер не доступний. error.invalidaddress = Некоректна адреса. @@ -462,7 +477,8 @@ error.mapnotfound = Файл мапи не знайдено error.io = Мережева помилка введення-виведення error.any = Невідома мережева помилка error.bloom = Не вдалося ініціалізувати цвітіння.\nВаш пристрій, мабуть, не підтримує це. -zone.groundZero.name = Нульова земля + +zone.groundZero.name = Відправний пункт zone.desertWastes.name = Пустельні відходи zone.craters.name = Кратери zone.frozenForest.name = Крижаний ліс @@ -476,6 +492,7 @@ zone.saltFlats.name = Соляні рівнини zone.impact0078.name = Імпульс 0078 zone.crags.name = Скелі zone.fungalPass.name = Грибний перевал + zone.groundZero.description = Оптимальне місце для повторних ігор. Низька ворожа загроза. Мало ресурсів. \nЗбирайте якомога більше свинцю та міді. \nЙдіть далі. zone.frozenForest.description = Навіть тут, ближче до гір, спори поширилися. Холодна температура не може їх утримувати тут завжди.\nЗважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами. zone.desertWastes.description = Ці відходи є величезними, непередбачуваними і перетинаються з занедбаними секторальними структурами.\nВугілля присутнє в регіоні. Спаліть його для енергії або синтезуйте у графіт.\n\n[lightgray]Це місце посадки не можна гарантувати. @@ -490,10 +507,11 @@ zone.nuclearComplex.description = Колишній об’єкт для виро zone.fungalPass.description = Перехідна зона між високими і низькими горами, земля яких покрита спорами. Тут знаходиться невелика розвідувальна база ворога.\nЗнижте її.\nВикористовуйте одиниці Кинджал і Камікадзе. zone.impact0078.description = <вставити опис тут> zone.crags.description = <вставити опис тут> + settings.language = Мова settings.data = Ігрові дані settings.reset = Скинути за замовчуванням -settings.rebind = Зміна +settings.rebind = Змінити settings.resetKey = Скинути settings.controls = Керування settings.game = Гра @@ -515,7 +533,7 @@ blocks.output = Вихід blocks.booster = Прискорювач block.unknown = [lightgray]??? blocks.powercapacity = Місткість енергії -blocks.powershot = Енергія/постріл +blocks.powershot = Енергія за постріл blocks.damage = Шкода blocks.targetsair = Повітряні мішені blocks.targetsground = Наземні мішені @@ -527,7 +545,7 @@ blocks.liquidcapacity = Місткість рідини blocks.powerrange = Діапазон передачі енергії blocks.powerconnections = Максимальна кількість з’єднань blocks.poweruse = Енергії використовує -blocks.powerdamage = Енергія/урон +blocks.powerdamage = Енергія/шкода blocks.itemcapacity = Місткість предметів blocks.basepowergeneration = Базова генерація енергії blocks.productiontime = Час виробництва @@ -545,6 +563,7 @@ blocks.inaccuracy = Розкид blocks.shots = Постріли blocks.reload = Постріли/секунду blocks.ammo = Боєприпаси + bar.drilltierreq = Потребується кращий бур bar.drillspeed = Швидкість буріння: {0} за с. bar.pumpspeed = Швидкість викачування: {0} за с. @@ -562,6 +581,7 @@ bar.progress = Хід будування bar.spawned = Бойов. од.: {0}/{1} bar.input = Ввід bar.output = Вивід + bullet.damage = [stat]{0}[lightgray] шкода bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] блок. bullet.incendiary = [stat]запальний @@ -573,12 +593,11 @@ bullet.freezing = [stat]заморожування bullet.tarred = [stat]дьогтьовий bullet.multiplier = [stat]{0}[lightgray]x патронів bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджання + unit.blocks = блоки unit.powersecond = одиниць енергії за секунду unit.liquidsecond = одиниць рідини за секунду unit.itemssecond = предметів за секунду -unit.thousands = тис -unit.millions = млн unit.liquidunits = одиниць рідини unit.powerunits = одиниць енергії unit.degrees = град. @@ -587,6 +606,8 @@ unit.persecond = за секунду unit.timesspeed = x швидкість unit.percent = % unit.items = предм. +unit.thousands = тис +unit.millions = млн category.general = Загальне category.power = Енергія category.liquids = Рідини @@ -622,6 +643,7 @@ setting.screenshake.name = Тряска екрану setting.effects.name = Ефекти setting.destroyedblocks.name = Показувати зруйновані блоки setting.conveyorpathfinding.name = Пошук шляху для встановлення конвейерів +setting.coreselect.name = Дозволити схематичні ядра setting.sensitivity.name = Чутливість контролера setting.saveinterval.name = Інтервал збереження setting.seconds = {0} с @@ -723,6 +745,7 @@ mode.pvp.description = боріться проти інших гравців.\n[ mode.attack.name = Атака mode.attack.description = Зруйнуйте ворожу базу.\n[gray]Потрібно червоне ядро на мапі для гри. mode.custom = Користувацькі правила + rules.infiniteresources = Нескінченні ресурси rules.reactorexplosions = Вибухи реактора rules.wavetimer = Таймер хвиль @@ -732,6 +755,7 @@ rules.enemyCheat = Нескінченні ресурси для ШІ rules.unitdrops = Ресурс бойових одиниць rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць rules.unithealthmultiplier = Множник здоров’я бойових одиниць +rules.blockhealthmultiplier = Множник здоров’я блоків rules.playerhealthmultiplier = Множник здоров’я гравця rules.playerdamagemultiplier = Множник шкоди гравця rules.unitdamagemultiplier = Множник шкоди бойових одиниць @@ -753,6 +777,7 @@ rules.title.unit = Бойов. од. rules.title.experimental = Есперементальне! rules.lighting = Світлотінь rules.ambientlight = Навколишнє світло + content.item.name = Предмети content.liquid.name = Рідини content.unit.name = Бойові одиниці @@ -815,6 +840,7 @@ mech.buildspeed = [lightgray]Швидкість будування: {0}% liquid.heatcapacity = [lightgray]Теплоємність: {0} liquid.viscosity = [lightgray]В’язкість: {0} liquid.temperature = [lightgray]Температура: {0} + block.sand-boulder.name = Пісочний валун block.grass.name = Трава block.salt.name = Сіль @@ -849,7 +875,7 @@ block.core-nucleus.name = Ядро «Атом» block.deepwater.name = Глибоководдя block.water.name = Вода block.tainted-water.name = Забруднена вода -block.darksand-tainted-water.name = Темний пісок з забрудненою водою +block.darksand-tainted-water.name = Темний пісок із забрудненою водою block.tar.name = Дьоготь block.stone.name = Камінь block.sand.name = Пісок @@ -952,6 +978,7 @@ block.mechanical-pump.name = Механічна помпа block.item-source.name = Нескінченне джерело предметів block.item-void.name = Предметний вакуум block.liquid-source.name = Нескінченне джерело рідин +block.liquid-void.name = Liquid Void block.power-void.name = Енергетичний вакуум block.power-source.name = Нескінченне джерело енергії block.unloader.name = Розвантажувач @@ -1033,30 +1060,31 @@ unit.eradicator.name = Випалювач unit.lich.name = Лич unit.reaper.name = Жнець tutorial.next = [lightgray]<Натисніть для продовження> -tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочніть з[accent] видобування міді[]. Використовуйте [[WASD] для руху.\n[accent] Утримуйте [[Ctrl] під час прокрутки миші[] для приближення і віддалення. Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді +tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочніть з [accent]видобутку міді[]. Використовуйте [[WASD] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть екраном, щоб рухатися.\n[accent] Зведіть або розведіть 2 пальця [] для приближення і віддалення відповідно.\nз[accent] видобування міді.[] Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді -tutorial.drill = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку свердла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім натиснути [accent][[1][] швидко, незалежно від того, яка вкладка відкрита.\n[accent]Натисніть ПКМ[], щоб зупинити будування.tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення .\nНатисніть[accent] клавішу X[], щоб скасувати розміщення. -tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення.\nPress the[accent] X button[] to cancel placement. -tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли Ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[] -tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш, щоб розмістити у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\n\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено -tutorial.conveyor.mobile = [accent]Конвеєри[] використовується для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви вибрали.\nВикористовуйте колесо прокрутки, щоб обертати блоки перед їх розміщенням\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено -tutorial.turret = Оборонні споруди повинні бути побудовані для відбиття[lightgray] ворогів[].\nПобудуйте[accent] башточку «Подвійна»[] біля вашої бази. -tutorial.drillturret = «Подвійна» потребує [accent] мідні боєприпаси []для стрільби.\nРозмістіть бур біля башточки\nПроведіть конвеєри до башточки, щоб заповнити її боєприпасами.\n\n[accent]Доставлено боєприпасів: 0/1 -tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисність пробіл для павзи.tutorial.launch -tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]атисніть кнопку зліва вгорі для павзи. +tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку із зображенням свердла знизу праворуч.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснути [accent][[1][], незалежно від того, яка вкладка відкрита.\n[accent]Натисніть ПКМ[], щоб зупинити будування. +tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку із зображенням сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent]галочку[] нижче, щоб підтвердити розміщення .\nНатисніть [accent]кнопку X[], щоб скасувати розміщення. +tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[] +tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш, щоб розмістити у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро.tutorial.conveyor.mobile = [accent]Конвеєри[] використовується для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви вибрали.\nВикористовуйте колесо прокрутки, щоб обертати блоки перед їх розміщенням\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено +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 = Оборонні споруди повинні бути побудовані для відбиття[lightgray] ворогів[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази. +tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башточки\nПроведіть конвеєри до башточки, щоб заповнити її боєприпасами.\n\n[accent]Доставлено боєприпасів: 0/1 +tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисність пробіл для павзи. +tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисніть кнопку вгорі ліворуч для павзи. tutorial.unpause = Тепер натисність пробіл, щоб зняти павзу. tutorial.unpause.mobile = Тепер натисність туди ще раз, щоб зняти павзу. -tutorial.breaking = Блоки часто повинні бути знищені.\n[accent]Утримуючи ПКМ[] Ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні. +tutorial.breaking = Блоки часто повинні бути знищені.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні. tutorial.breaking.mobile = Блоки часто повинні бути знищені.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоб зламати його.\nЗнищіть область, утримуючи палець протягом декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоб підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні. -tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисність на блок[] з предметами на ньому, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n[accent]Вилучіть трохи міді з ядра.[] +tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисність на блок[] з предметами, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n[accent]Вилучіть трохи міді з ядра.[] tutorial.deposit = Покладіть предмети в блоки, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[] -tutorial.waves = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль.[accent] Натисніть[], щоб стріляти.\nСтворіть більше башточок і бурів. Добудьте більше міді. -tutorial.waves.mobile = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль. Ваш корабель буде автоматично атакувати ворогів.\nСтворіть більше башточок і бурів. Добудьте більше міді. -tutorial.launch = Як тільки ви досягнете певної хвилі, Ви зможете[accent] запустити ядро[], залишивши захисні сили позаду та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску. +tutorial.waves = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль.[accent] Натисніть ЛКМ[], щоб стріляти.\nСтворіть більше башт і бурів. Добудьте більше міді. +tutorial.waves.mobile = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль. Ваш корабель буде автоматично атакувати ворогів.\nСтворіть більше башт і бурів. Добудьте більше міді. +tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши захисні сили позаду та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску. + item.copper.description = Найбільш базовий будівельний матеріал. Широко використовується у всіх типах блоків. item.lead.description = Основний стартовий матеріал. Широко застосовується в електроніці та транспортуванні рідин. item.metaglass.description = Супер жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини. -item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та електроізоляції. +item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як компонент. item.sand.description = Поширений матеріал, який широко використовується при виплавці, як при сплавленні, так і в якості відходів. item.coal.description = Окам’янілі рослинні речовини, що утворюються задовго до посіву. Широко використовується для виробництва пального та ресурсів. item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків. @@ -1074,11 +1102,11 @@ liquid.slag.description = Різні види розплавленого мет liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена в вугілля в якості палива або використана як куля. liquid.cryofluid.description = Інертна, не роз’їдаюча рідина, створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості охолоджуючої рідини. mech.alpha-mech.description = Стандартний керований мех. Заснований на бойовій одиниці «Кинджал», з оновленими бронею та можливостями будування. Наносить більше шкоди, ніж «Дротик». -mech.delta-mech.description = Швидкий, легкоброньований мех, зроблений для тактики «атакуй і біжи». Наносить мало шкоди будівлям, але може дуже швидко вбити великі групи підрозділів противника своєю дуговою блискавкою. +mech.delta-mech.description = Швидкий, легкоброньований мех, зроблений для тактики «атакуй і втікай». Наносить мало шкоди будівлям, але може дуже швидко вбити великі групи підрозділів противника своєю дуговою блискавкою. mech.tau-mech.description = Мех підтримки. Ремонтує союзні блоки, стріляючи по них. Може зцілювати союзників у радіусі його ремонтної здатності. mech.omega-mech.description = Об’ємний і добре броньований мех, зроблений для фронтових штурмів. Його броня може перекрити до 90% пошкоджень, що надходять. mech.dart-ship.description = Стандартний корабель управління. Швидко видобуває ресурси. Достатньо швидкий і легкий, але має мало наступальних можливостей. -mech.javelin-ship.description = Корабель для стратегії атакуй та біжи». Хоча спочатку він повільний, потім вже може розганятися до великих швидкостей і літати над ворожими форпостами, завдаючи великої кількості шкоди своїми блискавками та ракетами. +mech.javelin-ship.description = Корабель, який використовується для стратегії «атакуй та втікай». Хоча спочатку він повільний, потім вже може розганятися до великих швидкостей і літати над ворожими форпостами, завдаючи великої кількості шкоди своїми блискавками та ракетами. mech.trident-ship.description = Важкий бомбардувальник, побудований для будування та знищення ворожих укріплень. Дуже добре броньований. mech.glaive-ship.description = Великий, добре броньований бойовий корабель. Оснащений запальним ретранслятором. Високо маневрений. unit.draug.description = Примітивний дрон, який добуває ресурси. Дешевий для виробництва. Автоматично видобуває мідь і свинець поблизу. Доставляє видобуті ресурси до найближчого ядра. @@ -1089,7 +1117,7 @@ unit.crawler.description = Наземна одиниця, що складаєт unit.titan.description = Вдосконалений броньований наземний блок. Нападає як на наземні, так і повітряні цілі. Оснащений двома мініатюрними вогнеметами класу Випалювач. unit.fortress.description = Артилерійний мех. Оснащений двома модифікованими гарматами типу «Град» для дальнього нападу на ворожі структури та підрозділи. unit.eruptor.description = Важкий мех, призначеней для знесення конструкцій. Вистрілює потік шлаків у ворожі укріплення, розплавляючи їх і підпалюючи летючі речовини. -unit.wraith.description = Швидкий перехоплювач, який використовується для тактики «атакуй і біжи». Пріоритет — енергетичні генератори. +unit.wraith.description = Швидкий перехоплювач, який використовується для тактики «атакуй і втікай». Пріоритет — генератори енергії. unit.ghoul.description = Важкий килимовий бомбардувальник. Пробиває ворожі структури, орієнтуючись на віжливу інфраструктуру. unit.revenant.description = Важкий ракетний масив. block.message.description = Зберігає повідомлення. Використовується для комунікаціх між союзниками. @@ -1103,19 +1131,20 @@ block.alloy-smelter.description = Поєднує титан, свинець, к block.cryofluidmixer.description = Змішує воду і дрібний порошок титану титану в кріогенну рідину. Основне використання у торієвому реактору. block.blast-mixer.description = Подрібнює і змішує скупчення спор з піратитом для отримання вибухової суміші. block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піратит. -block.melter.description = Розплавляє брухт у шлак для подальшої переробки або використання у башточках «Хвиля». +block.melter.description = Розплавляє брухт у шлак для подальшої переробки або використання у баштах «Хвиля». block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджений результат. -block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти +block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти. block.pulverizer.description = Подрібнює брухт дрібного піску. block.coal-centrifuge.description = Нафта перетворюється у шматки вугілля. block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує. block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця -block.power-source.description = Нескінченно виводить енергію. Тільки пісочниця -block.item-source.description = Нескінченно виводить предмети. Тільки пісочниця -block.item-void.description = Знищує будь-які предмети. Тільки пісочниця -block.liquid-source.description = Нескінченно виводить рідини. Тільки пісочниця -block.copper-wall.description = Дешевий захисний блок.\nКорисна для захисту ядра та башточок у перші кілька хвиль. -block.copper-wall-large.description = Дешевий захисний блок.\nКорисна для захисту ядра та башточок у перші кілька хвиль.\nОхоплює кілька плиток. +block.power-source.description = Нескінченно виводить енергію. +block.item-source.description = Нескінченно виводить предмети. +block.item-void.description = Знищує будь-які предмети. +block.liquid-source.description = Нескінченно виводить рідини. +block.liquid-void.description = Removes any liquids. Sandbox only. +block.copper-wall.description = Дешевий захисний блок.\nКорисна для захисту ядра та башто у перші кілька хвиль. +block.copper-wall-large.description = Дешевий захисний блок.\nКорисна для захисту ядра та башт у перші кілька хвиль.\nОхоплює кілька плиток. block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів. block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.\nОхоплює кілька плиток. block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з'єднання енергетичних вузлів. @@ -1149,7 +1178,7 @@ block.rotary-pump.description = Удосконалений насос. Насо block.thermal-pump.description = Найкращий насос. block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами. block.pulse-conduit.description = Вдосконалений блок транспортування рідини. Транспортує рідини швидше і зберігає більше, ніж стандартні трубопроводи. -block.plated-conduit.description =Переміщує рідини з тією ж швидкістю, як і імпульсні трубопроводи, але має більше міцності. Не приймає рідин з боків окрім інших трубопроводів.\nПротікає менше. +block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, як і імпульсні трубопроводи, але має більше міцності. Не приймає рідин з боків окрім інших трубопроводів.\nПротікає менше. block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней. block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях з непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. block.liquid-junction.description = Діє як міст для двох каналів перетину. Корисно в ситуаціях, коли два різні трубопроводи перевозять різні рідини в різні місця. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index edb60b0a77..884ac22dd0 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -12,6 +12,7 @@ link.itch.io.description = itch.io 上的 PC 版下载 link.google-play.description = Google Play 页面 link.f-droid.description = F-Droid 页面 link.wiki.description = Mindustry 官方 Wiki +link.feathub.description = Suggest new features linkfail = 打开链接失败!\n网址已复制到您的剪贴板。 screenshot = 屏幕截图已保存到 {0} screenshot.invalid = 地图太大,可能没有足够的内存用于截图。 @@ -26,6 +27,14 @@ load.image = 图片加载中 load.content = 内容加载中 load.system = 系统加载中 load.mod = 模组加载中 +load.scripts = Scripts + +be.update = A new Bleeding Edge build is available: +be.update.confirm = Download it and restart now? +be.updating = Updating... +be.ignore = Ignore +be.noupdates = No updates found. +be.check = Check for updates schematic = 蓝图 schematic.add = 保存蓝图… @@ -101,17 +110,22 @@ mod.disable = 禁用 mod.delete.error = 无法删除模组。可能文件被占用。 mod.requiresversion = [scarlet]所需的游戏版本:[accent]{0} mod.missingdependencies = [scarlet]缺少依赖条件:{0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]“{0}”模组缺少依赖条件:[accent] {1}\n[lightgray]需要先下载上述模组。\n此模组现在将自动禁用。 mod.enable = 启用 mod.requiresrestart = 需要重启使模组生效。 mod.reloadrequired = [scarlet]需要重启 mod.import = 导入模组 mod.import.github = 导入 GitHub 模组 +mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod. mod.remove.confirm = 此模组将被删除。 mod.author = [LIGHT_GRAY]作者:[] {0} mod.missing = 此存档包含您最近已更新或者现在未安装的模组。存档可能会损坏。确定要加载它吗?\n[lightgray]模组:\n{0} mod.preview.missing = 在创意工坊中发布此模组前,您必须添加一则预览图像。\n请将名为[accent] preview.png[] 的图像放入模组文件夹,然后重试。 mod.folder.missing = 只有文件夹形式的模组能在创意工坊上发布。\n若要将任何模组转换为文件夹,只需将其文件解压缩到文件夹中并删除旧压缩包,然后重新启动游戏或重新加载模组。 +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. about.button = 关于 name = 名字: @@ -141,6 +155,7 @@ server.kicked.nameEmpty = 无效的名字! server.kicked.idInUse = 你已在这个服务器上!不允许用两个账号连接。 server.kicked.customClient = 这个服务器不支持自定义版本。请下载官方版本。 server.kicked.gameover = 游戏结束! +server.kicked.serverRestarting = The server is restarting. server.versions = 客户端版本:[accent] {0}[]\n服务器版本:[accent] {1}[] host.info = [accent]创建局域网游戏[]按钮会在[scarlet] 6567 []端口运行一个服务器。[]\n任何在同一个[lightgray] Wi-Fi 或本地网络[]下的人应该都可以在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过 IP 地址连接,你需要设定[accent]端口转发[]。\n\n[lightgray]注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了 Mindustry 访问本地网络。 join.info = 您可以输入[accent]服务器的 IP 地址[]来连接,或寻找[accent]本地网络[]中的服务器来连接。\n支持局域网或广域网的多人游戏。\n\n[lightgray]注意:没有全球服务器列表;如果你想通过 IP 地址连接某个服务器,你需要向房主询问 IP 地址。 @@ -497,6 +512,7 @@ settings.language = 语言 settings.data = 游戏数据 settings.reset = 恢复默认设置 settings.rebind = 重新绑定 +settings.resetKey = Reset settings.controls = 控制 settings.game = 游戏 settings.sound = 声音 @@ -590,6 +606,8 @@ unit.persecond = /秒 unit.timesspeed = 倍 速度 unit.percent = % unit.items = 物品 +unit.thousands = k +unit.millions = mil category.general = 普通 category.power = 能量 category.liquids = 液体 @@ -625,6 +643,7 @@ setting.screenshake.name = 屏幕抖动 setting.effects.name = 显示效果 setting.destroyedblocks.name = 显示摧毁的块 setting.conveyorpathfinding.name = 传送带放置寻路 +setting.coreselect.name = Allow Schematic Cores setting.sensitivity.name = 控制器灵敏度 setting.saveinterval.name = 自动保存间隔 setting.seconds = {0} 秒 @@ -736,6 +755,7 @@ rules.enemyCheat = 敌人(红队)无限资源 rules.unitdrops = 敌人出生点 rules.unitbuildspeedmultiplier = 单位生产速度倍数 rules.unithealthmultiplier = 单位生命倍数 +rules.blockhealthmultiplier = Block Health Multiplier rules.playerhealthmultiplier = 玩家生命倍数 rules.playerdamagemultiplier = 玩家伤害倍数 rules.unitdamagemultiplier = 单位伤害倍数 @@ -804,6 +824,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = 炸弹 mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = 火焰机枪 +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [lightgray]爆炸性:{0}% item.flammability = [lightgray]易燃性:{0}% item.radioactivity = [lightgray]放射性:{0}% @@ -957,6 +978,7 @@ block.mechanical-pump.name = 机械泵 block.item-source.name = 无限物品 block.item-void.name = 物品黑洞 block.liquid-source.name = 无限液体 +block.liquid-void.name = Liquid Void block.power-void.name = 能源黑洞 block.power-source.name = 无限能源 block.unloader.name = 装卸器 @@ -1120,6 +1142,7 @@ block.power-source.description = 无限输出能量。仅限沙盒。 block.item-source.description = 无限输出物品。仅限沙盒。 block.item-void.description = 销毁输入的所有物品。仅限沙盒。 block.liquid-source.description = 无限输出液体。仅限沙盒。 +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = 廉价的防御方块。\n适合在前几个波次中保护核心和炮塔。 block.copper-wall-large.description = 廉价的防御方块。\n适合在前几个波次中保护核心和炮塔。\n占多个方格。 block.titanium-wall.description = 中等强度的防御方块。\n提供中等强度的防御以抵御敌人。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 050884d00f..aad624d1e2 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -12,6 +12,7 @@ link.itch.io.description = itch.io 電腦版下載網頁 link.google-play.description = Google Play 商店頁面 link.f-droid.description = F-Droid 目錄頁面 link.wiki.description = 官方 Mindustry 維基 +link.feathub.description = 建議新功能 linkfail = 無法打開連結!\n我們已將該網址複製到您的剪貼簿。 screenshot = 截圖保存到{0} screenshot.invalid = 地圖太大了,可能沒有足夠的內存用於截圖。 @@ -28,6 +29,13 @@ load.system = 系統載入中 load.mod = 模組載入中 load.scripts = 指令檔載入中 +be.update = 有新的尖端版本可用: +be.update.confirm = 下載並重啟遊戲? +be.updating = 更新中 +be.ignore = 忽略 +be.noupdates = 沒有新的更新。 +be.check = 檢查是否有新的更新 + schematic = 藍圖 schematic.add = 儲存藍圖... schematics = 藍圖 @@ -88,6 +96,7 @@ uploadingpreviewfile = 上傳預覽文件 committingchanges = 提交變更 done = 完成 feature.unsupported = 您的設備不支持此功能。 + mods.alphainfo = 請記住,模組仍處於Alpha狀態,[scarlet]可能會有很多BUG[].\n向Mindustry GitHub或Discord報告發現的任何問題。 mods.alpha = [accent](Alpha) mods = 模組 @@ -97,12 +106,15 @@ mods.report = 回報錯誤 mods.openfolder = 開啟模組資料夾 mod.enabled = [lightgray]已啟用 mod.disabled = [scarlet]已禁用 -mod.enable = 啟用 mod.disable = 禁用 mod.delete.error = 無法刪除模組,檔案可能在使用中。 -mod.requiresversion = [scarlet]遊戲版本要求:[accent]{0} -mod.missingdependencies = [scarlet]缺少依賴項目: {0} +mod.requiresversion = [scarlet]最低遊戲版本要求:[accent]{0} +mod.missingdependencies = [scarlet]缺少必須項目: {0} +mod.erroredcontent = [scarlet]內容錯誤 +mod.errors = 載入內容時發生錯誤 +mod.noerrorplay = [scarlet]你使用了有錯誤的模組。[] 遊戲前請先禁用相關模組或修正錯誤。 mod.nowdisabled = [scarlet]「{0}」模組缺少必須項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。 +mod.enable = 啟用 mod.requiresrestart = 遊戲將立即關閉以套用模組變更。 mod.reloadrequired = [scarlet]需要重新載入 mod.import = 匯入模組 @@ -113,6 +125,7 @@ mod.author = [lightgray]作者:[] {0} mod.missing = 此存檔含有您最近更新或不再安裝的模組。可能會發生存檔損毀。您確定要載入嗎?\n[lightgray]模組:\n{0} mod.preview.missing = 在工作坊發佈這個模組前,您必須添加預覽圖。\n在該模組的資料夾中放置一個名為[accent] preview.png[]的圖片並重試。 mod.folder.missing = 只有資料夾形式的模組可以在工作坊上發布。\n要將模組轉換為資料夾,只需將其文件解壓縮到資料夾並刪除舊的.zip檔,然後重新啟動遊戲或重新載入模組。 +mod.scripts.unsupported = 你的裝置不支援模組指令檔。部分模組將無法正常運作。 about.button = 關於 name = 名稱: @@ -133,15 +146,16 @@ server.kicked.serverClose = 伺服器已關閉。 server.kicked.vote = 您已被投票踢出伺服器,再見。 server.kicked.clientOutdated = 客戶端版本過舊!請更新遊戲! server.kicked.serverOutdated = 伺服器版本過舊!請聯絡伺服主更新伺服器! -server.kicked.banned = 您已經從這個伺服器被封禁。 +server.kicked.banned = 您已經在這個伺服器中被封禁。 server.kicked.typeMismatch = 該伺服器與您的版本不相容。 server.kicked.playerLimit = 該伺服器已滿。請等待一個空位置。 server.kicked.recentKick = 您最近曾被踢出伺服器。\n請稍後再進行連線。 server.kicked.nameInUse = 伺服器中已經\n有人有相同的名稱了。 server.kicked.nameEmpty = 你的名稱必須至少包含一個字母或數字。 -server.kicked.idInUse = 你已經在伺服器中!不允許用兩個帳號。 +server.kicked.idInUse = 你已經在伺服器中!不允許使用兩個帳號。 server.kicked.customClient = 這個伺服器不支持自訂客戶端,請下載官方版本。 server.kicked.gameover = 遊戲結束! +server.kicked.serverRestarting = 伺服器正在重新啟動。 server.versions = 您的遊戲版本:[accent] {0}[]\n伺服器遊戲版本:[accent] {1}[] host.info = [accent]建立伺服器[]按鍵會在連接埠[scarlet]6567[]建立一個伺服器。\n所有跟您在同一個[lightgray]網路或區域網路[]環境的玩家應該能在他們的伺服器清單中找到您的伺服器。\n\n如果您希望網際網路上的玩家透過IP 位址連線到您的伺服器,您必須設定[accent]連接埠轉發[]。\n\n[lightgray]注意:如果區域網路內有玩家無法連線至您的伺服器,請務必確認您已於防火牆設定中開放Mindustry存取您的區域網路。請注意公共網路有時不允許搜尋伺服器。 join.info = 您可以在此輸入欲連線的[accent]伺服器IP位址[],或尋找[accent]區域網路[]內的伺服器。目前支援區域網路與網際網路連線。\n\n[lightgray]注意:並沒有自動的網際網路伺服器清單,如果您想透過IP位址連線到他人的伺服器,您必須向他們詢問IP位址。 @@ -178,7 +192,7 @@ confirmban = 您確定要封禁該玩家嗎? confirmkick = 您確定要踢出該玩家嗎? confirmvotekick = 您確定要投票剔除該名玩家嗎? confirmunban = 您確定要解除封禁該玩家嗎? -confirmadmin = 您確定要提升這個玩家為管理員嗎? +confirmadmin = 您確定要晉升這個玩家為管理員嗎? confirmunadmin = 您確定要解除這個玩家的管理員嗎? joingame.title = 加入遊戲 joingame.ip = IP位址: @@ -253,7 +267,7 @@ pausebuilding = [accent][[{0}][]暫停建造 resumebuilding = [scarlet][[{0}][]恢復建造 wave = [accent]第{0}波 wave.waiting = [lightgray]將於{0}秒後抵達 -wave.waveInProgress = 第[lightgray]波正在進行中 +wave.waveInProgress = [lightgray]波次進行中 waiting = [lightgray]等待中... waiting.players = 等待玩家中... wave.enemies = [lightgray]剩下{0}個敵人 @@ -265,9 +279,9 @@ custom = 自訂 builtin = 内建 map.delete.confirm = 確認要刪除地圖嗎?此操作無法撤回! map.random = [accent]隨機地圖 -map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[ROYAL]藍色[]的核心。 -map.nospawn.pvp = 這個地圖沒有核心讓敵人重生!請在編輯器中添加一個[SCARLET]紅色[]的核心。 -map.nospawn.attack = 這個地圖沒有敵人核心讓可以攻擊!請在編輯器中添加一個[SCARLET]紅色[]的核心。 +map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[accent]橘色[]的核心。 +map.nospawn.pvp = 這個地圖沒有敵對核心讓玩家重生!請在編輯器中添加一個[SCARLET]不是橘色[]的核心。 +map.nospawn.attack = 這個地圖沒有敵人核心可以攻擊!請在編輯器中添加一個[SCARLET]紅色[]的核心。 map.invalid = 地圖載入錯誤:地圖可能已經損壞。 workshop.update = 更新項目 workshop.error = 提取工作坊詳細信息時出錯: {0} @@ -281,6 +295,7 @@ publishing = [accent]發佈中... publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意Workshop EULA,否則您的項目將不會顯示! publish.error = 發佈項目時出錯: {0} steam.error = Steam 服務初始化失敗.\n錯誤: {0} + editor.brush = 粉刷 editor.openin = 在編輯器中開啟 editor.oregen = 礦石生成 @@ -298,7 +313,7 @@ editor.newmap = 新地圖 workshop = 工作坊 waves.title = 波次 waves.remove = 移除 -waves.never = 〈從來沒有〉 +waves.never = 〈永遠〉 waves.every = 每 waves.waves = 波次 waves.perspawn = 每次生成 @@ -370,7 +385,7 @@ toolmode.eraseores = 清除礦物 toolmode.eraseores.description = 僅清除礦物。 toolmode.fillteams = 填充團隊 toolmode.fillteams.description = 填充團隊而不是方塊。 -toolmode.drawteams = Draw Teams +toolmode.drawteams = 繪製團隊 toolmode.drawteams.description = 繪製團隊而不是方塊。 filters.empty = [lightgray]沒有過濾器!使用下面的按鈕添加一個。 @@ -532,7 +547,7 @@ blocks.powerconnections = 最大連接數 blocks.poweruse = 能量使用 blocks.powerdamage = 能量/傷害 blocks.itemcapacity = 物品容量 -blocks.basepowergeneration = 基本能量生產 +blocks.basepowergeneration = 基礎能量生產 blocks.productiontime = 生產時間 blocks.repairtime = 方塊完全修復時間 blocks.speedincrease = 速度提升 @@ -600,12 +615,12 @@ category.items = 物品 category.crafting = 需求 category.shooting = 射擊 category.optional = 可選的強化 - setting.landscape.name = 鎖定水平畫面 setting.shadows.name = 陰影 setting.blockreplace.name = 方塊建造建議 setting.linear.name = 線性過濾 setting.hints.name = 提示 +setting.buildautopause.name = 自動暫停建築 setting.animatedwater.name = 水動畫 setting.animatedshields.name = 護盾動畫 setting.antialias.name = 消除鋸齒[lightgray](需要重啟遊戲)[] @@ -628,14 +643,18 @@ setting.screenshake.name = 畫面抖動 setting.effects.name = 顯示特效 setting.destroyedblocks.name = 顯示被破壞的方塊 setting.conveyorpathfinding.name = 自動輸送帶放置規劃 +setting.coreselect.name = 允許藍圖包含核心 setting.sensitivity.name = 控制器靈敏度 setting.saveinterval.name = 自動存檔間隔 setting.seconds = {0}秒 +setting.blockselecttimeout.name = 跳過方塊建造時距 +setting.milliseconds = {0}毫秒 setting.fullscreen.name = 全螢幕 setting.borderlesswindow.name = 無邊框窗口[lightgray](可能需要重啟遊戲) -setting.fps.name = 顯示FPS +setting.fps.name = 顯示FPS與Ping +setting.blockselectkeys.name = 顯示方塊選擇快捷鍵 setting.vsync.name = 垂直同步 -setting.pixelate.name = 像素化[lightgray](可能降低性能) +setting.pixelate.name = 像素化[lightgray](會關閉動畫) setting.minimap.name = 顯示小地圖 setting.position.name = 顯示玩家位置 setting.musicvol.name = 音樂音量 @@ -662,17 +681,36 @@ category.multiplayer.name = 多人 command.attack = 攻擊 command.rally = 集結 command.retreat = 撤退 -keybind.clear_building.name = 清除建築物 +placement.blockselectkeys = \n[lightgray]按鍵:[{0}, +keybind.clear_building.name = 清除建築指令 keybind.press = 按一下按鍵... keybind.press.axis = 按一下軸向或按鍵... keybind.screenshot.name = 地圖截圖 keybind.toggle_power_lines.name = 顯示能量激光 keybind.move_x.name = 水平移動 keybind.move_y.name = 垂直移動 +keybind.mouse_move.name = 跟隨滑鼠 +keybind.dash.name = 衝刺 keybind.schematic_select.name = 選擇區域 keybind.schematic_menu.name = 藍圖目錄 keybind.schematic_flip_x.name = X軸翻轉 keybind.schematic_flip_y.name = Y軸翻轉 +keybind.category_prev.name = 前一個類別 +keybind.category_next.name = 下一個類別 +keybind.block_select_left.name = 選取方塊左 +keybind.block_select_right.name = 選取方塊右 +keybind.block_select_up.name = 選取方塊上 +keybind.block_select_down.name = 選取方塊下 +keybind.block_select_01.name = 類別/方塊選取 1 +keybind.block_select_02.name = 類別/方塊選取 2 +keybind.block_select_03.name = 類別/方塊選取 3 +keybind.block_select_04.name = 類別/方塊選取 4 +keybind.block_select_05.name = 類別/方塊選取 5 +keybind.block_select_06.name = 類別/方塊選取 6 +keybind.block_select_07.name = 類別/方塊選取 7 +keybind.block_select_08.name = 類別/方塊選取 8 +keybind.block_select_09.name = 類別/方塊選取 9 +keybind.block_select_10.name = 類別/方塊選取 10 keybind.fullscreen.name = 全螢幕切換 keybind.select.name = 選取 keybind.diagonal_placement.name = 對角線放置 @@ -685,7 +723,6 @@ keybind.menu.name = 主選單 keybind.pause.name = 暫停遊戲 keybind.pause_building.name = 暫停/恢復建造 keybind.minimap.name = 小地圖 -keybind.dash.name = 衝刺 keybind.chat.name = 聊天 keybind.player_list.name = 玩家列表 keybind.console.name = 終端機 @@ -699,14 +736,14 @@ keybind.drop_unit.name = 放下單位 keybind.zoom_minimap.name = 縮放小地圖 mode.help.title = 模式說明 mode.survival.name = 生存 -mode.survival.description = 一般模式。有限的資源與自動來襲的波次。 +mode.survival.description = 一般模式。有限的資源與自動來襲的波次。\n[gray]地圖中需要敵人生成點。 mode.sandbox.name = 沙盒 -mode.sandbox.description = 無限的資源,與不倒數計時的波次。 +mode.sandbox.description = 無限的資源與不倒數計時的波次。 mode.editor.name = 編輯 mode.pvp.name = 對戰 -mode.pvp.description = 和其他玩家競爭、戰鬥。 +mode.pvp.description = 和其他玩家競爭、戰鬥。\n[gray]地圖中需要至少兩個不同顏色的核心。 mode.attack.name = 進攻 -mode.attack.description = 沒有波次,目標是摧毀敵人的基地。 +mode.attack.description = 目標是摧毀敵人的基地。\n[gray]地圖中需要有一個紅色核心。 mode.custom = 自訂規則 rules.infiniteresources = 無限資源 @@ -717,11 +754,12 @@ rules.attack = 攻擊模式 rules.enemyCheat = 電腦無限資源 rules.unitdrops = 單位掉落物 rules.unitbuildspeedmultiplier = 單位建設速度倍數 -rules.unithealthmultiplier = 單位耐久度倍數 -rules.playerhealthmultiplier = 玩家耐久度倍數 +rules.unithealthmultiplier = 單位生命值倍數 +rules.blockhealthmultiplier = 建築物耐久度倍數 +rules.playerhealthmultiplier = 玩家生命值倍數 rules.playerdamagemultiplier = 玩家傷害倍數 rules.unitdamagemultiplier = 單位傷害倍數 -rules.enemycorebuildradius = 敵人核心無建設半徑︰[lightgray](格) +rules.enemycorebuildradius = 敵人核心禁止建設半徑︰[lightgray](格) rules.respawntime = 重生時間︰[lightgray](秒) rules.wavespacing = 波次間距︰[lightgray](秒) rules.buildcostmultiplier = 建設成本倍數 @@ -765,7 +803,6 @@ liquid.water.name = 水 liquid.slag.name = 熔渣 liquid.oil.name = 原油 liquid.cryofluid.name = 冷凍液 - mech.alpha-mech.name = 阿爾法 mech.alpha-mech.weapon = 重型機關槍 mech.alpha-mech.ability = 自修復 @@ -788,21 +825,22 @@ mech.trident-ship.weapon = 轟炸艙 mech.glaive-ship.name = 偃月刀 mech.glaive-ship.weapon = 火焰機關槍 item.corestorable = [lightgray]核心可儲存: {0} -item.explosiveness = [lightgray]爆炸性:{0} -item.flammability = [lightgray]易燃性:{0} -item.radioactivity = [lightgray]放射性:{0} -unit.health = [lightgray]耐久度:{0} +item.explosiveness = [lightgray]爆炸性:{0}% +item.flammability = [lightgray]易燃性:{0}% +item.radioactivity = [lightgray]放射性:{0}% +unit.health = [lightgray]生命值:{0} unit.speed = [lightgray]速度:{0} mech.weapon = [lightgray]武器:{0} mech.health = [lightgray]血量:{0} mech.itemcapacity = [lightgray]物品容量:{0} -mech.minespeed = [lightgray]採礦速度:{0} +mech.minespeed = [lightgray]採礦速度:{0}% mech.minepower = [lightgray]採礦能力:{0} mech.ability = [lightgray]能力:{0} mech.buildspeed = [lightgray]建造速度: {0}% liquid.heatcapacity = [lightgray]熱容量:{0} liquid.viscosity = [lightgray]粘性:{0} liquid.temperature = [lightgray]溫度:{0} + block.sand-boulder.name = 沙礫 block.grass.name = 草 block.salt.name = 鹽 @@ -940,6 +978,7 @@ block.mechanical-pump.name = 機械泵 block.item-source.name = 物品源 block.item-void.name = 物品虛空 block.liquid-source.name = 液體源 +block.liquid-void.name = Liquid Void block.power-void.name = 能量虛空 block.power-source.name = 無限能量源 block.unloader.name = 裝卸器 @@ -1021,9 +1060,9 @@ unit.eradicator.name = 殲滅者 unit.lich.name = 巫妖 unit.reaper.name = 收掠者 tutorial.next = [lightgray]<按下以繼續> -tutorial.intro = 您已進入[scarlet] Mindustry 教學。[]\n使用[[WASD鍵]來移動.\n在滾動滾輪時[accent]按住 [[Ctrl][]來放大縮小畫面.\n從[accent]開採銅礦[]開始吧靠近它,然後在靠近核心的位置點擊銅礦。\n\n[accent]{0}/{1}銅礦 +tutorial.intro = 您已進入[scarlet] Mindustry 教學。[]\n使用[[WASD鍵]來移動.\n滾動滾輪來放大縮小畫面.\n從[accent]開採銅礦[]開始吧靠近它,然後在靠近核心的位置點擊銅礦。\n\n[accent]{0}/{1}銅礦 tutorial.intro.mobile = 您已進入[scarlet] Mindustry 教學。[]\n滑動螢幕即可移動。\n[accent]用兩指捏[]來縮放畫面。\n從[accent]開採銅礦[]開始吧。靠近它,然後在靠近核心的位置點擊銅礦。\n\n[accent]{0}/{1}銅礦 -tutorial.drill = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n在銅礦脈上放置一個鑽頭。 +tutorial.drill = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n在銅礦脈上放置一個鑽頭。\n不論在哪個選單,您也可以用快速按下按鍵[accent][[2][]然後[accent][[1][]來選擇鑽頭。\n[accent]滑鼠右擊[]停止建造。 tutorial.drill.mobile = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n點選右下角的鑽頭選項\n選擇[accent]機械鑽頭[].\n通過點擊將其放置在銅礦上,然後按下下方的[accent]確認標誌[]確認您的選擇\n按下[accent] X 按鈕[] 取消放置. tutorial.blockinfo = 每個方塊都有不同的屬性。每個鑽頭只能開採特定的礦石。\n查看方塊的資訊和屬性,[accent]在建造目錄時按下"?"鈕。[]\n\n[accent]立即訪問機械鑽頭的屬性資料。[] tutorial.conveyor = [accent]輸送帶[]能夠將物品運輸到核心。\n製作一條從鑽頭開始到核心的輸送帶。 @@ -1039,12 +1078,14 @@ tutorial.breaking.mobile = 方塊經常需要被拆除。\n[accent]選擇拆除 tutorial.withdraw = 在某些情況下,直接從方塊中取出物品是必要的。\n[accent]點擊有物品的方塊[],然後[accent]點擊在方框中的物品[]以將其取出。\n可以通過[accent]點擊或長按[]來取出物品。\n\n[accent]從核心中取出一些銅。[] tutorial.deposit = 通過將物品從船上拖到目標方塊,將物品放入方塊中。\n\n[accent]將您的銅放到核心中。[] tutorial.waves = [lightgray]敵人[]來臨。\n\n保護核心抵抗兩波攻擊。\n建造更多的砲塔和鑽頭。開採更多的銅。 +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. tutorial.launch = 一旦您達到特定的波數, 您就可以[accent] 發射核心[],放棄防禦並[accent]獲取核心中的所有資源。[]\n這些資源可以用於研究新科技。\n\n[accent]按下發射按鈕。 + item.copper.description = 最基本的結構材料。在各種類型的方塊中廣泛使用。 item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和液體運輸方塊。 item.metaglass.description = 一種超高強度的玻璃。廣泛用於液體分配和存儲。 -item.graphite.description = 礦化的碳,用於彈藥和電氣絕緣。 -item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和助熔劑。 +item.graphite.description = 礦化的碳,用於彈藥和電氣元件。 +item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和作為助熔劑。 item.coal.description = 遠在「播種」事件前就形成的植物化石。一種常見並容易獲得的燃料。 item.titanium.description = 一種罕見的超輕金屬,被廣泛運用於運輸液體、鑽頭和飛行載具。 item.thorium.description = 一種高密度的放射性金屬,用作結構支撐和核燃料。 @@ -1061,10 +1102,10 @@ liquid.slag.description = 各種不同類型的熔融金屬混合在一起的液 liquid.oil.description = 用於進階材料製造的液體。可以轉化為煤炭作為燃料或噴灑向敵方單位後點燃作為武器。 liquid.cryofluid.description = 一種安定,無腐蝕性的液體,用水及鈦混合成。具有很高的比熱。廣泛的用作冷卻劑。 mech.alpha-mech.description = 標準的控制機甲。改良自匕首機甲,加強了裝甲及建造能力。 -mech.delta-mech.description = 一種快速、輕裝甲的機甲,用於打帶跑的攻擊。對結構造成的傷害很小,但可以用弧形閃電武器很快殺死大量敵方單位。 +mech.delta-mech.description = 一種快速、輕裝甲的機甲,用於打帶跑的攻擊。對結構體造成的傷害很小,但可以用弧形閃電武器很快殺死大量敵方單位。 mech.tau-mech.description = 支援機甲。射擊友方方塊以修復它們。可以使用它的修復能力治療一定範圍內的友軍。 -mech.omega-mech.description = 一種笨重、重裝甲的機甲,用於前線突擊。它的裝甲能力可以阻擋高達90%的傷害。 -mech.dart-ship.description = 標準的控制飛船。快速、輕便,但攻擊能力低、採礦速度慢。 +mech.omega-mech.description = 一種笨重、重裝甲的機甲,用於前線突擊。 +mech.dart-ship.description = 標準的控制飛船。採礦速度快。相當快速、輕便,但攻擊能力低落。 mech.javelin-ship.description = 一種打帶跑的突襲艇。雖然最初很慢,但它可以加速到很快的速度,並飛過敵人的前哨站,利用其閃電能力和導彈造成大量的傷害。 mech.trident-ship.description = 一種重型轟炸機。用以摧毀敵方建築。有相當的裝甲。 mech.glaive-ship.description = 一種大型、配有良好裝甲的砲艇。配備燃燒機關槍。高機動性。 @@ -1101,6 +1142,7 @@ block.power-source.description = 無限輸出能量。僅限沙盒。 block.item-source.description = 無限輸出物品。僅限沙盒。 block.item-void.description = 不使用能量銷毀任何進入它的物品。僅限沙盒。 block.liquid-source.description = 無限輸出液體。僅限沙盒。 +block.liquid-void.description = Removes any liquids. Sandbox only. block.copper-wall.description = 一種便宜的防禦方塊。\n用於前幾波防衛核心和砲塔。 block.copper-wall-large.description = 一種便宜的防禦方塊。\n用於前幾波防禦核心和砲塔\n佔據多個方塊。 block.titanium-wall.description = 一個中等強度的防禦方塊。\n提供對敵人的適度保護。 @@ -1205,4 +1247,3 @@ block.omega-mech-pad.description = 改裝現在的船隻,換成龐大、具有 block.javelin-ship-pad.description = 改裝現在的船隻,換成具有閃電武器、強大而快速的攔截機。\n站在上面雙擊機坪以使用它。 block.trident-ship-pad.description = 改裝現在的船隻,換成具有相當不錯裝甲的重型轟炸機。\n站在上面雙擊機坪以使用它。 block.glaive-ship-pad.description = 改裝現在的船隻,換成具有重裝甲的砲艇。\n站在上面雙擊機坪以使用它。 - diff --git a/core/assets/contributors b/core/assets/contributors index 93fcb7ccc4..afe1bc3b45 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -83,3 +83,5 @@ amrsoll ねらひかだ Draco Quezler +Alicila +Daniel Dusek diff --git a/core/assets/fonts/font.ttf b/core/assets/fonts/font.ttf index 7a32355454..6b585dcbdd 100644 Binary files a/core/assets/fonts/font.ttf and b/core/assets/fonts/font.ttf differ diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index 9b3fb5dcb4..6ce3070968 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -16,4 +16,5 @@ const boolp = method => new Boolp(){get: method} const cons = method => new Cons(){get: method} const prov = method => new Prov(){get: method} const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) -const Calls = Packages.io.anuke.mindustry.gen.Call \ No newline at end of file +Call = Packages.mindustry.gen.Call +const Calls = Call //backwards compat \ No newline at end of file diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 87f498bbef..22d746b420 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -18,61 +18,63 @@ const boolp = method => new Boolp(){get: method} const cons = method => new Cons(){get: method} const prov = method => new Prov(){get: method} const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) -const Calls = Packages.io.anuke.mindustry.gen.Call -importPackage(Packages.io.anuke.arc) -importPackage(Packages.io.anuke.arc.collection) -importPackage(Packages.io.anuke.arc.func) -importPackage(Packages.io.anuke.arc.graphics) -importPackage(Packages.io.anuke.arc.graphics.g2d) -importPackage(Packages.io.anuke.arc.math) -importPackage(Packages.io.anuke.arc.scene) -importPackage(Packages.io.anuke.arc.scene.actions) -importPackage(Packages.io.anuke.arc.scene.event) -importPackage(Packages.io.anuke.arc.scene.style) -importPackage(Packages.io.anuke.arc.scene.ui) -importPackage(Packages.io.anuke.arc.scene.ui.layout) -importPackage(Packages.io.anuke.arc.scene.utils) -importPackage(Packages.io.anuke.arc.util) -importPackage(Packages.io.anuke.mindustry) -importPackage(Packages.io.anuke.mindustry.ai) -importPackage(Packages.io.anuke.mindustry.content) -importPackage(Packages.io.anuke.mindustry.core) -importPackage(Packages.io.anuke.mindustry.ctype) -importPackage(Packages.io.anuke.mindustry.editor) -importPackage(Packages.io.anuke.mindustry.entities) -importPackage(Packages.io.anuke.mindustry.entities.bullet) -importPackage(Packages.io.anuke.mindustry.entities.effect) -importPackage(Packages.io.anuke.mindustry.entities.traits) -importPackage(Packages.io.anuke.mindustry.entities.type) -importPackage(Packages.io.anuke.mindustry.entities.type.base) -importPackage(Packages.io.anuke.mindustry.entities.units) -importPackage(Packages.io.anuke.mindustry.game) -importPackage(Packages.io.anuke.mindustry.gen) -importPackage(Packages.io.anuke.mindustry.graphics) -importPackage(Packages.io.anuke.mindustry.input) -importPackage(Packages.io.anuke.mindustry.maps) -importPackage(Packages.io.anuke.mindustry.maps.filters) -importPackage(Packages.io.anuke.mindustry.maps.generators) -importPackage(Packages.io.anuke.mindustry.maps.zonegen) -importPackage(Packages.io.anuke.mindustry.type) -importPackage(Packages.io.anuke.mindustry.ui) -importPackage(Packages.io.anuke.mindustry.ui.dialogs) -importPackage(Packages.io.anuke.mindustry.ui.fragments) -importPackage(Packages.io.anuke.mindustry.ui.layout) -importPackage(Packages.io.anuke.mindustry.world) -importPackage(Packages.io.anuke.mindustry.world.blocks) -importPackage(Packages.io.anuke.mindustry.world.blocks.defense) -importPackage(Packages.io.anuke.mindustry.world.blocks.defense.turrets) -importPackage(Packages.io.anuke.mindustry.world.blocks.distribution) -importPackage(Packages.io.anuke.mindustry.world.blocks.liquid) -importPackage(Packages.io.anuke.mindustry.world.blocks.logic) -importPackage(Packages.io.anuke.mindustry.world.blocks.power) -importPackage(Packages.io.anuke.mindustry.world.blocks.production) -importPackage(Packages.io.anuke.mindustry.world.blocks.sandbox) -importPackage(Packages.io.anuke.mindustry.world.blocks.storage) -importPackage(Packages.io.anuke.mindustry.world.blocks.units) -importPackage(Packages.io.anuke.mindustry.world.consumers) -importPackage(Packages.io.anuke.mindustry.world.meta) -importPackage(Packages.io.anuke.mindustry.world.meta.values) -importPackage(Packages.io.anuke.mindustry.world.modules) -importPackage(Packages.io.anuke.mindustry.world.producers) +Call = Packages.mindustry.gen.Call +const Calls = Call //backwards compat +importPackage(Packages.arc) +importPackage(Packages.arc.func) +importPackage(Packages.arc.graphics) +importPackage(Packages.arc.graphics.g2d) +importPackage(Packages.arc.math) +importPackage(Packages.arc.math.geom) +importPackage(Packages.arc.scene) +importPackage(Packages.arc.scene.actions) +importPackage(Packages.arc.scene.event) +importPackage(Packages.arc.scene.style) +importPackage(Packages.arc.scene.ui) +importPackage(Packages.arc.scene.ui.layout) +importPackage(Packages.arc.scene.utils) +importPackage(Packages.arc.struct) +importPackage(Packages.arc.util) +importPackage(Packages.mindustry) +importPackage(Packages.mindustry.ai) +importPackage(Packages.mindustry.content) +importPackage(Packages.mindustry.core) +importPackage(Packages.mindustry.ctype) +importPackage(Packages.mindustry.editor) +importPackage(Packages.mindustry.entities) +importPackage(Packages.mindustry.entities.bullet) +importPackage(Packages.mindustry.entities.effect) +importPackage(Packages.mindustry.entities.traits) +importPackage(Packages.mindustry.entities.type) +importPackage(Packages.mindustry.entities.type.base) +importPackage(Packages.mindustry.entities.units) +importPackage(Packages.mindustry.game) +importPackage(Packages.mindustry.gen) +importPackage(Packages.mindustry.graphics) +importPackage(Packages.mindustry.input) +importPackage(Packages.mindustry.maps) +importPackage(Packages.mindustry.maps.filters) +importPackage(Packages.mindustry.maps.generators) +importPackage(Packages.mindustry.maps.zonegen) +importPackage(Packages.mindustry.type) +importPackage(Packages.mindustry.ui) +importPackage(Packages.mindustry.ui.dialogs) +importPackage(Packages.mindustry.ui.fragments) +importPackage(Packages.mindustry.ui.layout) +importPackage(Packages.mindustry.world) +importPackage(Packages.mindustry.world.blocks) +importPackage(Packages.mindustry.world.blocks.defense) +importPackage(Packages.mindustry.world.blocks.defense.turrets) +importPackage(Packages.mindustry.world.blocks.distribution) +importPackage(Packages.mindustry.world.blocks.liquid) +importPackage(Packages.mindustry.world.blocks.logic) +importPackage(Packages.mindustry.world.blocks.power) +importPackage(Packages.mindustry.world.blocks.production) +importPackage(Packages.mindustry.world.blocks.sandbox) +importPackage(Packages.mindustry.world.blocks.storage) +importPackage(Packages.mindustry.world.blocks.units) +importPackage(Packages.mindustry.world.consumers) +importPackage(Packages.mindustry.world.meta) +importPackage(Packages.mindustry.world.meta.values) +importPackage(Packages.mindustry.world.modules) +importPackage(Packages.mindustry.world.producers) diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 9a8a3dfdb2..65838bd5f5 100644 Binary files a/core/assets/sprites/block_colors.png and b/core/assets/sprites/block_colors.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 693796cfff..c23fb40fb5 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -20,7 +20,7 @@ mend-projector-top index: -1 mender-top rotate: false - xy: 1788, 959 + xy: 1754, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -34,35 +34,35 @@ overdrive-projector-top index: -1 shock-mine rotate: false - xy: 1641, 857 + xy: 1607, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 1886, 1061 + xy: 1920, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 1920, 1061 + xy: 1954, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 1954, 1095 + xy: 1988, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 1988, 1129 + xy: 1954, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -216,266 +216,266 @@ armored-conveyor-4-3 index: -1 conveyor-0-1 rotate: false - xy: 1920, 1027 + xy: 1954, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 1954, 1027 + xy: 1988, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1988, 1027 + xy: 1368, 1035 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1368, 1035 + xy: 1402, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1402, 1027 + xy: 1436, 1019 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 1436, 1019 + xy: 1470, 1019 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 1470, 1019 + xy: 1504, 1019 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 1504, 1019 + xy: 1301, 835 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 1301, 835 + xy: 1335, 835 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1335, 835 + xy: 1369, 843 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 1369, 843 + xy: 1369, 809 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 1369, 809 + xy: 1538, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1538, 993 + xy: 1572, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1572, 993 + xy: 1606, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1606, 993 + xy: 1640, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1640, 993 + xy: 1674, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1674, 993 + xy: 1708, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1708, 993 + xy: 1742, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1742, 993 + xy: 1776, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1641, 823 + xy: 1675, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1675, 857 + xy: 1641, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1641, 789 + xy: 1675, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1675, 823 + xy: 1709, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1709, 857 + xy: 1675, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1675, 789 + xy: 1709, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1709, 823 + xy: 1743, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1743, 857 + xy: 1709, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1709, 789 + xy: 1743, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1743, 823 + xy: 1777, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1777, 857 + xy: 1743, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1743, 789 + xy: 1777, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1777, 823 + xy: 1811, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1811, 857 + xy: 1777, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1777, 789 + xy: 1811, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1811, 823 + xy: 1845, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1845, 857 + xy: 1811, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1811, 789 + xy: 1845, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1845, 823 + xy: 1879, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -489,21 +489,21 @@ mass-driver-base index: -1 phase-conveyor-arrow rotate: false - xy: 1788, 891 + xy: 1822, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1822, 925 + xy: 1856, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1856, 959 + xy: 1822, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -685,21 +685,21 @@ block-border index: -1 block-middle rotate: false - xy: 1546, 1095 + xy: 1580, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 1784, 1129 + xy: 1818, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 1648, 1027 + xy: 1682, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -825,175 +825,175 @@ rubble-8-1 index: -1 bridge-conduit-arrow rotate: false - xy: 1920, 1095 + xy: 1954, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 1920, 1095 + xy: 1954, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 1954, 1129 + xy: 1988, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 1988, 1163 + xy: 1920, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 1988, 1095 + xy: 1988, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 1988, 1061 + xy: 1546, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 1546, 1027 + xy: 1580, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 1580, 1027 + xy: 1614, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 1580, 1027 + xy: 1614, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 1580, 1027 + xy: 1614, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 1580, 1027 + xy: 1614, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 1614, 1027 + xy: 1648, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 1682, 1027 + xy: 1716, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 1716, 1027 + xy: 1750, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 1750, 1027 + xy: 1784, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 1784, 1027 + xy: 1818, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 1784, 1027 + xy: 1818, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1818, 1027 + xy: 1852, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 1852, 1027 + xy: 1886, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 1886, 1027 + xy: 1920, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate rotate: false - xy: 1686, 959 + xy: 1652, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate-top rotate: false - xy: 1652, 891 + xy: 1686, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 1686, 925 + xy: 1720, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1720, 959 + xy: 1686, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1686, 891 + xy: 1720, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1021,119 +1021,119 @@ liquid-tank-top index: -1 phase-conduit-arrow rotate: false - xy: 1754, 891 + xy: 1788, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1788, 925 + xy: 1822, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1822, 959 + xy: 1788, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-cap rotate: false - xy: 1822, 891 + xy: 1856, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-0 rotate: false - xy: 1856, 925 + xy: 1890, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-1 rotate: false - xy: 1890, 959 + xy: 1856, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-2 rotate: false - xy: 1856, 891 + xy: 1890, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-3 rotate: false - xy: 1890, 925 + xy: 1924, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-4 rotate: false - xy: 1924, 959 + xy: 1890, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-5 rotate: false - xy: 1890, 891 + xy: 1924, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-6 rotate: false - xy: 1924, 925 + xy: 1958, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1924, 891 + xy: 1958, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1958, 925 + xy: 1992, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1992, 959 + xy: 1958, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1958, 891 + xy: 1992, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 1992, 925 + xy: 1992, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 1992, 891 + xy: 1505, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1168,7 +1168,7 @@ block-battery-large-full index: -1 combustion-generator-top rotate: false - xy: 1954, 1061 + xy: 1988, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1189,14 +1189,14 @@ differential-generator-top index: -1 diode-arrow rotate: false - xy: 1301, 801 + xy: 1335, 801 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-top rotate: false - xy: 1380, 925 + xy: 1380, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1252,14 +1252,14 @@ impact-reactor-plasma-3 index: -1 power-source rotate: false - xy: 1958, 959 + xy: 1924, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 1573, 857 + xy: 1539, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1406,21 +1406,21 @@ plastanium-compressor-top index: -1 pulverizer rotate: false - xy: 1505, 849 + xy: 1505, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 1505, 815 + xy: 1505, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 1505, 781 + xy: 1539, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1476,7 +1476,7 @@ spore-press-top index: -1 unloader-center rotate: false - xy: 1845, 789 + xy: 1879, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1567,7 +1567,7 @@ salvo-panel-right index: -1 scorch-heat rotate: false - xy: 1573, 823 + xy: 1607, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1693,7 +1693,7 @@ rally-point index: -1 repair-point-base rotate: false - xy: 1539, 823 + xy: 1573, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1742,14 +1742,14 @@ door-large-open index: -1 door-open rotate: false - xy: 1335, 801 + xy: 1369, 775 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 insulator-wall rotate: false - xy: 1380, 891 + xy: 1380, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1805,28 +1805,28 @@ scrap-wall-large4 index: -1 scrap-wall2 rotate: false - xy: 1607, 857 + xy: 1573, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 1573, 789 + xy: 1607, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1607, 823 + xy: 1641, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1607, 823 + xy: 1641, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1980,7 +1980,7 @@ shell-back index: -1 shot rotate: false - xy: 1607, 789 + xy: 1641, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1994,7 +1994,7 @@ transfer index: -1 transfer-arrow rotate: false - xy: 1879, 857 + xy: 1845, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2783,13 +2783,27 @@ block-liquid-tank-full orig: 96, 96 offset: 0, 0 index: -1 -block-magmarock-full +block-liquid-void-full rotate: false xy: 1512, 1155 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +liquid-void + rotate: false + xy: 1512, 1155 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-magmarock-full + rotate: false + xy: 1512, 1121 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 block-mass-driver-full rotate: false xy: 423, 44 @@ -2806,14 +2820,14 @@ block-mechanical-drill-full index: -1 block-mechanical-pump-full rotate: false - xy: 1512, 1121 + xy: 1512, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 1512, 1121 + xy: 1512, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2827,14 +2841,14 @@ block-meltdown-full index: -1 block-melter-full rotate: false - xy: 1512, 1087 + xy: 1512, 1053 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 1512, 1087 + xy: 1512, 1053 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2855,70 +2869,70 @@ mend-projector index: -1 block-mender-full rotate: false - xy: 1512, 1053 + xy: 1546, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender rotate: false - xy: 1512, 1053 + xy: 1546, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-message-full rotate: false - xy: 1546, 1197 + xy: 1546, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 1546, 1197 + xy: 1546, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-2-full rotate: false - xy: 1546, 1163 + xy: 1580, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-3-full rotate: false - xy: 1580, 1197 + xy: 1546, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-5-full rotate: false - xy: 1546, 1129 + xy: 1580, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-damaged-full rotate: false - xy: 1580, 1163 + xy: 1614, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-full rotate: false - xy: 1614, 1197 + xy: 1546, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-full rotate: false - xy: 1580, 1129 + xy: 1614, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2960,14 +2974,14 @@ omega-mech-pad index: -1 block-ore-coal-full rotate: false - xy: 1614, 1163 + xy: 1648, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-coal-medium rotate: false - xy: 1614, 1163 + xy: 1648, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3002,14 +3016,14 @@ block-ore-coal-xlarge index: -1 block-ore-copper-full rotate: false - xy: 1648, 1197 + xy: 1546, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-medium rotate: false - xy: 1648, 1197 + xy: 1546, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3044,14 +3058,14 @@ block-ore-copper-xlarge index: -1 block-ore-lead-full rotate: false - xy: 1546, 1061 + xy: 1580, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-medium rotate: false - xy: 1546, 1061 + xy: 1580, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3086,14 +3100,14 @@ block-ore-lead-xlarge index: -1 block-ore-scrap-full rotate: false - xy: 1580, 1095 + xy: 1614, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-medium rotate: false - xy: 1580, 1095 + xy: 1614, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3128,14 +3142,14 @@ block-ore-scrap-xlarge index: -1 block-ore-thorium-full rotate: false - xy: 1614, 1129 + xy: 1648, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-medium rotate: false - xy: 1614, 1129 + xy: 1648, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3170,14 +3184,14 @@ block-ore-thorium-xlarge index: -1 block-ore-titanium-full rotate: false - xy: 1648, 1163 + xy: 1682, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-medium rotate: false - xy: 1648, 1163 + xy: 1682, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3226,21 +3240,21 @@ overdrive-projector index: -1 block-overflow-gate-full rotate: false - xy: 1682, 1197 + xy: 1580, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 1682, 1197 + xy: 1580, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pebbles-full rotate: false - xy: 1580, 1061 + xy: 1614, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3254,42 +3268,42 @@ block-phantom-factory-full index: -1 block-phase-conduit-full rotate: false - xy: 1614, 1095 + xy: 1648, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 1614, 1095 + xy: 1648, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conveyor-full rotate: false - xy: 1648, 1129 + xy: 1682, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 1648, 1129 + xy: 1682, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-full rotate: false - xy: 1682, 1163 + xy: 1716, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 1682, 1163 + xy: 1716, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3338,14 +3352,14 @@ plastanium-compressor index: -1 block-plastanium-wall-full rotate: false - xy: 1716, 1197 + xy: 1614, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall rotate: false - xy: 1716, 1197 + xy: 1614, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3366,7 +3380,7 @@ plastanium-wall-large index: -1 block-plated-conduit-full rotate: false - xy: 1614, 1061 + xy: 1648, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3380,14 +3394,14 @@ block-pneumatic-drill-full index: -1 block-power-node-full rotate: false - xy: 1648, 1095 + xy: 1682, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node rotate: false - xy: 1648, 1095 + xy: 1682, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3408,35 +3422,35 @@ power-node-large index: -1 block-power-source-full rotate: false - xy: 1682, 1129 + xy: 1716, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-void-full rotate: false - xy: 1716, 1163 + xy: 1750, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 1716, 1163 + xy: 1750, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulse-conduit-full rotate: false - xy: 1750, 1197 + xy: 1648, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-full rotate: false - xy: 1648, 1061 + xy: 1682, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3457,7 +3471,7 @@ pyratite-mixer index: -1 block-repair-point-full rotate: false - xy: 1682, 1095 + xy: 1716, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3485,7 +3499,7 @@ block-rock-full index: -1 block-rocks-full rotate: false - xy: 1716, 1129 + xy: 1750, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3506,14 +3520,14 @@ rotary-pump index: -1 block-router-full rotate: false - xy: 1750, 1163 + xy: 1784, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 1750, 1163 + xy: 1784, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3534,14 +3548,14 @@ rtg-generator index: -1 block-salt-full rotate: false - xy: 1784, 1197 + xy: 1682, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-saltrocks-full rotate: false - xy: 1682, 1061 + xy: 1716, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3555,28 +3569,28 @@ block-salvo-full index: -1 block-sand-boulder-full rotate: false - xy: 1716, 1095 + xy: 1750, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-full rotate: false - xy: 1750, 1129 + xy: 1784, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-water-full rotate: false - xy: 1784, 1163 + xy: 1818, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sandrocks-full rotate: false - xy: 1818, 1197 + xy: 1716, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3590,21 +3604,21 @@ block-scatter-full index: -1 block-scorch-full rotate: false - xy: 1716, 1061 + xy: 1750, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-full rotate: false - xy: 1750, 1095 + xy: 1784, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall1 rotate: false - xy: 1750, 1095 + xy: 1784, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3660,35 +3674,35 @@ separator index: -1 block-shale-boulder-full rotate: false - xy: 1818, 1163 + xy: 1852, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-full rotate: false - xy: 1852, 1197 + xy: 1750, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shalerocks-full rotate: false - xy: 1750, 1061 + xy: 1784, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shock-mine-full rotate: false - xy: 1784, 1095 + xy: 1818, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-full rotate: false - xy: 1818, 1129 + xy: 1852, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3709,7 +3723,7 @@ silicon-smelter index: -1 block-snow-full rotate: false - xy: 1852, 1163 + xy: 1886, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3730,21 +3744,21 @@ block-snowrock-full index: -1 block-snowrocks-full rotate: false - xy: 1886, 1197 + xy: 1784, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-full rotate: false - xy: 1784, 1061 + xy: 1818, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 1784, 1061 + xy: 1818, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3765,21 +3779,21 @@ solar-panel-large index: -1 block-sorter-full rotate: false - xy: 1818, 1095 + xy: 1852, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 1818, 1095 + xy: 1852, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spawn-full rotate: false - xy: 1852, 1129 + xy: 1886, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3807,7 +3821,7 @@ block-spore-cluster-full index: -1 block-spore-moss-full rotate: false - xy: 1886, 1163 + xy: 1920, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3828,14 +3842,14 @@ block-spore-press-full index: -1 block-sporerocks-full rotate: false - xy: 1920, 1197 + xy: 1818, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-stone-full rotate: false - xy: 1818, 1061 + xy: 1852, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3856,14 +3870,14 @@ surge-tower index: -1 block-surge-wall-full rotate: false - xy: 1852, 1095 + xy: 1886, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 1852, 1095 + xy: 1886, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3891,14 +3905,14 @@ block-swarmer-full index: -1 block-tainted-water-full rotate: false - xy: 1886, 1129 + xy: 1920, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tar-full rotate: false - xy: 1920, 1163 + xy: 1954, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3919,7 +3933,7 @@ tau-mech-pad index: -1 block-tendrils-full rotate: false - xy: 1954, 1197 + xy: 1852, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3968,14 +3982,14 @@ thorium-reactor index: -1 block-thorium-wall-full rotate: false - xy: 1852, 1061 + xy: 1886, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 1852, 1061 + xy: 1886, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4017,28 +4031,28 @@ block-titan-factory-full index: -1 block-titanium-conveyor-full rotate: false - xy: 1886, 1095 + xy: 1920, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 1886, 1095 + xy: 1920, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-full rotate: false - xy: 1920, 1129 + xy: 1954, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 1920, 1129 + xy: 1954, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4087,14 +4101,14 @@ turbine-generator index: -1 block-unloader-full rotate: false - xy: 1954, 1163 + xy: 1988, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader rotate: false - xy: 1954, 1163 + xy: 1988, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4122,7 +4136,7 @@ block-water-extractor-full index: -1 block-water-full rotate: false - xy: 1988, 1197 + xy: 1886, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4157,56 +4171,56 @@ block-wraith-factory-full index: -1 cracks-1-0 rotate: false - xy: 1776, 993 + xy: 1810, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 1810, 993 + xy: 1844, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 1844, 993 + xy: 1878, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 1878, 993 + xy: 1912, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 1912, 993 + xy: 1946, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 1946, 993 + xy: 1980, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 1980, 993 + xy: 2014, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 2014, 993 + xy: 1301, 801 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4444,7 +4458,7 @@ cyclone index: -1 duo rotate: false - xy: 1369, 775 + xy: 1380, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4458,7 +4472,7 @@ fuse index: -1 hail rotate: false - xy: 1380, 959 + xy: 1380, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4472,14 +4486,14 @@ item-blast-compound-large index: -1 item-blast-compound-medium rotate: false - xy: 1414, 985 + xy: 1414, 951 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 1879, 831 + xy: 1913, 865 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4507,14 +4521,14 @@ item-coal-large index: -1 item-coal-medium rotate: false - xy: 1448, 985 + xy: 1414, 917 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 1913, 865 + xy: 1879, 797 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4542,7 +4556,7 @@ item-copper-large index: -1 item-copper-medium rotate: false - xy: 1448, 951 + xy: 1482, 985 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4577,7 +4591,7 @@ item-graphite-large index: -1 item-graphite-medium rotate: false - xy: 1448, 917 + xy: 1482, 951 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4612,7 +4626,7 @@ item-lead-large index: -1 item-lead-medium rotate: false - xy: 1482, 917 + xy: 1414, 883 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4647,7 +4661,7 @@ item-metaglass-large index: -1 item-metaglass-medium rotate: false - xy: 1448, 883 + xy: 1482, 883 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4682,14 +4696,14 @@ item-phase-fabric-large index: -1 item-phase-fabric-medium rotate: false - xy: 1403, 849 + xy: 1403, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 1879, 805 + xy: 1913, 839 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -4717,7 +4731,7 @@ item-plastanium-large index: -1 item-plastanium-medium rotate: false - xy: 1437, 849 + xy: 1403, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4752,7 +4766,7 @@ item-pyratite-large index: -1 item-pyratite-medium rotate: false - xy: 1437, 815 + xy: 1471, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4787,7 +4801,7 @@ item-sand-large index: -1 item-sand-medium rotate: false - xy: 1437, 781 + xy: 1471, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4822,7 +4836,7 @@ item-scrap-large index: -1 item-scrap-medium rotate: false - xy: 1471, 781 + xy: 1516, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4857,7 +4871,7 @@ item-silicon-large index: -1 item-silicon-medium rotate: false - xy: 1516, 925 + xy: 1550, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -4892,21 +4906,21 @@ item-spore-pod-large index: -1 item-spore-pod-medium rotate: false - xy: 1516, 891 + xy: 1550, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 1965, 865 + xy: 1939, 839 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-tiny rotate: false - xy: 1329, 757 + xy: 1303, 731 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -4927,21 +4941,21 @@ item-surge-alloy-large index: -1 item-surge-alloy-medium rotate: false - xy: 1584, 959 + xy: 1550, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 1321, 775 + xy: 1965, 865 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-tiny rotate: false - xy: 1251, 271 + xy: 1329, 757 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -4962,21 +4976,21 @@ item-thorium-large index: -1 item-thorium-medium rotate: false - xy: 1584, 925 + xy: 1618, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 1303, 749 + xy: 1321, 775 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-tiny rotate: false - xy: 1303, 705 + xy: 1251, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -4997,21 +5011,21 @@ item-titanium-large index: -1 item-titanium-medium rotate: false - xy: 1584, 891 + xy: 1618, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 1251, 289 + xy: 1303, 749 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-tiny rotate: false - xy: 1273, 551 + xy: 1273, 577 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5039,21 +5053,21 @@ liquid-cryofluid-large index: -1 liquid-cryofluid-medium rotate: false - xy: 1652, 959 + xy: 1618, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-small rotate: false - xy: 1273, 595 + xy: 1251, 289 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-cryofluid-tiny rotate: false - xy: 222, 1129 + xy: 1991, 847 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5074,21 +5088,21 @@ liquid-oil-large index: -1 liquid-oil-medium rotate: false - xy: 1652, 925 + xy: 1686, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-small rotate: false - xy: 1991, 865 + xy: 1273, 595 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-oil-tiny rotate: false - xy: 584, 929 + xy: 222, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5109,21 +5123,21 @@ liquid-slag-large index: -1 liquid-slag-medium rotate: false - xy: 1754, 959 + xy: 1720, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-small rotate: false - xy: 1303, 723 + xy: 1965, 839 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-slag-tiny rotate: false - xy: 678, 831 + xy: 584, 929 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5144,21 +5158,21 @@ liquid-water-large index: -1 liquid-water-medium rotate: false - xy: 1754, 925 + xy: 1788, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-small rotate: false - xy: 1273, 569 + xy: 1991, 865 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-water-tiny rotate: false - xy: 767, 733 + xy: 678, 831 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -5242,7 +5256,7 @@ meltdown index: -1 repair-point rotate: false - xy: 1539, 857 + xy: 1539, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -5270,7 +5284,7 @@ scatter index: -1 scorch rotate: false - xy: 1539, 789 + xy: 1573, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -5347,140 +5361,140 @@ wave index: -1 item-blast-compound rotate: false - xy: 1380, 993 + xy: 1414, 985 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 1414, 951 + xy: 1448, 985 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 1414, 917 + xy: 1448, 951 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 1482, 985 + xy: 1448, 917 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 1482, 951 + xy: 1482, 917 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 1414, 883 + xy: 1448, 883 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 1482, 883 + xy: 1403, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 1403, 815 + xy: 1437, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 1403, 781 + xy: 1437, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 1471, 849 + xy: 1437, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 1471, 815 + xy: 1471, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 1516, 959 + xy: 1516, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 1550, 959 + xy: 1516, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 1550, 925 + xy: 1584, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 1550, 891 + xy: 1584, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 1618, 959 + xy: 1584, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 1618, 925 + xy: 1652, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 1618, 891 + xy: 1652, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 1720, 925 + xy: 1754, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 1720, 891 + xy: 1754, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8689,6 +8703,13 @@ liquid-tank-icon-editor orig: 96, 96 offset: 0, 0 index: -1 +liquid-void-icon-editor + rotate: false + xy: 1821, 827 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 mass-driver-icon-editor rotate: false xy: 1823, 927 @@ -8705,7 +8726,7 @@ mechanical-drill-icon-editor index: -1 mechanical-pump-icon-editor rotate: false - xy: 1821, 827 + xy: 1855, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8719,7 +8740,7 @@ meltdown-icon-editor index: -1 melter-icon-editor rotate: false - xy: 1855, 827 + xy: 1889, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8733,14 +8754,14 @@ mend-projector-icon-editor index: -1 mender-icon-editor rotate: false - xy: 1889, 827 + xy: 1923, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1923, 827 + xy: 1957, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8775,14 +8796,14 @@ overdrive-projector-icon-editor index: -1 overflow-gate-icon-editor rotate: false - xy: 1957, 827 + xy: 717, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 717, 793 + xy: 717, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8796,21 +8817,21 @@ phantom-factory-icon-editor index: -1 phase-conduit-icon-editor rotate: false - xy: 717, 759 + xy: 751, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 751, 793 + xy: 717, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 717, 725 + xy: 785, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8845,7 +8866,7 @@ plastanium-compressor-icon-editor index: -1 plastanium-wall-icon-editor rotate: false - xy: 785, 793 + xy: 751, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8859,7 +8880,7 @@ plastanium-wall-large-icon-editor index: -1 plated-conduit-icon-editor rotate: false - xy: 751, 759 + xy: 717, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8873,7 +8894,7 @@ pneumatic-drill-icon-editor index: -1 power-node-icon-editor rotate: false - xy: 717, 691 + xy: 819, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8887,28 +8908,28 @@ power-node-large-icon-editor index: -1 power-source-icon-editor rotate: false - xy: 819, 793 + xy: 785, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 785, 759 + xy: 751, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 751, 725 + xy: 717, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 717, 657 + xy: 853, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8922,7 +8943,7 @@ pyratite-mixer-icon-editor index: -1 repair-point-icon-editor rotate: false - xy: 853, 793 + xy: 819, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8950,7 +8971,7 @@ rock-icon-editor index: -1 rocks-icon-editor rotate: false - xy: 819, 759 + xy: 785, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8964,7 +8985,7 @@ rotary-pump-icon-editor index: -1 router-icon-editor rotate: false - xy: 785, 725 + xy: 751, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8978,7 +8999,7 @@ rtg-generator-icon-editor index: -1 saltrocks-icon-editor rotate: false - xy: 751, 691 + xy: 717, 623 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -8992,14 +9013,14 @@ salvo-icon-editor index: -1 sand-boulder-icon-editor rotate: false - xy: 717, 623 + xy: 887, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-icon-editor rotate: false - xy: 887, 793 + xy: 853, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9013,7 +9034,7 @@ scatter-icon-editor index: -1 scorch-icon-editor rotate: false - xy: 853, 759 + xy: 819, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9034,7 +9055,7 @@ scrap-wall-huge-icon-editor index: -1 scrap-wall-icon-editor rotate: false - xy: 819, 725 + xy: 785, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9055,28 +9076,28 @@ separator-icon-editor index: -1 shale-boulder-icon-editor rotate: false - xy: 785, 691 + xy: 751, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks-icon-editor rotate: false - xy: 751, 657 + xy: 717, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 717, 589 + xy: 921, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 921, 793 + xy: 887, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9090,7 +9111,7 @@ silicon-smelter-icon-editor index: -1 snow-icon-editor rotate: false - xy: 887, 759 + xy: 853, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9111,14 +9132,14 @@ snowrock-icon-editor index: -1 snowrocks-icon-editor rotate: false - xy: 853, 725 + xy: 819, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 819, 691 + xy: 785, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9132,14 +9153,14 @@ solar-panel-large-icon-editor index: -1 sorter-icon-editor rotate: false - xy: 785, 657 + xy: 751, 623 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 751, 623 + xy: 717, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9181,7 +9202,7 @@ spore-press-icon-editor index: -1 sporerocks-icon-editor rotate: false - xy: 717, 555 + xy: 955, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9195,7 +9216,7 @@ surge-tower-icon-editor index: -1 surge-wall-icon-editor rotate: false - xy: 955, 793 + xy: 921, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9223,7 +9244,7 @@ tau-mech-pad-icon-editor index: -1 tendrils-icon-editor rotate: false - xy: 921, 759 + xy: 887, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9251,7 +9272,7 @@ thorium-reactor-icon-editor index: -1 thorium-wall-icon-editor rotate: false - xy: 887, 725 + xy: 853, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9279,14 +9300,14 @@ titan-factory-icon-editor index: -1 titanium-conveyor-icon-editor rotate: false - xy: 853, 691 + xy: 819, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 819, 657 + xy: 785, 623 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9314,7 +9335,7 @@ turbine-generator-icon-editor index: -1 unloader-icon-editor rotate: false - xy: 785, 623 + xy: 751, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9466,7 +9487,7 @@ alpha-bg index: -1 bar rotate: false - xy: 2019, 869 + xy: 1500, 131 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -9489,7 +9510,7 @@ block-alloy-smelter-large index: -1 block-alloy-smelter-medium rotate: false - xy: 1839, 647 + xy: 1223, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9503,7 +9524,7 @@ block-alloy-smelter-small index: -1 block-alloy-smelter-tiny rotate: false - xy: 1609, 350 + xy: 821, 928 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9524,7 +9545,7 @@ block-arc-large index: -1 block-arc-medium rotate: false - xy: 1873, 647 + xy: 1257, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -9538,7 +9559,7 @@ block-arc-small index: -1 block-arc-tiny rotate: false - xy: 1971, 567 + xy: 301, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9552,28 +9573,28 @@ block-arc-xlarge index: -1 block-armored-conveyor-large rotate: false - xy: 851, 36 + xy: 909, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 1907, 647 + xy: 1291, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 1939, 589 + xy: 1571, 290 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 2031, 645 + xy: 319, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9587,35 +9608,35 @@ block-armored-conveyor-xlarge index: -1 block-battery-large rotate: false - xy: 893, 36 + xy: 951, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-large rotate: false - xy: 821, 933 + xy: 993, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-medium rotate: false - xy: 1951, 857 + xy: 1325, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-large-small rotate: false - xy: 2019, 780 + xy: 106, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-large-tiny rotate: false - xy: 2031, 627 + xy: 839, 928 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9629,21 +9650,21 @@ block-battery-large-xlarge index: -1 block-battery-medium rotate: false - xy: 1951, 823 + xy: 1359, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-small rotate: false - xy: 106, 2 + xy: 1571, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-tiny rotate: false - xy: 2031, 609 + xy: 2031, 705 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9657,28 +9678,28 @@ block-battery-xlarge index: -1 block-blast-drill-large rotate: false - xy: 863, 933 + xy: 1035, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-drill-medium rotate: false - xy: 1951, 789 + xy: 1393, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-small rotate: false - xy: 2019, 754 + xy: 2021, 915 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-drill-tiny rotate: false - xy: 2031, 591 + xy: 2031, 687 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9692,28 +9713,28 @@ block-blast-drill-xlarge index: -1 block-blast-mixer-large rotate: false - xy: 905, 933 + xy: 1077, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-mixer-medium rotate: false - xy: 1951, 755 + xy: 1427, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-mixer-small rotate: false - xy: 2019, 728 + xy: 1571, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-mixer-tiny rotate: false - xy: 2031, 573 + xy: 2031, 669 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9727,28 +9748,28 @@ block-blast-mixer-xlarge index: -1 block-bridge-conduit-large rotate: false - xy: 947, 933 + xy: 1119, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conduit-medium rotate: false - xy: 1951, 721 + xy: 1461, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conduit-small rotate: false - xy: 2019, 702 + xy: 751, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conduit-tiny rotate: false - xy: 301, 1 + xy: 2031, 651 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9762,28 +9783,28 @@ block-bridge-conduit-xlarge index: -1 block-bridge-conveyor-large rotate: false - xy: 989, 933 + xy: 1161, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conveyor-medium rotate: false - xy: 1951, 687 + xy: 1495, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conveyor-small rotate: false - xy: 1383, 54 + xy: 777, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conveyor-tiny rotate: false - xy: 319, 1 + xy: 1361, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9797,28 +9818,28 @@ block-bridge-conveyor-xlarge index: -1 block-char-large rotate: false - xy: 1031, 933 + xy: 1203, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-char-medium rotate: false - xy: 1979, 899 + xy: 1529, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-small rotate: false - xy: 751, 2 + xy: 803, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-char-tiny rotate: false - xy: 131, 540 + xy: 1379, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9832,28 +9853,28 @@ block-char-xlarge index: -1 block-cliffs-large rotate: false - xy: 1073, 933 + xy: 1245, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cliffs-medium rotate: false - xy: 2013, 907 + xy: 1563, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliffs-small rotate: false - xy: 777, 2 + xy: 829, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cliffs-tiny rotate: false - xy: 309, 698 + xy: 131, 540 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9867,28 +9888,28 @@ block-cliffs-xlarge index: -1 block-coal-centrifuge-large rotate: false - xy: 1115, 933 + xy: 1287, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-coal-centrifuge-medium rotate: false - xy: 1985, 865 + xy: 1597, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-small rotate: false - xy: 803, 2 + xy: 855, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-coal-centrifuge-tiny rotate: false - xy: 331, 598 + xy: 309, 698 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9902,28 +9923,28 @@ block-coal-centrifuge-xlarge index: -1 block-combustion-generator-large rotate: false - xy: 1157, 933 + xy: 1329, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-combustion-generator-medium rotate: false - xy: 1985, 831 + xy: 1631, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-combustion-generator-small rotate: false - xy: 1409, 54 + xy: 1534, 223 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-combustion-generator-tiny rotate: false - xy: 881, 579 + xy: 331, 598 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9937,28 +9958,28 @@ block-combustion-generator-xlarge index: -1 block-command-center-large rotate: false - xy: 1199, 933 + xy: 1371, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-command-center-medium rotate: false - xy: 1985, 797 + xy: 1665, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-command-center-small rotate: false - xy: 1395, 28 + xy: 1534, 197 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-command-center-tiny rotate: false - xy: 901, 82 + xy: 1971, 663 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9972,28 +9993,28 @@ block-command-center-xlarge index: -1 block-conduit-large rotate: false - xy: 1241, 933 + xy: 1413, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conduit-medium rotate: false - xy: 1985, 763 + xy: 1699, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-small rotate: false - xy: 1395, 2 + xy: 1532, 171 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conduit-tiny rotate: false - xy: 1815, 634 + xy: 881, 581 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10007,21 +10028,21 @@ block-conduit-xlarge index: -1 block-container-large rotate: false - xy: 1283, 933 + xy: 1455, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-container-medium rotate: false - xy: 1985, 729 + xy: 1733, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-small rotate: false - xy: 1421, 28 + xy: 1560, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -10042,28 +10063,28 @@ block-container-xlarge index: -1 block-conveyor-large rotate: false - xy: 1325, 933 + xy: 1497, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conveyor-medium rotate: false - xy: 1985, 695 + xy: 1767, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-small rotate: false - xy: 1421, 2 + xy: 1560, 186 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conveyor-tiny rotate: false - xy: 829, 10 + xy: 2021, 897 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10077,35 +10098,35 @@ block-conveyor-xlarge index: -1 block-copper-wall-large rotate: false - xy: 1367, 933 + xy: 1539, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-large rotate: false - xy: 1409, 933 + xy: 1581, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-medium rotate: false - xy: 923, 576 + xy: 1801, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-small rotate: false - xy: 1681, 524 + xy: 1558, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-large-tiny rotate: false - xy: 1915, 501 + xy: 881, 10 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10119,21 +10140,21 @@ block-copper-wall-large-xlarge index: -1 block-copper-wall-medium rotate: false - xy: 965, 618 + xy: 1835, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-small rotate: false - xy: 1707, 526 + xy: 1532, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-tiny rotate: false - xy: 1403, 116 + xy: 1917, 387 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10147,28 +10168,28 @@ block-copper-wall-xlarge index: -1 block-core-foundation-large rotate: false - xy: 1451, 933 + xy: 1623, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-foundation-medium rotate: false - xy: 999, 618 + xy: 1869, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-small rotate: false - xy: 1733, 526 + xy: 1558, 134 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-foundation-tiny rotate: false - xy: 1577, 108 + xy: 309, 680 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10182,28 +10203,28 @@ block-core-foundation-xlarge index: -1 block-core-nucleus-large rotate: false - xy: 1493, 933 + xy: 1665, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-nucleus-medium rotate: false - xy: 1033, 618 + xy: 1903, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-nucleus-small rotate: false - xy: 1759, 526 + xy: 1586, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-nucleus-tiny rotate: false - xy: 1809, 348 + xy: 331, 580 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10217,28 +10238,28 @@ block-core-nucleus-xlarge index: -1 block-core-shard-large rotate: false - xy: 1535, 933 + xy: 1707, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-shard-medium rotate: false - xy: 1067, 618 + xy: 1937, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-shard-small rotate: false - xy: 1785, 526 + xy: 1586, 186 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-shard-tiny rotate: false - xy: 1783, 311 + xy: 1917, 369 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10252,28 +10273,28 @@ block-core-shard-xlarge index: -1 block-craters-large rotate: false - xy: 1577, 933 + xy: 1749, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-craters-medium rotate: false - xy: 1101, 618 + xy: 919, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-craters-small rotate: false - xy: 1681, 498 + xy: 1584, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-craters-tiny rotate: false - xy: 309, 680 + xy: 1935, 387 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10287,28 +10308,28 @@ block-craters-xlarge index: -1 block-crawler-factory-large rotate: false - xy: 1619, 933 + xy: 1791, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-crawler-factory-medium rotate: false - xy: 1135, 618 + xy: 953, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-crawler-factory-small rotate: false - xy: 1707, 500 + xy: 1584, 134 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-crawler-factory-tiny rotate: false - xy: 331, 580 + xy: 1935, 369 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10322,28 +10343,28 @@ block-crawler-factory-xlarge index: -1 block-cryofluidmixer-large rotate: false - xy: 1661, 933 + xy: 1833, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cryofluidmixer-medium rotate: false - xy: 1169, 618 + xy: 987, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cryofluidmixer-small rotate: false - xy: 1733, 500 + xy: 1529, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cryofluidmixer-tiny rotate: false - xy: 899, 579 + xy: 1953, 387 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10357,28 +10378,28 @@ block-cryofluidmixer-xlarge index: -1 block-cultivator-large rotate: false - xy: 1703, 933 + xy: 1875, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cultivator-medium rotate: false - xy: 1203, 618 + xy: 1021, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cultivator-small rotate: false - xy: 1759, 500 + xy: 1555, 108 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cultivator-tiny rotate: false - xy: 1809, 330 + xy: 1953, 369 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10392,28 +10413,28 @@ block-cultivator-xlarge index: -1 block-cyclone-large rotate: false - xy: 1745, 933 + xy: 1917, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cyclone-medium rotate: false - xy: 1237, 618 + xy: 1055, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cyclone-small rotate: false - xy: 1785, 500 + xy: 1581, 108 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cyclone-tiny rotate: false - xy: 1783, 293 + xy: 1971, 387 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10427,28 +10448,28 @@ block-cyclone-xlarge index: -1 block-dagger-factory-large rotate: false - xy: 1787, 933 + xy: 1959, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dagger-factory-medium rotate: false - xy: 1271, 618 + xy: 1089, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dagger-factory-small rotate: false - xy: 1678, 472 + xy: 1600, 355 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dagger-factory-tiny rotate: false - xy: 1783, 275 + xy: 1971, 369 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10462,28 +10483,28 @@ block-dagger-factory-xlarge index: -1 block-dark-metal-large rotate: false - xy: 1829, 933 + xy: 845, 883 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-metal-medium rotate: false - xy: 1305, 618 + xy: 1123, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-metal-small rotate: false - xy: 1678, 446 + xy: 1600, 329 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-metal-tiny rotate: false - xy: 1783, 257 + xy: 1989, 387 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10497,28 +10518,28 @@ block-dark-metal-xlarge index: -1 block-dark-panel-1-large rotate: false - xy: 1871, 933 + xy: 859, 841 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-1-medium rotate: false - xy: 1339, 618 + xy: 1157, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-1-small rotate: false - xy: 1678, 420 + xy: 1600, 303 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-1-tiny rotate: false - xy: 1783, 239 + xy: 1989, 369 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10532,28 +10553,28 @@ block-dark-panel-1-xlarge index: -1 block-dark-panel-2-large rotate: false - xy: 1913, 933 + xy: 859, 799 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-2-medium rotate: false - xy: 1373, 618 + xy: 1191, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-2-small rotate: false - xy: 1678, 394 + xy: 1597, 277 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-2-tiny rotate: false - xy: 1427, 194 + xy: 2007, 387 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10567,28 +10588,28 @@ block-dark-panel-2-xlarge index: -1 block-dark-panel-3-large rotate: false - xy: 1955, 933 + xy: 859, 757 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-3-medium rotate: false - xy: 1407, 618 + xy: 1225, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-3-small rotate: false - xy: 1811, 496 + xy: 1597, 251 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-3-tiny rotate: false - xy: 1427, 176 + xy: 2007, 369 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10602,28 +10623,28 @@ block-dark-panel-3-xlarge index: -1 block-dark-panel-4-large rotate: false - xy: 845, 891 + xy: 859, 715 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-4-medium rotate: false - xy: 1441, 618 + xy: 1259, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-4-small rotate: false - xy: 1837, 493 + xy: 1607, 108 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-4-tiny rotate: false - xy: 1429, 158 + xy: 1397, 3 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10637,28 +10658,28 @@ block-dark-panel-4-xlarge index: -1 block-dark-panel-5-large rotate: false - xy: 887, 891 + xy: 887, 883 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-5-medium rotate: false - xy: 1475, 618 + xy: 1293, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-5-small rotate: false - xy: 1863, 493 + xy: 1623, 277 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-5-tiny rotate: false - xy: 1429, 140 + xy: 1415, 3 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10679,21 +10700,21 @@ block-dark-panel-6-large index: -1 block-dark-panel-6-medium rotate: false - xy: 1509, 618 + xy: 1327, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-6-small rotate: false - xy: 1889, 493 + xy: 1623, 251 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-6-tiny rotate: false - xy: 1429, 122 + xy: 1433, 3 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10714,14 +10735,14 @@ block-darksand-large index: -1 block-darksand-medium rotate: false - xy: 1543, 618 + xy: 1361, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-small rotate: false - xy: 1704, 472 + xy: 1612, 225 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -10735,21 +10756,21 @@ block-darksand-tainted-water-large index: -1 block-darksand-tainted-water-medium rotate: false - xy: 1577, 618 + xy: 1395, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-tainted-water-small rotate: false - xy: 1704, 446 + xy: 1612, 199 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-tiny rotate: false - xy: 1827, 345 + xy: 2025, 387 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10763,7 +10784,7 @@ block-darksand-tainted-water-xlarge index: -1 block-darksand-tiny rotate: false - xy: 1845, 345 + xy: 2025, 369 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10777,21 +10798,21 @@ block-darksand-water-large index: -1 block-darksand-water-medium rotate: false - xy: 1611, 618 + xy: 1429, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-water-small rotate: false - xy: 1704, 420 + xy: 1612, 173 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-water-tiny rotate: false - xy: 1863, 345 + xy: 1683, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10819,21 +10840,21 @@ block-dart-mech-pad-large index: -1 block-dart-mech-pad-medium rotate: false - xy: 1645, 618 + xy: 1463, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dart-mech-pad-small rotate: false - xy: 1704, 394 + xy: 1610, 147 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dart-mech-pad-tiny rotate: false - xy: 1881, 345 + xy: 1701, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10854,21 +10875,21 @@ block-deepwater-large index: -1 block-deepwater-medium rotate: false - xy: 1679, 618 + xy: 1497, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-deepwater-small rotate: false - xy: 1730, 474 + xy: 1638, 225 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-deepwater-tiny rotate: false - xy: 1899, 345 + xy: 1719, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10889,21 +10910,21 @@ block-delta-mech-pad-large index: -1 block-delta-mech-pad-medium rotate: false - xy: 1713, 618 + xy: 1531, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-delta-mech-pad-small rotate: false - xy: 1730, 448 + xy: 1638, 199 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-delta-mech-pad-tiny rotate: false - xy: 1917, 345 + xy: 1737, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10924,21 +10945,21 @@ block-differential-generator-large index: -1 block-differential-generator-medium rotate: false - xy: 1747, 618 + xy: 1565, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-differential-generator-small rotate: false - xy: 1756, 474 + xy: 1638, 173 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-differential-generator-tiny rotate: false - xy: 1827, 327 + xy: 1755, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10959,21 +10980,21 @@ block-diode-large index: -1 block-diode-medium rotate: false - xy: 1781, 618 + xy: 1599, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-diode-small rotate: false - xy: 1730, 422 + xy: 1636, 147 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-diode-tiny rotate: false - xy: 1845, 327 + xy: 1773, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10994,21 +11015,21 @@ block-distributor-large index: -1 block-distributor-medium rotate: false - xy: 901, 542 + xy: 1633, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-distributor-small rotate: false - xy: 1756, 448 + xy: 1633, 121 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-distributor-tiny rotate: false - xy: 1863, 327 + xy: 1791, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11036,21 +11057,21 @@ block-door-large-large index: -1 block-door-large-medium rotate: false - xy: 901, 508 + xy: 1667, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-large-small rotate: false - xy: 1782, 474 + xy: 1633, 95 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-large-tiny rotate: false - xy: 1881, 327 + xy: 1809, 361 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11064,21 +11085,21 @@ block-door-large-xlarge index: -1 block-door-medium rotate: false - xy: 901, 474 + xy: 1701, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-small rotate: false - xy: 1730, 396 + xy: 1659, 121 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-tiny rotate: false - xy: 1899, 327 + xy: 1678, 343 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11099,21 +11120,21 @@ block-draug-factory-large index: -1 block-draug-factory-medium rotate: false - xy: 901, 440 + xy: 1735, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-draug-factory-small rotate: false - xy: 1756, 422 + xy: 1659, 95 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-draug-factory-tiny rotate: false - xy: 1917, 327 + xy: 1678, 325 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11134,21 +11155,21 @@ block-dunerocks-large index: -1 block-dunerocks-medium rotate: false - xy: 901, 406 + xy: 1769, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dunerocks-small rotate: false - xy: 1782, 448 + xy: 1662, 147 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dunerocks-tiny rotate: false - xy: 1935, 341 + xy: 1696, 343 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11169,21 +11190,21 @@ block-duo-large index: -1 block-duo-medium rotate: false - xy: 901, 372 + xy: 1803, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-small rotate: false - xy: 1756, 396 + xy: 1685, 121 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-duo-tiny rotate: false - xy: 1935, 323 + xy: 1714, 343 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11204,21 +11225,21 @@ block-force-projector-large index: -1 block-force-projector-medium rotate: false - xy: 901, 338 + xy: 1837, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-force-projector-small rotate: false - xy: 1782, 422 + xy: 1685, 95 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-force-projector-tiny rotate: false - xy: 1603, 254 + xy: 1696, 325 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11239,21 +11260,21 @@ block-fortress-factory-large index: -1 block-fortress-factory-medium rotate: false - xy: 901, 304 + xy: 1871, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-fortress-factory-small rotate: false - xy: 1782, 396 + xy: 1337, 147 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-fortress-factory-tiny rotate: false - xy: 1603, 236 + xy: 1732, 343 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11274,21 +11295,21 @@ block-fuse-large index: -1 block-fuse-medium rotate: false - xy: 901, 270 + xy: 1905, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-fuse-small rotate: false - xy: 1808, 470 + xy: 1363, 149 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-fuse-tiny rotate: false - xy: 1603, 218 + xy: 1714, 325 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11309,21 +11330,21 @@ block-ghoul-factory-large index: -1 block-ghoul-factory-medium rotate: false - xy: 901, 236 + xy: 1939, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ghoul-factory-small rotate: false - xy: 1808, 444 + xy: 1337, 121 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ghoul-factory-tiny rotate: false - xy: 1603, 200 + xy: 1750, 343 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11344,21 +11365,21 @@ block-glaive-ship-pad-large index: -1 block-glaive-ship-pad-medium rotate: false - xy: 901, 202 + xy: 1225, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-glaive-ship-pad-small rotate: false - xy: 1808, 418 + xy: 1363, 123 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-glaive-ship-pad-tiny rotate: false - xy: 1603, 182 + xy: 1732, 325 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11379,21 +11400,21 @@ block-graphite-press-large index: -1 block-graphite-press-medium rotate: false - xy: 901, 168 + xy: 1259, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-graphite-press-small rotate: false - xy: 1834, 467 + xy: 1335, 95 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-graphite-press-tiny rotate: false - xy: 1603, 164 + xy: 1768, 343 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11414,21 +11435,21 @@ block-grass-large index: -1 block-grass-medium rotate: false - xy: 901, 134 + xy: 1293, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-grass-small rotate: false - xy: 1860, 467 + xy: 1335, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-grass-tiny rotate: false - xy: 1603, 146 + xy: 1750, 325 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11449,21 +11470,21 @@ block-hail-large index: -1 block-hail-medium rotate: false - xy: 901, 100 + xy: 1327, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hail-small rotate: false - xy: 1834, 441 + xy: 1335, 43 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hail-tiny rotate: false - xy: 1603, 128 + xy: 1786, 343 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11484,21 +11505,21 @@ block-holostone-large index: -1 block-holostone-medium rotate: false - xy: 935, 542 + xy: 1361, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-holostone-small rotate: false - xy: 1886, 467 + xy: 1335, 17 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-holostone-tiny rotate: false - xy: 1621, 246 + xy: 1768, 325 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11519,21 +11540,21 @@ block-hotrock-large index: -1 block-hotrock-medium rotate: false - xy: 935, 508 + xy: 1395, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-small rotate: false - xy: 1860, 441 + xy: 1389, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hotrock-tiny rotate: false - xy: 1621, 228 + xy: 1804, 343 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11547,49 +11568,49 @@ block-hotrock-xlarge index: -1 block-ice-large rotate: false - xy: 859, 849 + xy: 901, 841 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-medium rotate: false - xy: 935, 474 + xy: 1429, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-small rotate: false - xy: 1886, 441 + xy: 1415, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-large rotate: false - xy: 901, 849 + xy: 901, 799 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-snow-medium rotate: false - xy: 935, 440 + xy: 1463, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-small rotate: false - xy: 1834, 415 + xy: 1441, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-tiny rotate: false - xy: 1639, 246 + xy: 1786, 325 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11603,7 +11624,7 @@ block-ice-snow-xlarge index: -1 block-ice-tiny rotate: false - xy: 1621, 210 + xy: 1804, 325 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11617,28 +11638,28 @@ block-ice-xlarge index: -1 block-icerocks-large rotate: false - xy: 859, 807 + xy: 901, 757 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-icerocks-medium rotate: false - xy: 935, 406 + xy: 1497, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icerocks-small rotate: false - xy: 1860, 415 + xy: 1467, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icerocks-tiny rotate: false - xy: 1639, 228 + xy: 1727, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11652,28 +11673,28 @@ block-icerocks-xlarge index: -1 block-ignarock-large rotate: false - xy: 901, 807 + xy: 901, 715 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ignarock-medium rotate: false - xy: 935, 372 + xy: 1531, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ignarock-small rotate: false - xy: 1886, 415 + xy: 1493, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ignarock-tiny rotate: false - xy: 1657, 246 + xy: 1745, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11694,21 +11715,21 @@ block-illuminator-large index: -1 block-illuminator-medium rotate: false - xy: 935, 338 + xy: 1565, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-illuminator-small rotate: false - xy: 1808, 392 + xy: 1519, 93 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-illuminator-tiny rotate: false - xy: 1621, 192 + xy: 1763, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11722,28 +11743,28 @@ block-illuminator-xlarge index: -1 block-impact-reactor-large rotate: false - xy: 859, 765 + xy: 943, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-impact-reactor-medium rotate: false - xy: 935, 304 + xy: 1599, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-impact-reactor-small rotate: false - xy: 1834, 389 + xy: 1545, 82 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-impact-reactor-tiny rotate: false - xy: 1639, 210 + xy: 1891, 350 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11757,28 +11778,28 @@ block-impact-reactor-xlarge index: -1 block-incinerator-large rotate: false - xy: 901, 765 + xy: 985, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-incinerator-medium rotate: false - xy: 935, 270 + xy: 1633, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-incinerator-small rotate: false - xy: 1860, 389 + xy: 1571, 82 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-incinerator-tiny rotate: false - xy: 1657, 228 + xy: 1909, 350 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11792,28 +11813,28 @@ block-incinerator-xlarge index: -1 block-inverted-sorter-large rotate: false - xy: 943, 807 + xy: 943, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-inverted-sorter-medium rotate: false - xy: 935, 236 + xy: 1667, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-inverted-sorter-small rotate: false - xy: 1886, 389 + xy: 1597, 82 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-inverted-sorter-tiny rotate: false - xy: 1675, 246 + xy: 1927, 351 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11827,28 +11848,28 @@ block-inverted-sorter-xlarge index: -1 block-item-source-large rotate: false - xy: 985, 849 + xy: 985, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-source-medium rotate: false - xy: 935, 202 + xy: 1701, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-source-small rotate: false - xy: 1912, 467 + xy: 1623, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-source-tiny rotate: false - xy: 1621, 174 + xy: 1945, 351 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11862,28 +11883,28 @@ block-item-source-xlarge index: -1 block-item-void-large rotate: false - xy: 859, 723 + xy: 1027, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-void-medium rotate: false - xy: 935, 168 + xy: 1735, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-void-small rotate: false - xy: 1912, 441 + xy: 1649, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-void-tiny rotate: false - xy: 1639, 192 + xy: 1963, 351 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11897,28 +11918,28 @@ block-item-void-xlarge index: -1 block-javelin-ship-pad-large rotate: false - xy: 901, 723 + xy: 943, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-javelin-ship-pad-medium rotate: false - xy: 935, 134 + xy: 1769, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-javelin-ship-pad-small rotate: false - xy: 1912, 415 + xy: 1675, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-javelin-ship-pad-tiny rotate: false - xy: 1657, 210 + xy: 1981, 351 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11932,28 +11953,28 @@ block-javelin-ship-pad-xlarge index: -1 block-junction-large rotate: false - xy: 943, 765 + xy: 985, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-junction-medium rotate: false - xy: 935, 100 + xy: 1803, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-junction-small rotate: false - xy: 1912, 389 + xy: 1701, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-junction-tiny rotate: false - xy: 1675, 228 + xy: 1999, 351 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11967,28 +11988,28 @@ block-junction-xlarge index: -1 block-kiln-large rotate: false - xy: 985, 807 + xy: 1027, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-kiln-medium rotate: false - xy: 957, 576 + xy: 1837, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-kiln-small rotate: false - xy: 1938, 463 + xy: 1605, 387 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-kiln-tiny rotate: false - xy: 1693, 246 + xy: 2017, 351 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12002,28 +12023,28 @@ block-kiln-xlarge index: -1 block-lancer-large rotate: false - xy: 1027, 849 + xy: 1069, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-lancer-medium rotate: false - xy: 991, 584 + xy: 1871, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-lancer-small rotate: false - xy: 1938, 437 + xy: 1631, 389 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-lancer-tiny rotate: false - xy: 1621, 156 + xy: 1822, 343 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12037,28 +12058,28 @@ block-lancer-xlarge index: -1 block-laser-drill-large rotate: false - xy: 859, 681 + xy: 985, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-laser-drill-medium rotate: false - xy: 1025, 584 + xy: 1905, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-laser-drill-small rotate: false - xy: 1938, 411 + xy: 1673, 455 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-laser-drill-tiny rotate: false - xy: 1639, 174 + xy: 1822, 325 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12072,35 +12093,35 @@ block-laser-drill-xlarge index: -1 block-launch-pad-large rotate: false - xy: 901, 681 + xy: 1027, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-large rotate: false - xy: 943, 723 + xy: 1069, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-medium rotate: false - xy: 1059, 584 + xy: 1939, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-large-small rotate: false - xy: 1938, 385 + xy: 1699, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-large-tiny rotate: false - xy: 1657, 192 + xy: 1840, 345 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12114,21 +12135,21 @@ block-launch-pad-large-xlarge index: -1 block-launch-pad-medium rotate: false - xy: 1093, 584 + xy: 901, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-small rotate: false - xy: 1964, 445 + xy: 1725, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-tiny rotate: false - xy: 1675, 210 + xy: 1858, 345 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12142,28 +12163,28 @@ block-launch-pad-xlarge index: -1 block-liquid-junction-large rotate: false - xy: 985, 765 + xy: 1111, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-junction-medium rotate: false - xy: 1127, 584 + xy: 901, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-junction-small rotate: false - xy: 1964, 419 + xy: 1751, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-junction-tiny rotate: false - xy: 1693, 228 + xy: 1840, 327 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12177,28 +12198,28 @@ block-liquid-junction-xlarge index: -1 block-liquid-router-large rotate: false - xy: 1027, 807 + xy: 1027, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-router-medium rotate: false - xy: 1161, 584 + xy: 935, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-router-small rotate: false - xy: 1990, 445 + xy: 1777, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-router-tiny rotate: false - xy: 1711, 246 + xy: 1858, 327 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12212,28 +12233,28 @@ block-liquid-router-xlarge index: -1 block-liquid-source-large rotate: false - xy: 1069, 849 + xy: 1069, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-source-medium rotate: false - xy: 1195, 584 + xy: 901, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-source-small rotate: false - xy: 1964, 393 + xy: 1803, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-source-tiny rotate: false - xy: 1621, 138 + xy: 1701, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12247,28 +12268,28 @@ block-liquid-source-xlarge index: -1 block-liquid-tank-large rotate: false - xy: 943, 681 + xy: 1111, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-tank-medium rotate: false - xy: 1229, 584 + xy: 935, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-small rotate: false - xy: 1990, 419 + xy: 1829, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-tank-tiny rotate: false - xy: 1639, 156 + xy: 1701, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12280,3929 +12301,3964 @@ block-liquid-tank-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-magmarock-large - rotate: false - xy: 985, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 1263, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 1990, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 1657, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 151, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 1027, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 1297, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 2016, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 1675, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 201, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 1069, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 1331, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 2016, 419 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 1693, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 151, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 1111, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 1365, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 2016, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 1711, 228 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 201, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 985, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 1399, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 1964, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 1639, 138 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 151, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large - rotate: false - xy: 1027, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-melter-medium - rotate: false - xy: 1433, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-melter-small - rotate: false - xy: 1990, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-melter-tiny - rotate: false - xy: 1657, 156 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-melter-xlarge - rotate: false - xy: 201, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mend-projector-large - rotate: false - xy: 1069, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mend-projector-medium - rotate: false - xy: 1467, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mend-projector-small - rotate: false - xy: 2016, 367 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mend-projector-tiny - rotate: false - xy: 1675, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mend-projector-xlarge - rotate: false - xy: 151, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mender-large - rotate: false - xy: 1111, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mender-medium - rotate: false - xy: 1501, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mender-small - rotate: false - xy: 1473, 220 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mender-tiny - rotate: false - xy: 1693, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mender-xlarge - rotate: false - xy: 201, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-message-large +block-liquid-void-large rotate: false xy: 1153, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-message-medium +block-liquid-void-medium rotate: false - xy: 1535, 584 + xy: 969, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-message-small +block-liquid-void-small rotate: false - xy: 1473, 194 + xy: 1855, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-message-tiny +block-liquid-void-tiny rotate: false - xy: 1711, 210 + xy: 1719, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-message-xlarge +block-liquid-void-xlarge rotate: false - xy: 151, 108 + xy: 151, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-2-large - rotate: false - xy: 1027, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-2-medium - rotate: false - xy: 1569, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-2-small - rotate: false - xy: 1447, 188 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-2-tiny - rotate: false - xy: 1657, 138 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-2-xlarge - rotate: false - xy: 201, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-3-large +block-magmarock-large rotate: false xy: 1069, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-3-medium +block-magmarock-medium rotate: false - xy: 1603, 584 + xy: 901, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-3-small +block-magmarock-small rotate: false - xy: 1499, 222 + xy: 1881, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-3-tiny +block-magmarock-tiny rotate: false - xy: 1675, 156 + xy: 1701, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-3-xlarge +block-magmarock-xlarge rotate: false - xy: 151, 58 + xy: 201, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-5-large +block-mass-driver-large rotate: false xy: 1111, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-5-medium +block-mass-driver-medium rotate: false - xy: 1637, 584 + xy: 935, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-5-small +block-mass-driver-small rotate: false - xy: 1499, 196 + xy: 1907, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-5-tiny +block-mass-driver-tiny rotate: false - xy: 1693, 174 + xy: 1719, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-5-xlarge +block-mass-driver-xlarge rotate: false - xy: 201, 108 + xy: 151, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-damaged-large +block-mechanical-drill-large rotate: false xy: 1153, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-damaged-medium +block-mechanical-drill-medium rotate: false - xy: 1671, 584 + xy: 969, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-damaged-small +block-mechanical-drill-small rotate: false - xy: 1473, 168 + xy: 1933, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-damaged-tiny +block-mechanical-drill-tiny rotate: false - xy: 1711, 192 + xy: 1737, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-damaged-xlarge +block-mechanical-drill-xlarge rotate: false - xy: 201, 58 + xy: 201, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-large +block-mechanical-pump-large rotate: false xy: 1195, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-medium +block-mechanical-pump-medium rotate: false - xy: 1705, 584 + xy: 1003, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-small +block-mechanical-pump-small rotate: false - xy: 1499, 170 + xy: 1959, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-tiny +block-mechanical-pump-tiny rotate: false - xy: 1675, 138 + xy: 1719, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-xlarge +block-mechanical-pump-xlarge rotate: false - xy: 251, 508 + xy: 151, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-moss-large - rotate: false - xy: 1069, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-moss-medium - rotate: false - xy: 1739, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-small - rotate: false - xy: 1447, 162 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-moss-tiny - rotate: false - xy: 1693, 156 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-moss-xlarge - rotate: false - xy: 251, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multi-press-large +block-meltdown-large rotate: false xy: 1111, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multi-press-medium +block-meltdown-medium rotate: false - xy: 1773, 584 + xy: 901, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multi-press-small +block-meltdown-small rotate: false - xy: 1473, 142 + xy: 1985, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multi-press-tiny +block-meltdown-tiny rotate: false - xy: 1711, 174 + xy: 1755, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multi-press-xlarge +block-meltdown-xlarge rotate: false - xy: 251, 408 + xy: 201, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-oil-extractor-large +block-melter-large rotate: false xy: 1153, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-oil-extractor-medium +block-melter-medium rotate: false - xy: 969, 542 + xy: 935, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-oil-extractor-small +block-melter-small rotate: false - xy: 1499, 144 + xy: 2011, 457 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-oil-extractor-tiny +block-melter-tiny rotate: false - xy: 1693, 138 + xy: 1737, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-oil-extractor-xlarge +block-melter-xlarge rotate: false - xy: 251, 358 + xy: 151, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-omega-mech-pad-large +block-mend-projector-large rotate: false xy: 1195, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-omega-mech-pad-medium +block-mend-projector-medium rotate: false - xy: 969, 508 + xy: 969, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-omega-mech-pad-small +block-mend-projector-small rotate: false - xy: 1447, 136 + xy: 1673, 429 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-omega-mech-pad-tiny +block-mend-projector-tiny rotate: false - xy: 1711, 156 + xy: 1773, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-omega-mech-pad-xlarge +block-mend-projector-xlarge rotate: false - xy: 251, 308 + xy: 201, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-projector-large +block-mender-large rotate: false xy: 1237, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-projector-medium +block-mender-medium rotate: false - xy: 969, 474 + xy: 1003, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-projector-small +block-mender-small rotate: false - xy: 1473, 116 + xy: 1699, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-projector-tiny +block-mender-tiny rotate: false - xy: 1711, 138 + xy: 1755, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-projector-xlarge +block-mender-xlarge rotate: false - xy: 251, 258 + xy: 151, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overflow-gate-large - rotate: false - xy: 1111, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overflow-gate-medium - rotate: false - xy: 969, 440 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overflow-gate-small - rotate: false - xy: 1499, 118 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overflow-gate-tiny - rotate: false - xy: 1729, 222 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overflow-gate-xlarge - rotate: false - xy: 251, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pebbles-large +block-message-large rotate: false xy: 1153, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pebbles-medium +block-message-medium rotate: false - xy: 969, 406 + xy: 1037, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pebbles-small +block-message-small rotate: false - xy: 1447, 110 + xy: 1725, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pebbles-tiny +block-message-tiny rotate: false - xy: 1729, 204 + xy: 1737, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pebbles-xlarge +block-message-xlarge rotate: false - xy: 251, 158 + xy: 201, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phantom-factory-large +block-metal-floor-2-large rotate: false xy: 1195, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phantom-factory-medium +block-metal-floor-2-medium rotate: false - xy: 969, 372 + xy: 901, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phantom-factory-small +block-metal-floor-2-small rotate: false - xy: 1473, 90 + xy: 1751, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phantom-factory-tiny +block-metal-floor-2-tiny rotate: false - xy: 1747, 222 + xy: 1791, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phantom-factory-xlarge +block-metal-floor-2-xlarge rotate: false - xy: 251, 108 + xy: 151, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conduit-large +block-metal-floor-3-large rotate: false xy: 1237, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conduit-medium +block-metal-floor-3-medium rotate: false - xy: 969, 338 + xy: 935, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conduit-small +block-metal-floor-3-small rotate: false - xy: 1499, 92 + xy: 1777, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conduit-tiny +block-metal-floor-3-tiny rotate: false - xy: 1765, 222 + xy: 1773, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conduit-xlarge +block-metal-floor-3-xlarge rotate: false - xy: 251, 58 + xy: 201, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conveyor-large +block-metal-floor-5-large rotate: false xy: 1279, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conveyor-medium +block-metal-floor-5-medium rotate: false - xy: 969, 304 + xy: 969, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conveyor-small +block-metal-floor-5-small rotate: false - xy: 1447, 84 + xy: 1803, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conveyor-tiny +block-metal-floor-5-tiny rotate: false - xy: 1729, 186 + xy: 1755, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conveyor-xlarge +block-metal-floor-5-xlarge rotate: false - xy: 151, 8 + xy: 201, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-large - rotate: false - xy: 1153, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-large +block-metal-floor-damaged-large rotate: false xy: 1195, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-wall-large-medium +block-metal-floor-damaged-medium rotate: false - xy: 969, 270 + xy: 1003, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-wall-large-small +block-metal-floor-damaged-small rotate: false - xy: 1435, 58 + xy: 1829, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-wall-large-tiny +block-metal-floor-damaged-tiny rotate: false - xy: 1747, 204 + xy: 1809, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-wall-large-xlarge +block-metal-floor-damaged-xlarge rotate: false - xy: 201, 8 + xy: 251, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-medium - rotate: false - xy: 969, 236 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 1461, 58 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1729, 168 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 251, 8 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large +block-metal-floor-large rotate: false xy: 1237, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-weaver-medium +block-metal-floor-medium rotate: false - xy: 969, 202 + xy: 1037, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-weaver-small +block-metal-floor-small rotate: false - xy: 1447, 32 + xy: 1855, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-weaver-tiny +block-metal-floor-tiny rotate: false - xy: 1747, 186 + xy: 1791, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-weaver-xlarge +block-metal-floor-xlarge rotate: false - xy: 281, 619 + xy: 251, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pine-large +block-moss-large rotate: false xy: 1279, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pine-medium +block-moss-medium rotate: false - xy: 969, 168 + xy: 1071, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pine-small +block-moss-small rotate: false - xy: 1447, 6 + xy: 1881, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pine-tiny +block-moss-tiny rotate: false - xy: 1765, 204 + xy: 1773, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pine-xlarge +block-moss-xlarge rotate: false - xy: 281, 569 + xy: 251, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-compressor-large +block-multi-press-large rotate: false xy: 1321, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-compressor-medium +block-multi-press-medium rotate: false - xy: 969, 134 + xy: 901, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-compressor-small +block-multi-press-small rotate: false - xy: 1473, 32 + xy: 1907, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-compressor-tiny +block-multi-press-tiny rotate: false - xy: 1783, 221 + xy: 1809, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-compressor-xlarge +block-multi-press-xlarge rotate: false - xy: 301, 519 + xy: 251, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-large - rotate: false - xy: 1195, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-large +block-oil-extractor-large rotate: false xy: 1237, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-wall-large-medium +block-oil-extractor-medium rotate: false - xy: 969, 100 + xy: 935, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-large-small +block-oil-extractor-small rotate: false - xy: 1473, 6 + xy: 1933, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-large-tiny +block-oil-extractor-tiny rotate: false - xy: 1729, 150 + xy: 1791, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-large-xlarge +block-oil-extractor-xlarge rotate: false - xy: 301, 469 + xy: 251, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-medium - rotate: false - xy: 1003, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-small - rotate: false - xy: 1487, 64 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-tiny - rotate: false - xy: 1747, 168 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-xlarge - rotate: false - xy: 301, 419 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plated-conduit-large +block-omega-mech-pad-large rotate: false xy: 1279, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plated-conduit-medium +block-omega-mech-pad-medium rotate: false - xy: 1003, 516 + xy: 969, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plated-conduit-small +block-omega-mech-pad-small rotate: false - xy: 1513, 66 + xy: 1959, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plated-conduit-tiny +block-omega-mech-pad-tiny rotate: false - xy: 1765, 186 + xy: 1809, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plated-conduit-xlarge +block-omega-mech-pad-xlarge rotate: false - xy: 301, 369 + xy: 251, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pneumatic-drill-large +block-overdrive-projector-large rotate: false xy: 1321, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pneumatic-drill-medium +block-overdrive-projector-medium rotate: false - xy: 1037, 550 + xy: 1003, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pneumatic-drill-small +block-overdrive-projector-small rotate: false - xy: 1499, 38 + xy: 1985, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pneumatic-drill-tiny +block-overdrive-projector-tiny rotate: false - xy: 1783, 203 + xy: 1827, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pneumatic-drill-xlarge +block-overdrive-projector-xlarge rotate: false - xy: 301, 319 + xy: 251, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-large +block-overflow-gate-large rotate: false xy: 1363, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-node-large-large +block-overflow-gate-medium rotate: false - xy: 1237, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 1003, 482 + xy: 1037, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-large-small +block-overflow-gate-small rotate: false - xy: 1499, 12 + xy: 2011, 431 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-large-tiny +block-overflow-gate-tiny rotate: false - xy: 1747, 150 + xy: 1827, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-large-xlarge +block-overflow-gate-xlarge rotate: false - xy: 301, 269 + xy: 251, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-medium - rotate: false - xy: 1037, 516 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 1525, 40 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 1765, 168 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 301, 219 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large +block-pebbles-large rotate: false xy: 1279, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-source-medium +block-pebbles-medium rotate: false - xy: 1071, 550 + xy: 1071, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-source-small +block-pebbles-small rotate: false - xy: 1525, 14 + xy: 1363, 97 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-source-tiny +block-pebbles-tiny rotate: false - xy: 1783, 185 + xy: 1827, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-source-xlarge +block-pebbles-xlarge rotate: false - xy: 301, 169 + xy: 251, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-void-large +block-phantom-factory-large rotate: false xy: 1321, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-void-medium +block-phantom-factory-medium rotate: false - xy: 1003, 448 + xy: 1105, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-void-small +block-phantom-factory-small rotate: false - xy: 1575, 322 + xy: 1389, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-void-tiny +block-phantom-factory-tiny rotate: false - xy: 1765, 150 + xy: 1845, 309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-void-xlarge +block-phantom-factory-xlarge rotate: false - xy: 301, 119 + xy: 251, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulse-conduit-large +block-phase-conduit-large rotate: false xy: 1363, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulse-conduit-medium +block-phase-conduit-medium rotate: false - xy: 1037, 482 + xy: 901, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulse-conduit-small +block-phase-conduit-small rotate: false - xy: 1575, 296 + xy: 1415, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulse-conduit-tiny +block-phase-conduit-tiny rotate: false - xy: 1783, 167 + xy: 1845, 291 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulse-conduit-xlarge +block-phase-conduit-xlarge rotate: false - xy: 301, 69 + xy: 151, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulverizer-large +block-phase-conveyor-large rotate: false xy: 1405, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulverizer-medium +block-phase-conveyor-medium rotate: false - xy: 1071, 516 + xy: 935, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulverizer-small +block-phase-conveyor-small rotate: false - xy: 1601, 324 + xy: 1441, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulverizer-tiny +block-phase-conveyor-tiny rotate: false - xy: 1783, 149 + xy: 1845, 273 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulverizer-xlarge +block-phase-conveyor-xlarge rotate: false - xy: 301, 19 + xy: 201, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pyratite-mixer-large - rotate: false - xy: 1279, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pyratite-mixer-medium - rotate: false - xy: 1105, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pyratite-mixer-small - rotate: false - xy: 1601, 298 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pyratite-mixer-tiny - rotate: false - xy: 1729, 132 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pyratite-mixer-xlarge - rotate: false - xy: 795, 878 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-repair-point-large +block-phase-wall-large rotate: false xy: 1321, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-repair-point-medium - rotate: false - xy: 1003, 414 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-small - rotate: false - xy: 1730, 370 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-repair-point-tiny - rotate: false - xy: 1747, 132 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-repair-point-xlarge - rotate: false - xy: 309, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-revenant-factory-large +block-phase-wall-large-large rotate: false xy: 1363, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-revenant-factory-medium +block-phase-wall-large-medium rotate: false - xy: 1037, 448 + xy: 969, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-revenant-factory-small +block-phase-wall-large-small rotate: false - xy: 1756, 370 + xy: 1467, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-revenant-factory-tiny +block-phase-wall-large-tiny rotate: false - xy: 1765, 132 + xy: 1863, 309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-revenant-factory-xlarge +block-phase-wall-large-xlarge rotate: false - xy: 309, 766 + xy: 251, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ripple-large +block-phase-wall-medium + rotate: false + xy: 1003, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-small + rotate: false + xy: 1493, 79 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-tiny + rotate: false + xy: 1863, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-xlarge + rotate: false + xy: 281, 619 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-weaver-large rotate: false xy: 1405, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ripple-medium +block-phase-weaver-medium rotate: false - xy: 1071, 482 + xy: 1037, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ripple-small +block-phase-weaver-small rotate: false - xy: 1782, 370 + xy: 1519, 67 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ripple-tiny +block-phase-weaver-tiny rotate: false - xy: 1783, 131 + xy: 1863, 273 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ripple-xlarge +block-phase-weaver-xlarge rotate: false - xy: 359, 816 + xy: 281, 569 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rock-large +block-pine-large rotate: false xy: 1447, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rock-medium +block-pine-medium rotate: false - xy: 1105, 516 + xy: 1071, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rock-small +block-pine-small rotate: false - xy: 1808, 366 + xy: 1361, 71 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rock-tiny +block-pine-tiny rotate: false - xy: 1621, 120 + xy: 1716, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rock-xlarge +block-pine-xlarge rotate: false - xy: 309, 716 + xy: 301, 519 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rocks-large - rotate: false - xy: 1321, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rocks-medium - rotate: false - xy: 1139, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rocks-small - rotate: false - xy: 1834, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rocks-tiny - rotate: false - xy: 1639, 120 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rocks-xlarge - rotate: false - xy: 359, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rotary-pump-large +block-plastanium-compressor-large rotate: false xy: 1363, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rotary-pump-medium +block-plastanium-compressor-medium rotate: false - xy: 1003, 380 + xy: 1105, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rotary-pump-small +block-plastanium-compressor-small rotate: false - xy: 1860, 363 + xy: 1361, 45 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rotary-pump-tiny +block-plastanium-compressor-tiny rotate: false - xy: 1657, 120 + xy: 1716, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rotary-pump-xlarge +block-plastanium-compressor-xlarge rotate: false - xy: 409, 816 + xy: 301, 469 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-router-large +block-plastanium-wall-large rotate: false xy: 1405, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-router-medium - rotate: false - xy: 1037, 414 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-router-small - rotate: false - xy: 1886, 363 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-router-tiny - rotate: false - xy: 1675, 120 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-router-xlarge - rotate: false - xy: 359, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rtg-generator-large +block-plastanium-wall-large-large rotate: false xy: 1447, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rtg-generator-medium +block-plastanium-wall-large-medium rotate: false - xy: 1071, 448 + xy: 1139, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rtg-generator-small +block-plastanium-wall-large-small rotate: false - xy: 1912, 363 + xy: 1361, 19 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rtg-generator-tiny +block-plastanium-wall-large-tiny rotate: false - xy: 1693, 120 + xy: 1734, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rtg-generator-xlarge +block-plastanium-wall-large-xlarge rotate: false - xy: 409, 766 + xy: 301, 419 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salt-large +block-plastanium-wall-medium + rotate: false + xy: 901, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-small + rotate: false + xy: 1545, 56 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-wall-tiny + rotate: false + xy: 1716, 217 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-wall-xlarge + rotate: false + xy: 301, 369 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plated-conduit-large rotate: false xy: 1489, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salt-medium +block-plated-conduit-medium rotate: false - xy: 1105, 482 + xy: 935, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salt-small +block-plated-conduit-small rotate: false - xy: 1938, 359 + xy: 1571, 56 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salt-tiny +block-plated-conduit-tiny rotate: false - xy: 1711, 120 + xy: 1752, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salt-xlarge +block-plated-conduit-xlarge rotate: false - xy: 459, 816 + xy: 301, 319 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-saltrocks-large - rotate: false - xy: 1363, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-saltrocks-medium - rotate: false - xy: 1139, 516 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-small - rotate: false - xy: 1964, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-saltrocks-tiny - rotate: false - xy: 1729, 114 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-saltrocks-xlarge - rotate: false - xy: 409, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salvo-large +block-pneumatic-drill-large rotate: false xy: 1405, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salvo-medium +block-pneumatic-drill-medium rotate: false - xy: 1173, 550 + xy: 969, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salvo-small +block-pneumatic-drill-small rotate: false - xy: 1990, 341 + xy: 1597, 56 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salvo-tiny +block-pneumatic-drill-tiny rotate: false - xy: 1747, 114 + xy: 1734, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salvo-xlarge +block-pneumatic-drill-xlarge rotate: false - xy: 459, 766 + xy: 301, 269 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-boulder-large +block-power-node-large rotate: false xy: 1447, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-boulder-medium - rotate: false - xy: 1003, 346 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 2016, 341 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 1765, 114 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge - rotate: false - xy: 509, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-large +block-power-node-large-large rotate: false xy: 1489, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-medium +block-power-node-large-medium rotate: false - xy: 1037, 380 + xy: 1003, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-small +block-power-node-large-small rotate: false - xy: 1375, 184 + xy: 1623, 43 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-tiny +block-power-node-large-tiny rotate: false - xy: 1783, 113 + xy: 1716, 199 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-large +block-power-node-large-xlarge + rotate: false + xy: 301, 219 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-medium + rotate: false + xy: 1037, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-small + rotate: false + xy: 1649, 43 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-tiny + rotate: false + xy: 1716, 181 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-xlarge + rotate: false + xy: 301, 169 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-source-large rotate: false xy: 1531, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-water-medium +block-power-source-medium rotate: false - xy: 1071, 414 + xy: 1071, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-water-small +block-power-source-small rotate: false - xy: 1401, 186 + xy: 1675, 43 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-water-tiny +block-power-source-tiny rotate: false - xy: 1603, 110 + xy: 1770, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-xlarge +block-power-source-xlarge rotate: false - xy: 459, 716 + xy: 301, 119 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-xlarge - rotate: false - xy: 509, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sandrocks-large - rotate: false - xy: 1405, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sandrocks-medium - rotate: false - xy: 1105, 448 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-small - rotate: false - xy: 1375, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sandrocks-tiny - rotate: false - xy: 1621, 102 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sandrocks-xlarge - rotate: false - xy: 559, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scatter-large +block-power-void-large rotate: false xy: 1447, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scatter-medium +block-power-void-medium rotate: false - xy: 1139, 482 + xy: 1105, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scatter-small +block-power-void-small rotate: false - xy: 1401, 160 + xy: 1701, 43 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scatter-tiny +block-power-void-tiny rotate: false - xy: 1639, 102 + xy: 1752, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scatter-xlarge +block-power-void-xlarge rotate: false - xy: 509, 716 + xy: 301, 69 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scorch-large +block-pulse-conduit-large rotate: false xy: 1489, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scorch-medium +block-pulse-conduit-medium rotate: false - xy: 1173, 516 + xy: 1139, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scorch-small +block-pulse-conduit-small rotate: false - xy: 1403, 134 + xy: 1631, 363 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scorch-tiny +block-pulse-conduit-tiny rotate: false - xy: 1657, 102 + xy: 1734, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scorch-xlarge +block-pulse-conduit-xlarge rotate: false - xy: 559, 766 + xy: 301, 19 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-large +block-pulverizer-large rotate: false xy: 1531, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-medium +block-pulverizer-medium rotate: false - xy: 1207, 550 + xy: 1173, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-small +block-pulverizer-small rotate: false - xy: 1507, 254 + xy: 1626, 337 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-tiny +block-pulverizer-tiny rotate: false - xy: 1675, 102 + xy: 1788, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-xlarge +block-pulverizer-xlarge rotate: false - xy: 609, 816 + xy: 795, 878 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-huge-large +block-pyratite-mixer-large rotate: false xy: 1573, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-huge-medium +block-pyratite-mixer-medium rotate: false - xy: 1003, 312 + xy: 901, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-huge-small +block-pyratite-mixer-small rotate: false - xy: 1533, 256 + xy: 1626, 311 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-huge-tiny +block-pyratite-mixer-tiny rotate: false - xy: 1693, 102 + xy: 1770, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-huge-xlarge +block-pyratite-mixer-xlarge rotate: false - xy: 559, 716 + xy: 309, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-large - rotate: false - xy: 1447, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large +block-repair-point-large rotate: false xy: 1489, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-large-medium +block-repair-point-medium rotate: false - xy: 1037, 346 + xy: 935, 283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-large-small +block-repair-point-small rotate: false - xy: 1613, 394 + xy: 1652, 337 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-large-tiny +block-repair-point-tiny rotate: false - xy: 1711, 102 + xy: 1752, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-large-xlarge +block-repair-point-xlarge rotate: false - xy: 609, 766 + xy: 309, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-medium - rotate: false - xy: 1071, 380 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 1611, 368 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 1729, 96 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 659, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large +block-revenant-factory-large rotate: false xy: 1531, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-separator-medium +block-revenant-factory-medium rotate: false - xy: 1105, 414 + xy: 969, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-separator-small +block-revenant-factory-small rotate: false - xy: 1601, 272 + xy: 1652, 311 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-separator-tiny +block-revenant-factory-tiny rotate: false - xy: 1747, 96 + xy: 1734, 199 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-separator-xlarge +block-revenant-factory-xlarge rotate: false - xy: 609, 716 + xy: 359, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-boulder-large +block-ripple-large rotate: false xy: 1573, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-boulder-medium +block-ripple-medium rotate: false - xy: 1139, 448 + xy: 1003, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-boulder-small +block-ripple-small rotate: false - xy: 1525, 228 + xy: 1649, 285 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-boulder-tiny +block-ripple-tiny rotate: false - xy: 1765, 96 + xy: 1734, 181 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-boulder-xlarge +block-ripple-xlarge rotate: false - xy: 659, 766 + xy: 309, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-large +block-rock-large rotate: false xy: 1615, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-medium +block-rock-medium rotate: false - xy: 1173, 482 + xy: 1037, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-small +block-rock-small rotate: false - xy: 1525, 202 + xy: 1649, 259 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-tiny +block-rock-tiny rotate: false - xy: 1783, 95 + xy: 1806, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-xlarge +block-rock-xlarge rotate: false - xy: 709, 816 + xy: 359, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shalerocks-large - rotate: false - xy: 1489, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shalerocks-medium - rotate: false - xy: 1207, 516 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-small - rotate: false - xy: 1525, 176 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shalerocks-tiny - rotate: false - xy: 1801, 311 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shalerocks-xlarge - rotate: false - xy: 659, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large +block-rocks-large rotate: false xy: 1531, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shock-mine-medium +block-rocks-medium rotate: false - xy: 1241, 550 + xy: 1071, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shock-mine-small +block-rocks-small rotate: false - xy: 1525, 150 + xy: 1675, 285 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shock-mine-tiny +block-rocks-tiny rotate: false - xy: 1801, 293 + xy: 1788, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shock-mine-xlarge +block-rocks-xlarge rotate: false - xy: 709, 766 + xy: 409, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shrubs-large +block-rotary-pump-large rotate: false xy: 1573, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shrubs-medium +block-rotary-pump-medium rotate: false - xy: 1003, 278 + xy: 1105, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shrubs-small +block-rotary-pump-small rotate: false - xy: 1525, 124 + xy: 1675, 259 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shrubs-tiny +block-rotary-pump-tiny rotate: false - xy: 1801, 275 + xy: 1770, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shrubs-xlarge +block-rotary-pump-xlarge rotate: false - xy: 709, 716 + xy: 359, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-smelter-large +block-router-large rotate: false xy: 1615, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-smelter-medium +block-router-medium rotate: false - xy: 1037, 312 + xy: 1139, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-smelter-small +block-router-small rotate: false - xy: 1525, 98 + xy: 1664, 233 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-smelter-tiny +block-router-tiny rotate: false - xy: 1801, 257 + xy: 1752, 199 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-smelter-xlarge +block-router-xlarge rotate: false - xy: 759, 816 + xy: 409, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-large +block-rtg-generator-large rotate: false xy: 1657, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snow-medium +block-rtg-generator-medium rotate: false - xy: 1071, 346 + xy: 1173, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snow-pine-large +block-rtg-generator-small rotate: false - xy: 1531, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 1105, 380 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 1551, 230 + xy: 1664, 207 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-pine-tiny +block-rtg-generator-tiny rotate: false - xy: 1801, 239 + xy: 1824, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-pine-xlarge +block-rtg-generator-xlarge rotate: false - xy: 759, 766 + xy: 459, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-small - rotate: false - xy: 1551, 204 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 1801, 221 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 759, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrock-large +block-salt-large rotate: false xy: 1573, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snowrock-medium +block-salt-medium rotate: false - xy: 1139, 414 + xy: 901, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snowrock-small +block-salt-small rotate: false - xy: 1551, 178 + xy: 1664, 181 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrock-tiny +block-salt-tiny rotate: false - xy: 1801, 203 + xy: 1806, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrock-xlarge +block-salt-xlarge rotate: false - xy: 809, 828 + xy: 409, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snowrocks-large +block-saltrocks-large rotate: false xy: 1615, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snowrocks-medium +block-saltrocks-medium rotate: false - xy: 1173, 448 + xy: 935, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snowrocks-small +block-saltrocks-small rotate: false - xy: 1551, 152 + xy: 1690, 233 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrocks-tiny +block-saltrocks-tiny rotate: false - xy: 1801, 185 + xy: 1788, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrocks-xlarge +block-saltrocks-xlarge rotate: false - xy: 809, 778 + xy: 459, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-large +block-salvo-large rotate: false xy: 1657, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-solar-panel-large-large +block-salvo-medium + rotate: false + xy: 969, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-small + rotate: false + xy: 1690, 207 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salvo-tiny + rotate: false + xy: 1770, 199 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salvo-xlarge + rotate: false + xy: 509, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-boulder-large rotate: false xy: 1699, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-solar-panel-large-medium +block-sand-boulder-medium rotate: false - xy: 1207, 482 + xy: 1003, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-solar-panel-large-small +block-sand-boulder-small rotate: false - xy: 1551, 126 + xy: 1690, 181 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-solar-panel-large-tiny +block-sand-boulder-tiny rotate: false - xy: 1801, 167 + xy: 1752, 181 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-solar-panel-large-xlarge +block-sand-boulder-xlarge rotate: false - xy: 809, 728 + xy: 459, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-medium - rotate: false - xy: 1241, 516 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 1551, 100 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 1801, 149 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 809, 678 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 1573, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 1275, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 1539, 72 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 1801, 131 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 331, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large +block-sand-large rotate: false xy: 1615, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spawn-medium +block-sand-medium rotate: false - xy: 1003, 244 + xy: 1037, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spawn-small +block-sand-small rotate: false - xy: 1565, 74 + xy: 1688, 155 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spawn-tiny +block-sand-tiny rotate: false - xy: 1801, 113 + xy: 1740, 163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spawn-xlarge - rotate: false - xy: 331, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large +block-sand-water-large rotate: false xy: 1657, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spectre-medium +block-sand-water-medium rotate: false - xy: 1037, 278 + xy: 1071, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spectre-small +block-sand-water-small rotate: false - xy: 1551, 46 + xy: 1639, 421 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spectre-tiny +block-sand-water-tiny rotate: false - xy: 1801, 95 + xy: 1824, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spectre-xlarge +block-sand-water-xlarge rotate: false - xy: 381, 666 + xy: 509, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spirit-factory-large +block-sand-xlarge + rotate: false + xy: 559, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sandrocks-large rotate: false xy: 1699, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spirit-factory-medium +block-sandrocks-medium rotate: false - xy: 1071, 312 + xy: 1105, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spirit-factory-small +block-sandrocks-small rotate: false - xy: 1551, 20 + xy: 1389, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spirit-factory-tiny +block-sandrocks-tiny rotate: false - xy: 1819, 309 + xy: 1806, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spirit-factory-xlarge +block-sandrocks-xlarge rotate: false - xy: 381, 616 + xy: 509, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-cluster-large +block-scatter-large rotate: false xy: 1741, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-cluster-medium +block-scatter-medium rotate: false - xy: 1105, 346 + xy: 1139, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-cluster-small +block-scatter-small rotate: false - xy: 1577, 48 + xy: 1415, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-cluster-tiny +block-scatter-tiny rotate: false - xy: 1819, 291 + xy: 1788, 199 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-cluster-xlarge +block-scatter-xlarge rotate: false - xy: 431, 666 + xy: 559, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-moss-large - rotate: false - xy: 1615, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 1139, 380 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-moss-small - rotate: false - xy: 1577, 22 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-moss-tiny - rotate: false - xy: 1837, 309 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-moss-xlarge - rotate: false - xy: 431, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-pine-large +block-scorch-large rotate: false xy: 1657, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-pine-medium +block-scorch-medium rotate: false - xy: 1173, 414 + xy: 1173, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-pine-small +block-scorch-small rotate: false - xy: 1541, 288 + xy: 1441, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-pine-tiny +block-scorch-tiny rotate: false - xy: 1819, 273 + xy: 1770, 181 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-pine-xlarge +block-scorch-xlarge rotate: false - xy: 481, 666 + xy: 609, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-press-large +block-scrap-wall-gigantic-large rotate: false xy: 1699, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-press-medium +block-scrap-wall-gigantic-medium rotate: false - xy: 1207, 448 + xy: 901, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-press-small +block-scrap-wall-gigantic-small rotate: false - xy: 1637, 368 + xy: 1467, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-press-tiny +block-scrap-wall-gigantic-tiny rotate: false - xy: 1837, 291 + xy: 1758, 163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-press-xlarge +block-scrap-wall-gigantic-xlarge rotate: false - xy: 481, 616 + xy: 559, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sporerocks-large +block-scrap-wall-huge-large rotate: false xy: 1741, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sporerocks-medium +block-scrap-wall-huge-medium rotate: false - xy: 1241, 482 + xy: 935, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sporerocks-small +block-scrap-wall-huge-small rotate: false - xy: 1663, 368 + xy: 1493, 53 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sporerocks-tiny +block-scrap-wall-huge-tiny rotate: false - xy: 1855, 309 + xy: 1824, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sporerocks-xlarge +block-scrap-wall-huge-xlarge rotate: false - xy: 531, 666 + xy: 609, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-stone-large +block-scrap-wall-large rotate: false xy: 1783, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-stone-medium - rotate: false - xy: 1275, 516 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-small - rotate: false - xy: 1689, 368 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-tiny - rotate: false - xy: 1819, 255 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-xlarge - rotate: false - xy: 531, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 1657, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 1309, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 1627, 342 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 1837, 273 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 581, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large +block-scrap-wall-large-large rotate: false xy: 1699, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-large +block-scrap-wall-large-medium + rotate: false + xy: 969, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-large-small + rotate: false + xy: 1519, 41 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-large-tiny + rotate: false + xy: 1806, 199 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-large-xlarge + rotate: false + xy: 659, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-medium + rotate: false + xy: 1003, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-small + rotate: false + xy: 1387, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-tiny + rotate: false + xy: 1788, 181 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-xlarge + rotate: false + xy: 609, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-separator-large rotate: false xy: 1741, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-medium +block-separator-medium rotate: false - xy: 1003, 210 + xy: 1037, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-large-small +block-separator-small rotate: false - xy: 1627, 316 + xy: 1413, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-large-tiny +block-separator-tiny rotate: false - xy: 1855, 291 + xy: 1776, 163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-large-xlarge +block-separator-xlarge rotate: false - xy: 581, 616 + xy: 659, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-medium - rotate: false - xy: 1037, 244 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 1653, 342 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 1873, 309 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 631, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large +block-shale-boulder-large rotate: false xy: 1783, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-swarmer-medium +block-shale-boulder-medium rotate: false - xy: 1071, 278 + xy: 1071, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-swarmer-small +block-shale-boulder-small rotate: false - xy: 1627, 290 + xy: 1387, 21 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-swarmer-tiny +block-shale-boulder-tiny rotate: false - xy: 1819, 237 + xy: 1824, 199 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-swarmer-xlarge +block-shale-boulder-xlarge rotate: false - xy: 631, 616 + xy: 709, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tainted-water-large +block-shale-large rotate: false xy: 1825, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tainted-water-medium +block-shale-medium rotate: false - xy: 1105, 312 + xy: 1105, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tainted-water-small +block-shale-small rotate: false - xy: 1653, 316 + xy: 1439, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tainted-water-tiny +block-shale-tiny rotate: false - xy: 1837, 255 + xy: 1806, 181 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tainted-water-xlarge +block-shale-xlarge rotate: false - xy: 681, 666 + xy: 659, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tar-large - rotate: false - xy: 1699, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium - rotate: false - xy: 1139, 346 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tar-small - rotate: false - xy: 1679, 342 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tar-tiny - rotate: false - xy: 1855, 273 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tar-xlarge - rotate: false - xy: 681, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tau-mech-pad-large +block-shalerocks-large rotate: false xy: 1741, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tau-mech-pad-medium +block-shalerocks-medium rotate: false - xy: 1173, 380 + xy: 1139, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tau-mech-pad-small +block-shalerocks-small rotate: false - xy: 1653, 290 + xy: 1413, 21 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tau-mech-pad-tiny +block-shalerocks-tiny rotate: false - xy: 1873, 291 + xy: 1794, 163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tau-mech-pad-xlarge +block-shalerocks-xlarge rotate: false - xy: 731, 666 + xy: 709, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tendrils-large +block-shock-mine-large rotate: false xy: 1783, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tendrils-medium +block-shock-mine-medium rotate: false - xy: 1207, 414 + xy: 1173, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tendrils-small +block-shock-mine-small rotate: false - xy: 1679, 316 + xy: 1439, 21 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tendrils-tiny +block-shock-mine-tiny rotate: false - xy: 1891, 309 + xy: 1824, 181 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tendrils-xlarge +block-shock-mine-xlarge rotate: false - xy: 731, 616 + xy: 709, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-generator-large +block-shrubs-large rotate: false xy: 1825, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-generator-medium +block-shrubs-medium rotate: false - xy: 1241, 448 + xy: 901, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-generator-small +block-shrubs-small rotate: false - xy: 1679, 290 + xy: 1465, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-generator-tiny +block-shrubs-tiny rotate: false - xy: 1819, 219 + xy: 1812, 163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-generator-xlarge +block-shrubs-xlarge rotate: false - xy: 781, 628 + xy: 759, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-pump-large +block-silicon-smelter-large rotate: false xy: 1867, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-pump-medium +block-silicon-smelter-medium rotate: false - xy: 1275, 482 + xy: 935, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-pump-small +block-silicon-smelter-small rotate: false - xy: 1627, 264 + xy: 1465, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-pump-tiny +block-silicon-smelter-tiny rotate: false - xy: 1837, 237 + xy: 1830, 163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-pump-xlarge +block-silicon-smelter-xlarge rotate: false - xy: 831, 628 + xy: 759, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-reactor-large - rotate: false - xy: 1741, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-reactor-medium - rotate: false - xy: 1309, 516 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-reactor-small - rotate: false - xy: 1653, 264 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-reactor-tiny - rotate: false - xy: 1855, 255 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-reactor-xlarge - rotate: false - xy: 781, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-large +block-snow-large rotate: false xy: 1783, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-large +block-snow-medium + rotate: false + xy: 969, 215 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-large rotate: false xy: 1825, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-medium +block-snow-pine-medium rotate: false - xy: 1343, 550 + xy: 1003, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-large-small +block-snow-pine-small rotate: false - xy: 1679, 264 + xy: 1491, 27 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-large-tiny +block-snow-pine-tiny rotate: false - xy: 1873, 273 + xy: 1763, 145 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-large-xlarge +block-snow-pine-xlarge rotate: false - xy: 831, 578 + xy: 759, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-medium +block-snow-small rotate: false - xy: 1003, 176 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 1705, 342 + xy: 1491, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-tiny +block-snow-tiny rotate: false - xy: 1891, 291 + xy: 1781, 145 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-xlarge +block-snow-xlarge rotate: false - xy: 351, 566 + xy: 809, 828 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thruster-large +block-snowrock-large rotate: false xy: 1867, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thruster-medium +block-snowrock-medium rotate: false - xy: 1037, 210 + xy: 1037, 283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thruster-small +block-snowrock-small rotate: false - xy: 1705, 316 + xy: 1517, 15 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thruster-tiny +block-snowrock-tiny rotate: false - xy: 1909, 309 + xy: 1763, 127 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thruster-xlarge +block-snowrock-xlarge rotate: false - xy: 351, 516 + xy: 809, 778 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titan-factory-large +block-snowrocks-large rotate: false xy: 1909, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titan-factory-medium +block-snowrocks-medium rotate: false - xy: 1071, 244 + xy: 1071, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titan-factory-small +block-snowrocks-small rotate: false - xy: 1705, 290 + xy: 1545, 30 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titan-factory-tiny +block-snowrocks-tiny rotate: false - xy: 1819, 201 + xy: 1781, 127 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titan-factory-xlarge +block-snowrocks-xlarge rotate: false - xy: 401, 566 + xy: 809, 728 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-conveyor-large - rotate: false - xy: 1783, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-conveyor-medium - rotate: false - xy: 1105, 278 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-small - rotate: false - xy: 1705, 264 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-conveyor-tiny - rotate: false - xy: 1837, 219 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-conveyor-xlarge - rotate: false - xy: 351, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-large +block-solar-panel-large rotate: false xy: 1825, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-wall-large-large +block-solar-panel-large-large rotate: false xy: 1867, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-wall-large-medium +block-solar-panel-large-medium rotate: false - xy: 1139, 312 + xy: 1105, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-large-small +block-solar-panel-large-small rotate: false - xy: 1731, 344 + xy: 1571, 30 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-large-tiny +block-solar-panel-large-tiny rotate: false - xy: 1855, 237 + xy: 1799, 145 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-large-xlarge +block-solar-panel-large-xlarge rotate: false - xy: 401, 516 + xy: 809, 678 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-medium +block-solar-panel-medium rotate: false - xy: 1173, 346 + xy: 1139, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-small +block-solar-panel-small rotate: false - xy: 1757, 344 + xy: 1597, 30 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-tiny +block-solar-panel-tiny rotate: false - xy: 1873, 255 + xy: 1763, 109 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-xlarge +block-solar-panel-xlarge rotate: false - xy: 451, 566 + xy: 331, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-trident-ship-pad-large +block-sorter-large rotate: false xy: 1909, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-trident-ship-pad-medium +block-sorter-medium rotate: false - xy: 1207, 380 + xy: 1173, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-trident-ship-pad-small +block-sorter-small rotate: false - xy: 1731, 318 + xy: 1543, 4 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-trident-ship-pad-tiny +block-sorter-tiny rotate: false - xy: 1891, 273 + xy: 1781, 109 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-trident-ship-pad-xlarge +block-sorter-xlarge rotate: false - xy: 351, 416 + xy: 331, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-turbine-generator-large - rotate: false - xy: 1825, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-turbine-generator-medium - rotate: false - xy: 1241, 414 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-small - rotate: false - xy: 1731, 292 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-turbine-generator-tiny - rotate: false - xy: 1909, 291 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-turbine-generator-xlarge - rotate: false - xy: 401, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-unloader-large +block-spawn-large rotate: false xy: 1867, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-unloader-medium +block-spawn-medium rotate: false - xy: 1275, 448 + xy: 901, 113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-unloader-small +block-spawn-small rotate: false - xy: 1757, 318 + xy: 1569, 4 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-unloader-tiny +block-spawn-tiny rotate: false - xy: 1819, 183 + xy: 1799, 127 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-unloader-xlarge +block-spawn-xlarge rotate: false - xy: 451, 516 + xy: 381, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-vault-large +block-spectre-large rotate: false xy: 1909, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-vault-medium +block-spectre-medium rotate: false - xy: 1309, 482 + xy: 935, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-vault-small +block-spectre-small rotate: false - xy: 1731, 266 + xy: 1595, 4 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-vault-tiny +block-spectre-tiny rotate: false - xy: 1837, 201 + xy: 1817, 145 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-vault-xlarge +block-spectre-xlarge rotate: false - xy: 501, 566 + xy: 381, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-extractor-large - rotate: false - xy: 1867, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-extractor-medium - rotate: false - xy: 1343, 516 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-extractor-small - rotate: false - xy: 1757, 292 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-extractor-tiny - rotate: false - xy: 1855, 219 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-extractor-xlarge - rotate: false - xy: 351, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-large +block-spirit-factory-large rotate: false xy: 1909, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-medium +block-spirit-factory-medium rotate: false - xy: 1377, 550 + xy: 969, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-small +block-spirit-factory-small rotate: false - xy: 1757, 266 + xy: 1623, 17 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-tiny +block-spirit-factory-tiny rotate: false - xy: 1873, 237 + xy: 1799, 109 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-xlarge +block-spirit-factory-xlarge + rotate: false + xy: 431, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-cluster-large + rotate: false + xy: 1951, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-cluster-medium + rotate: false + xy: 1003, 215 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-small + rotate: false + xy: 1649, 17 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-cluster-tiny + rotate: false + xy: 1817, 127 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-cluster-xlarge + rotate: false + xy: 431, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-moss-large + rotate: false + xy: 1951, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-medium + rotate: false + xy: 1037, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-moss-small + rotate: false + xy: 1675, 17 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-moss-tiny + rotate: false + xy: 1817, 109 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-moss-xlarge + rotate: false + xy: 481, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-pine-large + rotate: false + xy: 1951, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-pine-medium + rotate: false + xy: 1071, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-pine-small + rotate: false + xy: 1701, 17 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-pine-tiny + rotate: false + xy: 1835, 145 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-pine-xlarge + rotate: false + xy: 481, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-press-large + rotate: false + xy: 1951, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-press-medium + rotate: false + xy: 1105, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-small + rotate: false + xy: 1699, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-press-tiny + rotate: false + xy: 1835, 127 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-press-xlarge + rotate: false + xy: 531, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sporerocks-large + rotate: false + xy: 1979, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sporerocks-medium + rotate: false + xy: 1139, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sporerocks-small + rotate: false + xy: 1725, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sporerocks-tiny + rotate: false + xy: 1835, 109 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sporerocks-xlarge + rotate: false + xy: 531, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-stone-large + rotate: false + xy: 1993, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-medium + rotate: false + xy: 1173, 385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-small + rotate: false + xy: 1751, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-tiny + rotate: false + xy: 1779, 91 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-xlarge + rotate: false + xy: 581, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-tower-large + rotate: false + xy: 1993, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-tower-medium + rotate: false + xy: 901, 79 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-tower-small + rotate: false + xy: 1777, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-tower-tiny + rotate: false + xy: 1779, 73 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-tower-xlarge + rotate: false + xy: 581, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-large + rotate: false + xy: 1993, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-large + rotate: false + xy: 1993, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 935, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-large-small + rotate: false + xy: 1803, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-large-tiny + rotate: false + xy: 1797, 91 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-large-xlarge + rotate: false + xy: 631, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-medium + rotate: false + xy: 969, 147 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-small + rotate: false + xy: 1829, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-tiny + rotate: false + xy: 1779, 55 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-xlarge + rotate: false + xy: 631, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-swarmer-large + rotate: false + xy: 943, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-swarmer-medium + rotate: false + xy: 1003, 181 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-small + rotate: false + xy: 1855, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-swarmer-tiny + rotate: false + xy: 1797, 73 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-swarmer-xlarge + rotate: false + xy: 681, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tainted-water-large + rotate: false + xy: 985, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tainted-water-medium + rotate: false + xy: 1037, 215 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tainted-water-small + rotate: false + xy: 1881, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tainted-water-tiny + rotate: false + xy: 1815, 91 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tainted-water-xlarge + rotate: false + xy: 681, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tar-large + rotate: false + xy: 1027, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tar-medium + rotate: false + xy: 1071, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tar-small + rotate: false + xy: 1907, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tar-tiny + rotate: false + xy: 1779, 37 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tar-xlarge + rotate: false + xy: 731, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tau-mech-pad-large + rotate: false + xy: 1069, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tau-mech-pad-medium + rotate: false + xy: 1105, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tau-mech-pad-small + rotate: false + xy: 1933, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tau-mech-pad-tiny + rotate: false + xy: 1797, 55 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tau-mech-pad-xlarge + rotate: false + xy: 731, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tendrils-large + rotate: false + xy: 1111, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tendrils-medium + rotate: false + xy: 1139, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tendrils-small + rotate: false + xy: 1959, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tendrils-tiny + rotate: false + xy: 1815, 73 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tendrils-xlarge + rotate: false + xy: 781, 628 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-generator-large + rotate: false + xy: 1153, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-generator-medium + rotate: false + xy: 1173, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-generator-small + rotate: false + xy: 1985, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-generator-tiny + rotate: false + xy: 1833, 91 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-generator-xlarge + rotate: false + xy: 831, 628 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-pump-large + rotate: false + xy: 1195, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-pump-medium + rotate: false + xy: 901, 45 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-pump-small + rotate: false + xy: 2011, 405 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-pump-tiny + rotate: false + xy: 1797, 37 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-pump-xlarge + rotate: false + xy: 781, 578 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-reactor-large + rotate: false + xy: 1237, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-reactor-medium + rotate: false + xy: 935, 79 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-reactor-small + rotate: false + xy: 1714, 155 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-reactor-tiny + rotate: false + xy: 1815, 55 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-reactor-xlarge + rotate: false + xy: 831, 578 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-large + rotate: false + xy: 1279, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-large + rotate: false + xy: 1321, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 969, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-large-small + rotate: false + xy: 1711, 129 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-large-tiny + rotate: false + xy: 1833, 73 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-large-xlarge + rotate: false + xy: 351, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-medium + rotate: false + xy: 1003, 147 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-small + rotate: false + xy: 1711, 103 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-tiny + rotate: false + xy: 1815, 37 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-xlarge + rotate: false + xy: 351, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thruster-large + rotate: false + xy: 1363, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thruster-medium + rotate: false + xy: 1037, 181 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thruster-small + rotate: false + xy: 1737, 129 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thruster-tiny + rotate: false + xy: 1833, 55 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thruster-xlarge + rotate: false + xy: 401, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titan-factory-large + rotate: false + xy: 1405, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titan-factory-medium + rotate: false + xy: 1071, 215 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titan-factory-small + rotate: false + xy: 1737, 103 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titan-factory-tiny + rotate: false + xy: 1833, 37 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titan-factory-xlarge + rotate: false + xy: 351, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-conveyor-large + rotate: false + xy: 1447, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-conveyor-medium + rotate: false + xy: 1105, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-small + rotate: false + xy: 1727, 77 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-conveyor-tiny + rotate: false + xy: 1781, 19 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-conveyor-xlarge + rotate: false + xy: 401, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-large + rotate: false + xy: 1489, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-large + rotate: false + xy: 1531, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 1139, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-large-small + rotate: false + xy: 1727, 51 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-large-tiny + rotate: false + xy: 1781, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-large-xlarge + rotate: false + xy: 451, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-medium + rotate: false + xy: 1173, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-small + rotate: false + xy: 1727, 25 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-tiny + rotate: false + xy: 1799, 19 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-xlarge + rotate: false + xy: 351, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-trident-ship-pad-large + rotate: false + xy: 1573, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-trident-ship-pad-medium + rotate: false + xy: 935, 45 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-trident-ship-pad-small + rotate: false + xy: 1753, 77 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-trident-ship-pad-tiny + rotate: false + xy: 1799, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-trident-ship-pad-xlarge + rotate: false + xy: 401, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-turbine-generator-large + rotate: false + xy: 1615, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-turbine-generator-medium + rotate: false + xy: 969, 79 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-turbine-generator-small + rotate: false + xy: 1753, 51 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-turbine-generator-tiny + rotate: false + xy: 1817, 19 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-turbine-generator-xlarge + rotate: false + xy: 451, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-unloader-large + rotate: false + xy: 1657, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-unloader-medium + rotate: false + xy: 1003, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-unloader-small + rotate: false + xy: 1753, 25 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-unloader-tiny + rotate: false + xy: 1817, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-unloader-xlarge + rotate: false + xy: 501, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-vault-large + rotate: false + xy: 1699, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-vault-medium + rotate: false + xy: 1037, 147 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-small + rotate: false + xy: 1657, 395 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-vault-tiny + rotate: false + xy: 1835, 19 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-vault-xlarge + rotate: false + xy: 351, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-extractor-large + rotate: false + xy: 1741, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-extractor-medium + rotate: false + xy: 1071, 181 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-small + rotate: false + xy: 1657, 369 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-extractor-tiny + rotate: false + xy: 1835, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-extractor-xlarge rotate: false xy: 401, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wave-large +block-water-large rotate: false - xy: 1909, 681 + xy: 1783, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-wave-medium +block-water-medium rotate: false - xy: 1003, 142 + xy: 1105, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-wave-small +block-water-small rotate: false - xy: 1559, 262 + xy: 1683, 379 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-wave-tiny +block-water-tiny rotate: false - xy: 1891, 255 + xy: 1876, 332 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-wave-xlarge +block-water-xlarge rotate: false xy: 451, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-dead-large +block-wave-large rotate: false - xy: 881, 639 + xy: 1825, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-dead-medium +block-wave-medium rotate: false - xy: 1037, 176 + xy: 1139, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-dead-small +block-wave-small rotate: false - xy: 1731, 240 + xy: 1709, 379 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-dead-tiny +block-wave-tiny rotate: false - xy: 1909, 273 + xy: 1894, 332 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-dead-xlarge +block-wave-xlarge rotate: false xy: 501, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-large +block-white-tree-dead-large rotate: false - xy: 881, 597 + xy: 1867, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-medium +block-white-tree-dead-medium rotate: false - xy: 1071, 210 + xy: 1173, 283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-small +block-white-tree-dead-small rotate: false - xy: 1757, 240 + xy: 1735, 379 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-tiny +block-white-tree-dead-tiny rotate: false - xy: 1819, 165 + xy: 1912, 332 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-xlarge +block-white-tree-dead-xlarge rotate: false xy: 551, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wraith-factory-large +block-white-tree-large rotate: false - xy: 923, 639 + xy: 1909, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-wraith-factory-medium +block-white-tree-medium rotate: false - xy: 1105, 244 + xy: 969, 45 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-wraith-factory-small +block-white-tree-small rotate: false - xy: 1577, 236 + xy: 1761, 379 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-wraith-factory-tiny +block-white-tree-tiny rotate: false - xy: 1837, 183 + xy: 1930, 333 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-wraith-factory-xlarge +block-white-tree-xlarge rotate: false xy: 351, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +block-wraith-factory-large + rotate: false + xy: 1951, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wraith-factory-medium + rotate: false + xy: 1003, 79 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wraith-factory-small + rotate: false + xy: 1787, 379 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wraith-factory-tiny + rotate: false + xy: 1948, 333 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wraith-factory-xlarge + rotate: false + xy: 401, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 button rotate: false - xy: 1535, 652 + xy: 1071, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16210,7 +16266,7 @@ button index: -1 button-disabled rotate: false - xy: 965, 652 + xy: 859, 686 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16218,7 +16274,7 @@ button-disabled index: -1 button-down rotate: false - xy: 923, 610 + xy: 1993, 694 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16226,7 +16282,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 1003, 652 + xy: 897, 686 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16234,7 +16290,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 1041, 652 + xy: 821, 946 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16242,7 +16298,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 1079, 652 + xy: 881, 657 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16250,7 +16306,7 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 1117, 652 + xy: 881, 628 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16258,7 +16314,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 1155, 652 + xy: 881, 599 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16266,7 +16322,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 1193, 652 + xy: 1993, 665 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16274,7 +16330,7 @@ button-over index: -1 button-red rotate: false - xy: 1231, 652 + xy: 919, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16282,7 +16338,7 @@ button-red index: -1 button-right rotate: false - xy: 1345, 652 + xy: 957, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16290,7 +16346,7 @@ button-right index: -1 button-right-down rotate: false - xy: 1269, 652 + xy: 919, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16298,7 +16354,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 1307, 652 + xy: 957, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16306,7 +16362,7 @@ button-right-over index: -1 button-select rotate: false - xy: 1577, 210 + xy: 1813, 379 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -16314,7 +16370,7 @@ button-select index: -1 button-square rotate: false - xy: 1459, 652 + xy: 1033, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16322,7 +16378,7 @@ button-square index: -1 button-square-down rotate: false - xy: 1383, 652 + xy: 995, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16330,7 +16386,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 1421, 652 + xy: 995, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16338,7 +16394,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 1497, 652 + xy: 1033, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16346,42 +16402,42 @@ button-trans index: -1 check-disabled rotate: false - xy: 1139, 278 + xy: 1037, 113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1173, 312 + xy: 1071, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1207, 346 + xy: 1105, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1241, 380 + xy: 1139, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1275, 414 + xy: 1173, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1309, 448 + xy: 1003, 45 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -16395,7 +16451,7 @@ clear index: -1 cursor rotate: false - xy: 1979, 893 + xy: 2001, 969 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -16409,7 +16465,7 @@ discord-banner index: -1 flat-down-base rotate: false - xy: 1573, 652 + xy: 1071, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16417,3164 +16473,3192 @@ flat-down-base index: -1 icon-about rotate: false - xy: 401, 366 + xy: 451, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-about-small rotate: false - xy: 1343, 482 + xy: 1037, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-about-smaller rotate: false - xy: 1615, 484 + xy: 1411, 343 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-about-tiny rotate: false - xy: 1855, 201 + xy: 1966, 333 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-add rotate: false - xy: 451, 416 + xy: 501, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-add-small rotate: false - xy: 1377, 516 + xy: 1071, 113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-add-smaller rotate: false - xy: 1649, 518 + xy: 1445, 377 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-add-tiny rotate: false - xy: 1873, 219 + xy: 1984, 333 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-admin rotate: false - xy: 501, 466 + xy: 551, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-admin-badge rotate: false - xy: 551, 516 + xy: 601, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-admin-badge-small rotate: false - xy: 1411, 550 + xy: 1105, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-admin-badge-smaller rotate: false - xy: 1683, 552 + xy: 1479, 411 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-admin-badge-tiny rotate: false - xy: 1891, 237 + xy: 2002, 333 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-admin-small rotate: false - xy: 1003, 108 + xy: 1139, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-admin-smaller rotate: false - xy: 1275, 110 + xy: 1513, 445 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-admin-tiny rotate: false - xy: 1909, 255 + xy: 2020, 333 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow rotate: false - xy: 601, 566 + xy: 351, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-16 rotate: false - xy: 601, 566 + xy: 351, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-16-small rotate: false - xy: 1037, 142 + xy: 1173, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-small rotate: false - xy: 1037, 142 + xy: 1173, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-16-smaller rotate: false - xy: 1309, 144 + xy: 1547, 479 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-smaller rotate: false - xy: 1309, 144 + xy: 1547, 479 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-16-tiny rotate: false - xy: 1819, 147 + xy: 1881, 314 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-tiny rotate: false - xy: 1819, 147 + xy: 1881, 314 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-down rotate: false - xy: 351, 266 + xy: 401, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-down-small rotate: false - xy: 1071, 176 + xy: 1037, 45 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-down-smaller rotate: false - xy: 1343, 178 + xy: 1581, 513 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-down-tiny rotate: false - xy: 1837, 165 + xy: 1881, 296 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-left rotate: false - xy: 401, 316 + xy: 451, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-left-small rotate: false - xy: 1105, 210 + xy: 1071, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-left-smaller rotate: false - xy: 1377, 212 + xy: 1615, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-left-tiny rotate: false - xy: 1855, 183 + xy: 1899, 314 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-right rotate: false - xy: 451, 366 + xy: 501, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-right-small rotate: false - xy: 1139, 244 + xy: 1105, 113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-right-smaller rotate: false - xy: 1411, 246 + xy: 1207, 105 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-right-tiny rotate: false - xy: 1873, 201 + xy: 1881, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-up rotate: false - xy: 501, 416 + xy: 551, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-up-small rotate: false - xy: 1173, 278 + xy: 1139, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-up-smaller rotate: false - xy: 1445, 280 + xy: 1241, 139 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-up-tiny rotate: false - xy: 1891, 219 + xy: 1899, 296 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-back rotate: false - xy: 551, 466 + xy: 601, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-back-small rotate: false - xy: 1207, 312 + xy: 1173, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-back-smaller rotate: false - xy: 1479, 314 + xy: 1275, 173 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-back-tiny rotate: false - xy: 1909, 237 + xy: 1899, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-ban rotate: false - xy: 601, 516 + xy: 651, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-ban-small rotate: false - xy: 1241, 346 + xy: 1071, 45 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-ban-smaller rotate: false - xy: 1513, 348 + xy: 1309, 207 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-ban-tiny rotate: false - xy: 1819, 129 + xy: 1917, 314 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-break rotate: false - xy: 651, 566 + xy: 351, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-break-small rotate: false - xy: 1275, 380 + xy: 1105, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-break-smaller rotate: false - xy: 1547, 382 + xy: 1343, 241 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-break-tiny rotate: false - xy: 1837, 147 + xy: 1917, 296 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cancel rotate: false - xy: 351, 216 + xy: 401, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-cancel-small rotate: false - xy: 1309, 414 + xy: 1139, 113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-cancel-smaller rotate: false - xy: 1581, 416 + xy: 1377, 275 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-cancel-tiny rotate: false - xy: 1855, 165 + xy: 1917, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-quit-tiny rotate: false - xy: 1855, 165 + xy: 1917, 278 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-changelog rotate: false - xy: 401, 266 + xy: 451, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-changelog-small rotate: false - xy: 1343, 448 + xy: 1173, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-changelog-smaller rotate: false - xy: 1615, 452 + xy: 1411, 311 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-changelog-tiny rotate: false - xy: 1873, 183 + xy: 1935, 315 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-chat rotate: false - xy: 451, 316 + xy: 501, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-chat-small rotate: false - xy: 1377, 482 + xy: 1105, 45 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-chat-smaller rotate: false - xy: 1715, 552 + xy: 1647, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-chat-tiny rotate: false - xy: 1891, 201 + xy: 1935, 297 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-check rotate: false - xy: 501, 366 + xy: 551, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-check-small rotate: false - xy: 1411, 516 + xy: 1139, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-check-smaller rotate: false - xy: 1747, 552 + xy: 1207, 73 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-check-tiny rotate: false - xy: 1909, 219 + xy: 1953, 315 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-attack rotate: false - xy: 551, 416 + xy: 601, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-attack-small rotate: false - xy: 1445, 550 + xy: 1173, 113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-attack-smaller rotate: false - xy: 1779, 552 + xy: 1679, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-attack-tiny rotate: false - xy: 1819, 111 + xy: 1935, 279 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-patrol rotate: false - xy: 601, 466 + xy: 651, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-patrol-small rotate: false - xy: 1037, 108 + xy: 1139, 45 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-patrol-smaller rotate: false - xy: 1941, 649 + xy: 1207, 41 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-patrol-tiny rotate: false - xy: 1837, 129 + xy: 1953, 297 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-rally rotate: false - xy: 651, 516 + xy: 701, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-rally-small rotate: false - xy: 1071, 142 + xy: 1173, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-rally-smaller rotate: false - xy: 935, 68 + xy: 1711, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-rally-tiny rotate: false - xy: 1855, 147 + xy: 1971, 315 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-retreat rotate: false - xy: 701, 566 + xy: 351, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-retreat-small rotate: false - xy: 1105, 176 + xy: 1173, 45 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-retreat-smaller rotate: false - xy: 935, 36 + xy: 1743, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-retreat-tiny rotate: false - xy: 1873, 165 + xy: 1953, 279 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-copy rotate: false - xy: 351, 166 + xy: 401, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-copy-small rotate: false - xy: 1139, 210 + xy: 901, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-copy-smaller rotate: false - xy: 967, 68 + xy: 1775, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-copy-tiny rotate: false - xy: 1891, 183 + xy: 1971, 297 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-crafting rotate: false - xy: 401, 216 + xy: 451, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-crafting-small rotate: false - xy: 1173, 244 + xy: 935, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-crafting-smaller rotate: false - xy: 967, 36 + xy: 1807, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-crafting-tiny rotate: false - xy: 1909, 201 + xy: 1989, 315 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cursor rotate: false - xy: 451, 266 + xy: 501, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-cursor-small rotate: false - xy: 1207, 278 + xy: 969, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-cursor-smaller rotate: false - xy: 851, 4 + xy: 1839, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-cursor-tiny rotate: false - xy: 1837, 111 + xy: 1971, 279 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-database rotate: false - xy: 501, 316 + xy: 551, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-database-small rotate: false - xy: 1241, 312 + xy: 1003, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-database-smaller rotate: false - xy: 883, 4 + xy: 1871, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-database-tiny rotate: false - xy: 1855, 129 + xy: 1989, 297 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-defense rotate: false - xy: 551, 366 + xy: 601, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-defense-small rotate: false - xy: 1275, 346 + xy: 1037, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-defense-smaller rotate: false - xy: 915, 4 + xy: 1903, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-defense-tiny rotate: false - xy: 1873, 147 + xy: 2007, 315 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-dev-builds rotate: false - xy: 601, 416 + xy: 651, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-dev-builds-small rotate: false - xy: 1309, 380 + xy: 1071, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-dev-builds-smaller rotate: false - xy: 947, 4 + xy: 1935, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-dev-builds-tiny rotate: false - xy: 1891, 165 + xy: 1989, 279 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-diagonal rotate: false - xy: 651, 466 + xy: 701, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-diagonal-small rotate: false - xy: 1343, 414 + xy: 1105, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-diagonal-smaller rotate: false - xy: 979, 4 + xy: 1207, 9 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-diagonal-tiny rotate: false - xy: 1909, 183 + xy: 2007, 297 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-discord rotate: false - xy: 701, 516 + xy: 351, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-discord-small rotate: false - xy: 1377, 448 + xy: 1139, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-discord-smaller rotate: false - xy: 1985, 663 + xy: 1967, 547 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-discord-tiny rotate: false - xy: 1855, 111 + xy: 2007, 279 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-distribution rotate: false - xy: 351, 116 + xy: 401, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-distribution-small rotate: false - xy: 1411, 482 + xy: 1173, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-distribution-smaller rotate: false - xy: 2017, 663 + xy: 1411, 279 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-distribution-tiny rotate: false - xy: 1873, 129 + xy: 2025, 315 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-donate rotate: false - xy: 401, 166 + xy: 451, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-donate-small rotate: false - xy: 1445, 516 + xy: 1207, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-donate-smaller rotate: false - xy: 1807, 586 + xy: 1443, 343 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-donate-tiny rotate: false - xy: 1891, 147 + xy: 2025, 297 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-dots rotate: false - xy: 451, 216 + xy: 501, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-dots-small rotate: false - xy: 1479, 550 + xy: 1207, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-dots-smaller rotate: false - xy: 1811, 554 + xy: 1443, 311 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-dots-tiny rotate: false - xy: 1909, 165 + xy: 2025, 279 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-editor rotate: false - xy: 501, 266 + xy: 551, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-editor-small rotate: false - xy: 1071, 108 + xy: 1241, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-editor-smaller rotate: false - xy: 1003, 76 + xy: 1443, 279 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-editor-tiny rotate: false - xy: 1873, 111 + xy: 1881, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-effect rotate: false - xy: 551, 316 + xy: 601, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-effect-small rotate: false - xy: 1105, 142 + xy: 1207, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-effect-smaller rotate: false - xy: 1035, 76 + xy: 1477, 377 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-effect-tiny rotate: false - xy: 1891, 129 + xy: 1899, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-elevation rotate: false - xy: 601, 366 + xy: 651, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-elevation-small rotate: false - xy: 1139, 176 + xy: 1241, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-elevation-smaller rotate: false - xy: 1067, 76 + xy: 1475, 345 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-elevation-tiny rotate: false - xy: 1909, 147 + xy: 1917, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-eraser rotate: false - xy: 651, 416 + xy: 701, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-eraser-small rotate: false - xy: 1173, 210 + xy: 1275, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-eraser-smaller rotate: false - xy: 1099, 76 + xy: 1475, 313 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-eraser-tiny rotate: false - xy: 1891, 111 + xy: 1935, 261 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-exit rotate: false - xy: 701, 466 + xy: 351, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-exit-small rotate: false - xy: 1207, 244 + xy: 1207, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-exit-smaller rotate: false - xy: 1131, 76 + xy: 1475, 281 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-exit-tiny rotate: false - xy: 1909, 129 + xy: 1953, 261 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-f-droid rotate: false - xy: 351, 66 + xy: 401, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-f-droid-small rotate: false - xy: 1241, 278 + xy: 1241, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-f-droid-smaller rotate: false - xy: 1163, 76 + xy: 1511, 411 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-f-droid-tiny rotate: false - xy: 1909, 111 + xy: 1971, 261 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-fdroid rotate: false - xy: 401, 116 + xy: 451, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-fdroid-small rotate: false - xy: 1275, 312 + xy: 1275, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-fdroid-smaller rotate: false - xy: 1195, 76 + xy: 1509, 379 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-fdroid-tiny rotate: false - xy: 1819, 93 + xy: 1989, 261 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-file - rotate: false - xy: 451, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-image +icon-feathub rotate: false xy: 501, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-file-image-small +icon-feathub-small rotate: false - xy: 1309, 346 + xy: 1309, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-file-image-smaller +icon-feathub-smaller rotate: false - xy: 1227, 76 + xy: 1545, 445 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-file-image-tiny +icon-feathub-tiny rotate: false - xy: 1837, 93 + xy: 2007, 261 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-file-small - rotate: false - xy: 1343, 380 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-smaller - rotate: false - xy: 999, 44 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-text +icon-file rotate: false xy: 551, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-file-text-small - rotate: false - xy: 1377, 414 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-text-smaller - rotate: false - xy: 1031, 44 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-text-tiny - rotate: false - xy: 1855, 93 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-tiny - rotate: false - xy: 1873, 93 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-fill +icon-file-image rotate: false xy: 601, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-fill-small +icon-file-image-small rotate: false - xy: 1411, 448 + xy: 1207, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-fill-smaller +icon-file-image-smaller rotate: false - xy: 1063, 44 + xy: 1543, 413 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-fill-tiny +icon-file-image-tiny rotate: false - xy: 1891, 93 + xy: 2025, 261 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-flip +icon-file-small + rotate: false + xy: 1241, 443 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-file-smaller + rotate: false + xy: 1579, 479 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-file-text rotate: false xy: 651, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-flip-small +icon-file-text-small rotate: false - xy: 1445, 482 + xy: 1275, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-flip-smaller +icon-file-text-smaller rotate: false - xy: 1095, 44 + xy: 1577, 447 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-flip-tiny +icon-file-text-tiny rotate: false - xy: 1909, 93 + xy: 1842, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-floppy +icon-file-tiny + rotate: false + xy: 1842, 235 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-fill rotate: false xy: 701, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-floppy-16 +icon-fill-small + rotate: false + xy: 1309, 511 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-fill-smaller + rotate: false + xy: 1613, 513 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-fill-tiny + rotate: false + xy: 1842, 217 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-flip rotate: false xy: 401, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-floppy-16-small +icon-flip-small rotate: false - xy: 1479, 516 + xy: 1343, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-floppy-16-smaller +icon-flip-smaller rotate: false - xy: 1127, 44 + xy: 1611, 481 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-floppy-16-tiny +icon-flip-tiny rotate: false - xy: 1927, 305 + xy: 1842, 199 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-floppy-small - rotate: false - xy: 1513, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-smaller - rotate: false - xy: 1159, 44 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-tiny - rotate: false - xy: 1927, 287 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder +icon-floppy rotate: false xy: 451, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-folder-parent +icon-floppy-16 rotate: false xy: 501, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-folder-parent-small +icon-floppy-16-small rotate: false - xy: 1105, 108 + xy: 1207, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-folder-parent-smaller +icon-floppy-16-smaller rotate: false - xy: 1191, 44 + xy: 1645, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-folder-parent-tiny +icon-floppy-16-tiny rotate: false - xy: 1927, 269 + xy: 1842, 181 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-folder-small +icon-floppy-small rotate: false - xy: 1139, 142 + xy: 1241, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-folder-smaller +icon-floppy-smaller rotate: false - xy: 1223, 44 + xy: 1677, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-folder-tiny +icon-floppy-tiny rotate: false - xy: 1927, 251 + xy: 1848, 163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-github +icon-folder rotate: false xy: 551, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-github-small - rotate: false - xy: 1173, 176 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-github-smaller - rotate: false - xy: 1011, 12 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-github-tiny - rotate: false - xy: 1927, 233 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-google-play +icon-folder-parent rotate: false xy: 601, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-google-play-small +icon-folder-parent-small rotate: false - xy: 1207, 210 + xy: 1275, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-google-play-smaller +icon-folder-parent-smaller rotate: false - xy: 1043, 12 + xy: 1709, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-google-play-tiny +icon-folder-parent-tiny rotate: false - xy: 1927, 215 + xy: 1860, 255 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-grid +icon-folder-small + rotate: false + xy: 1309, 477 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-folder-smaller + rotate: false + xy: 1741, 515 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-folder-tiny + rotate: false + xy: 1860, 237 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-github rotate: false xy: 651, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-grid-small +icon-github-small rotate: false - xy: 1241, 244 + xy: 1343, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-grid-smaller +icon-github-smaller rotate: false - xy: 1075, 12 + xy: 1773, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-grid-tiny +icon-github-tiny rotate: false - xy: 1927, 197 + xy: 1860, 219 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-home +icon-google-play rotate: false xy: 701, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-home-small +icon-google-play-small rotate: false - xy: 1275, 278 + xy: 1377, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-home-smaller +icon-google-play-smaller rotate: false - xy: 1107, 12 + xy: 1805, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-home-tiny +icon-google-play-tiny rotate: false - xy: 1927, 179 + xy: 1860, 201 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-host +icon-grid rotate: false xy: 451, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-host-small +icon-grid-small rotate: false - xy: 1309, 312 + xy: 1207, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-host-smaller +icon-grid-smaller rotate: false - xy: 1139, 12 + xy: 1837, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-host-tiny +icon-grid-tiny rotate: false - xy: 1927, 161 + xy: 1860, 183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-info +icon-home rotate: false xy: 501, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-info-small +icon-home-small rotate: false - xy: 1343, 346 + xy: 1241, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-info-smaller +icon-home-smaller rotate: false - xy: 1171, 12 + xy: 1869, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-info-tiny +icon-home-tiny rotate: false - xy: 1927, 143 + xy: 1878, 242 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-itch.io +icon-host rotate: false xy: 551, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-itch.io-small +icon-host-small rotate: false - xy: 1377, 380 + xy: 1275, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-itch.io-smaller +icon-host-smaller rotate: false - xy: 1203, 12 + xy: 1901, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-itch.io-tiny +icon-host-tiny rotate: false - xy: 1927, 125 + xy: 1878, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-item +icon-info rotate: false xy: 601, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-item-small +icon-info-small rotate: false - xy: 1411, 414 + xy: 1309, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-item-smaller +icon-info-smaller rotate: false - xy: 1235, 12 + xy: 1933, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-item-tiny +icon-info-tiny rotate: false - xy: 1927, 107 + xy: 1896, 242 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-line +icon-itch.io rotate: false xy: 651, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-line-small +icon-itch.io-small rotate: false - xy: 1445, 448 + xy: 1343, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-line-smaller +icon-itch.io-smaller rotate: false - xy: 1259, 76 + xy: 1965, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-line-tiny +icon-itch.io-tiny rotate: false - xy: 1927, 89 + xy: 1878, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-link +icon-item rotate: false xy: 701, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-link-small +icon-item-small rotate: false - xy: 1479, 482 + xy: 1377, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-link-smaller +icon-item-smaller rotate: false - xy: 1255, 44 + xy: 1239, 105 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-link-tiny +icon-item-tiny rotate: false - xy: 1603, 92 + xy: 1896, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-liquid +icon-line rotate: false xy: 501, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-liquid-consume +icon-line-small + rotate: false + xy: 1411, 545 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-line-smaller + rotate: false + xy: 1239, 73 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-line-tiny + rotate: false + xy: 1914, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-link rotate: false xy: 551, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-liquid-consume-small +icon-link-small rotate: false - xy: 1513, 516 + xy: 1207, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-liquid-consume-smaller +icon-link-smaller rotate: false - xy: 1267, 12 + xy: 1239, 41 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-liquid-consume-tiny +icon-link-tiny rotate: false - xy: 1591, 74 + xy: 1878, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-liquid-small - rotate: false - xy: 1547, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-liquid-smaller - rotate: false - xy: 1287, 44 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-liquid-tiny - rotate: false - xy: 1609, 74 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load +icon-liquid rotate: false xy: 601, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-load-image +icon-liquid-consume rotate: false xy: 651, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-load-image-small +icon-liquid-consume-small rotate: false - xy: 1139, 108 + xy: 1241, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-load-image-smaller +icon-liquid-consume-smaller rotate: false - xy: 1299, 12 + xy: 1239, 9 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-load-image-tiny +icon-liquid-consume-tiny rotate: false - xy: 1603, 56 + xy: 1896, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-load-map +icon-liquid-small + rotate: false + xy: 1275, 375 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-liquid-smaller + rotate: false + xy: 1273, 139 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-liquid-tiny + rotate: false + xy: 1914, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-load rotate: false xy: 701, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-load-map-small - rotate: false - xy: 1173, 142 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-map-smaller - rotate: false - xy: 1291, 78 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-map-tiny - rotate: false - xy: 1603, 38 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load-small - rotate: false - xy: 1207, 176 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-smaller - rotate: false - xy: 1307, 110 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-tiny - rotate: false - xy: 1603, 20 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-loading +icon-load-image rotate: false xy: 551, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-loading-small +icon-load-image-small rotate: false - xy: 1241, 210 + xy: 1309, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-loading-smaller +icon-load-image-smaller rotate: false - xy: 1323, 78 + xy: 1271, 107 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-loading-tiny +icon-load-image-tiny rotate: false - xy: 1945, 305 + xy: 1896, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-locked +icon-load-map rotate: false xy: 601, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-locked-small +icon-load-map-small rotate: false - xy: 1275, 244 + xy: 1343, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-locked-smaller +icon-load-map-smaller rotate: false - xy: 1319, 46 + xy: 1271, 75 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-locked-tiny +icon-load-map-tiny rotate: false - xy: 1945, 287 + xy: 1914, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-map +icon-load-small + rotate: false + xy: 1377, 477 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-load-smaller + rotate: false + xy: 1271, 43 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-load-tiny + rotate: false + xy: 1914, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-loading rotate: false xy: 651, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-map-small +icon-loading-small rotate: false - xy: 1309, 278 + xy: 1411, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-map-smaller +icon-loading-smaller rotate: false - xy: 1331, 14 + xy: 1271, 11 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-map-tiny +icon-loading-tiny rotate: false - xy: 1945, 269 + xy: 1853, 145 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-menu +icon-locked rotate: false xy: 701, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-menu-large +icon-locked-small + rotate: false + xy: 1445, 545 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-locked-smaller + rotate: false + xy: 1307, 173 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-locked-tiny + rotate: false + xy: 1853, 127 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-map rotate: false xy: 601, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-menu-large-small +icon-map-small rotate: false - xy: 1343, 312 + xy: 1207, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-menu-large-smaller +icon-map-smaller rotate: false - xy: 1351, 46 + xy: 1305, 141 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-menu-large-tiny +icon-map-tiny rotate: false - xy: 1945, 251 + xy: 1853, 109 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-menu-small - rotate: false - xy: 1377, 346 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu-smaller - rotate: false - xy: 1363, 14 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-tiny - rotate: false - xy: 1945, 233 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-missing +icon-menu rotate: false xy: 651, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-missing-small - rotate: false - xy: 1411, 380 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-missing-smaller - rotate: false - xy: 1615, 420 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-missing-tiny - rotate: false - xy: 1945, 215 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-attack +icon-menu-large rotate: false xy: 701, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-mode-attack-small +icon-menu-large-small rotate: false - xy: 1445, 414 + xy: 1241, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-mode-attack-smaller +icon-menu-large-smaller rotate: false - xy: 1839, 615 + xy: 1341, 207 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-mode-attack-tiny +icon-menu-large-tiny rotate: false - xy: 1945, 197 + xy: 1851, 91 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-mode-pvp +icon-menu-small + rotate: false + xy: 1275, 341 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-menu-smaller + rotate: false + xy: 1339, 175 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-menu-tiny + rotate: false + xy: 1851, 73 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-missing rotate: false xy: 651, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-mode-pvp-small +icon-missing-small rotate: false - xy: 1479, 448 + xy: 1309, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-mode-pvp-smaller +icon-missing-smaller rotate: false - xy: 1871, 615 + xy: 1375, 241 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-mode-pvp-tiny +icon-missing-tiny rotate: false - xy: 1945, 179 + xy: 1851, 55 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-mode-survival +icon-mode-attack rotate: false xy: 701, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-mode-survival-small +icon-mode-attack-small rotate: false - xy: 1513, 482 + xy: 1343, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-mode-survival-smaller +icon-mode-attack-smaller rotate: false - xy: 1903, 615 + xy: 1373, 209 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-mode-survival-tiny +icon-mode-attack-tiny rotate: false - xy: 1945, 161 + xy: 1851, 37 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-none +icon-mode-pvp rotate: false xy: 701, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-none-small +icon-mode-pvp-small rotate: false - xy: 1547, 516 + xy: 1377, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-none-smaller +icon-mode-pvp-smaller rotate: false - xy: 1935, 615 + xy: 1409, 247 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-none-tiny +icon-mode-pvp-tiny rotate: false - xy: 1945, 143 + xy: 1853, 19 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-paste +icon-mode-survival rotate: false xy: 351, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-paste-small +icon-mode-survival-small rotate: false - xy: 1581, 550 + xy: 1411, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-paste-smaller +icon-mode-survival-smaller rotate: false - xy: 1967, 617 + xy: 1441, 247 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-paste-tiny +icon-mode-survival-tiny rotate: false - xy: 1945, 125 + xy: 1853, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-pause +icon-none rotate: false xy: 401, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-pause-small +icon-none-small rotate: false - xy: 1173, 108 + xy: 1445, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-pause-smaller +icon-none-smaller rotate: false - xy: 1999, 631 + xy: 1407, 215 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-pause-tiny +icon-none-tiny rotate: false - xy: 1945, 107 + xy: 1866, 165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-pencil +icon-paste rotate: false xy: 451, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-pencil-small +icon-paste-small rotate: false - xy: 1207, 142 + xy: 1479, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-pencil-smaller +icon-paste-smaller rotate: false - xy: 1999, 599 + xy: 1439, 215 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-pencil-tiny +icon-paste-tiny rotate: false - xy: 1945, 89 + xy: 1884, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-pick +icon-pause rotate: false xy: 501, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-pick-small +icon-pause-small rotate: false - xy: 1241, 176 + xy: 1207, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-pick-smaller +icon-pause-smaller rotate: false - xy: 1967, 585 + xy: 1405, 183 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-pick-tiny +icon-pause-tiny rotate: false - xy: 1953, 323 + xy: 1902, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-play +icon-pencil rotate: false xy: 551, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-play-2 +icon-pencil-small + rotate: false + xy: 1241, 273 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-pencil-smaller + rotate: false + xy: 1437, 183 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-pencil-tiny + rotate: false + xy: 1920, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pick rotate: false xy: 601, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-play-2-small +icon-pick-small rotate: false - xy: 1275, 210 + xy: 1275, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-play-2-smaller +icon-pick-smaller rotate: false - xy: 1999, 567 + xy: 1373, 177 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-play-2-tiny +icon-pick-tiny rotate: false - xy: 1971, 323 + xy: 1871, 147 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-play-tiny - rotate: false - xy: 1971, 323 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-custom +icon-play rotate: false xy: 651, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-play-custom-small - rotate: false - xy: 1309, 244 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-custom-smaller - rotate: false - xy: 1843, 583 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-play-custom-tiny - rotate: false - xy: 1963, 305 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-small - rotate: false - xy: 1343, 278 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-smaller - rotate: false - xy: 1875, 583 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-players +icon-play-2 rotate: false xy: 701, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-players-small +icon-play-2-small rotate: false - xy: 1377, 312 + xy: 1309, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-players-smaller +icon-play-2-smaller rotate: false - xy: 1907, 583 + xy: 1405, 151 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-players-tiny +icon-play-2-tiny rotate: false - xy: 1989, 323 + xy: 1871, 129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-power +icon-play-tiny + rotate: false + xy: 1871, 129 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play-custom rotate: false xy: 751, 528 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-power-small +icon-play-custom-small rotate: false - xy: 1411, 346 + xy: 1343, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-power-smaller +icon-play-custom-smaller rotate: false - xy: 1843, 551 + xy: 1437, 151 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-power-tiny +icon-play-custom-tiny rotate: false - xy: 1963, 287 + xy: 1871, 111 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-production +icon-play-small + rotate: false + xy: 1377, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-play-smaller + rotate: false + xy: 1507, 345 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-players rotate: false xy: 751, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-production-small +icon-players-small rotate: false - xy: 1445, 380 + xy: 1411, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-production-smaller +icon-players-smaller rotate: false - xy: 1875, 551 + xy: 1507, 313 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-production-tiny +icon-players-tiny rotate: false - xy: 1981, 305 + xy: 1889, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-quit +icon-power rotate: false xy: 801, 528 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-quit-small +icon-power-small rotate: false - xy: 1479, 414 + xy: 1445, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-quit-smaller +icon-power-smaller rotate: false - xy: 1907, 551 + xy: 1507, 281 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-reddit +icon-power-tiny + rotate: false + xy: 1889, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-production rotate: false xy: 751, 428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-reddit-small +icon-production-small rotate: false - xy: 1513, 448 + xy: 1479, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-reddit-smaller +icon-production-smaller rotate: false - xy: 1811, 522 + xy: 1475, 249 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-reddit-tiny +icon-production-tiny rotate: false - xy: 2007, 323 + xy: 1907, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-redo +icon-quit rotate: false xy: 801, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-redo-small +icon-quit-small rotate: false - xy: 1547, 482 + xy: 1513, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-redo-smaller +icon-quit-smaller rotate: false - xy: 1843, 519 + xy: 1507, 249 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-redo-tiny - rotate: false - xy: 1963, 269 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-refresh +icon-reddit rotate: false xy: 751, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-refresh-small +icon-reddit-small rotate: false - xy: 1581, 516 + xy: 1207, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-refresh-smaller +icon-reddit-smaller rotate: false - xy: 1875, 519 + xy: 1541, 379 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-refresh-tiny +icon-reddit-tiny rotate: false - xy: 1981, 287 + xy: 1889, 116 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-rename +icon-redo rotate: false xy: 801, 428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rename-small +icon-redo-small rotate: false - xy: 1615, 550 + xy: 1241, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rename-smaller +icon-redo-smaller rotate: false - xy: 1907, 519 + xy: 1539, 347 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rename-tiny +icon-redo-tiny rotate: false - xy: 1999, 305 + xy: 1907, 134 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-resize +icon-refresh rotate: false xy: 751, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-resize-small +icon-refresh-small rotate: false - xy: 1207, 108 + xy: 1275, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-resize-smaller +icon-refresh-smaller rotate: false - xy: 1939, 553 + xy: 1539, 315 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-resize-tiny +icon-refresh-tiny rotate: false - xy: 1963, 251 + xy: 1907, 116 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-rotate +icon-rename rotate: false xy: 801, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-arrow +icon-rename-small + rotate: false + xy: 1309, 307 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rename-smaller + rotate: false + xy: 1539, 283 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rename-tiny + rotate: false + xy: 1925, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-resize rotate: false xy: 751, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-arrow-small +icon-resize-small rotate: false - xy: 1241, 142 + xy: 1343, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rotate-arrow-smaller +icon-resize-smaller rotate: false - xy: 1939, 521 + xy: 1539, 251 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rotate-arrow-tiny +icon-resize-tiny rotate: false - xy: 1981, 269 + xy: 1925, 134 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-rotate-left +icon-rotate rotate: false xy: 801, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-left-small - rotate: false - xy: 1275, 176 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-left-smaller - rotate: false - xy: 1971, 535 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-left-tiny - rotate: false - xy: 1999, 287 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-right +icon-rotate-arrow rotate: false xy: 751, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-right-small +icon-rotate-arrow-small rotate: false - xy: 1309, 210 + xy: 1377, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rotate-right-smaller +icon-rotate-arrow-smaller rotate: false - xy: 2003, 535 + xy: 1575, 413 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rotate-right-tiny +icon-rotate-arrow-tiny rotate: false - xy: 1963, 233 + xy: 1925, 116 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-rotate-small - rotate: false - xy: 1343, 244 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-smaller - rotate: false - xy: 1971, 503 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-tiny - rotate: false - xy: 1981, 251 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save +icon-rotate-left rotate: false xy: 801, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-save-image +icon-rotate-left-small + rotate: false + xy: 1411, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-left-smaller + rotate: false + xy: 1573, 381 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-left-tiny + rotate: false + xy: 1889, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate-right rotate: false xy: 751, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-save-image-small +icon-rotate-right-small rotate: false - xy: 1377, 278 + xy: 1445, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-save-image-smaller +icon-rotate-right-smaller rotate: false - xy: 2003, 503 + xy: 1609, 447 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-save-image-tiny +icon-rotate-right-tiny rotate: false - xy: 1999, 269 + xy: 1907, 98 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-save-map +icon-rotate-small + rotate: false + xy: 1479, 477 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-smaller + rotate: false + xy: 1607, 415 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-tiny + rotate: false + xy: 1925, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save rotate: false xy: 801, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-save-map-small - rotate: false - xy: 1411, 312 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-map-smaller - rotate: false - xy: 1939, 489 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-map-tiny - rotate: false - xy: 1963, 215 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save-small - rotate: false - xy: 1445, 346 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-smaller - rotate: false - xy: 1971, 471 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-tiny - rotate: false - xy: 1981, 233 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-settings +icon-save-image rotate: false xy: 751, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-settings-small +icon-save-image-small rotate: false - xy: 1479, 380 + xy: 1513, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-settings-smaller +icon-save-image-smaller rotate: false - xy: 2003, 471 + xy: 1643, 481 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-settings-tiny +icon-save-image-tiny rotate: false - xy: 1999, 251 + xy: 1871, 93 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-spray +icon-save-map rotate: false xy: 801, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-spray-small +icon-save-map-small rotate: false - xy: 1513, 414 + xy: 1547, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-spray-smaller +icon-save-map-smaller rotate: false - xy: 1409, 212 + xy: 1641, 449 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-spray-tiny +icon-save-map-tiny rotate: false - xy: 1963, 197 + xy: 1869, 75 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-terrain +icon-save-small + rotate: false + xy: 1207, 171 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-smaller + rotate: false + xy: 1675, 483 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-tiny + rotate: false + xy: 1869, 57 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-settings rotate: false xy: 751, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-terrain-small +icon-settings-small rotate: false - xy: 1547, 448 + xy: 1241, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-terrain-smaller +icon-settings-smaller rotate: false - xy: 1443, 246 + xy: 1707, 483 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-terrain-tiny +icon-settings-tiny rotate: false - xy: 1981, 215 + xy: 1869, 39 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-tools +icon-spray rotate: false xy: 801, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-tools-small +icon-spray-small rotate: false - xy: 1581, 482 + xy: 1275, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-tools-smaller +icon-spray-smaller rotate: false - xy: 1441, 214 + xy: 1739, 483 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-tools-tiny +icon-spray-tiny rotate: false - xy: 1999, 233 + xy: 1871, 21 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-trash +icon-terrain rotate: false xy: 751, 28 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-trash-16 +icon-terrain-small + rotate: false + xy: 1309, 273 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-terrain-smaller + rotate: false + xy: 1771, 483 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-terrain-tiny + rotate: false + xy: 1871, 3 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tools rotate: false xy: 801, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-trash-16-small +icon-tools-small rotate: false - xy: 1615, 516 + xy: 1343, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-trash-16-smaller +icon-tools-smaller rotate: false - xy: 1477, 280 + xy: 1803, 483 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-trash-16-tiny +icon-tools-tiny rotate: false - xy: 1963, 179 + xy: 1889, 80 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-trash-small - rotate: false - xy: 1649, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trash-smaller - rotate: false - xy: 1475, 248 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trash-tiny - rotate: false - xy: 1981, 197 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tree +icon-trash rotate: false xy: 801, 28 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-tree-small - rotate: false - xy: 1241, 108 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tree-smaller - rotate: false - xy: 1511, 314 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tree-tiny - rotate: false - xy: 1999, 215 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trello +icon-trash-16 rotate: false xy: 851, 528 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-trello-small +icon-trash-16-small rotate: false - xy: 1275, 142 + xy: 1377, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-trello-smaller +icon-trash-16-smaller rotate: false - xy: 1509, 282 + xy: 1835, 483 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-trello-tiny +icon-trash-16-tiny rotate: false - xy: 1963, 161 + xy: 1907, 80 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-turret +icon-trash-small + rotate: false + xy: 1411, 375 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trash-smaller + rotate: false + xy: 1867, 483 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trash-tiny + rotate: false + xy: 1925, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tree rotate: false xy: 851, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-turret-small +icon-tree-small rotate: false - xy: 1309, 176 + xy: 1445, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-turret-smaller +icon-tree-smaller rotate: false - xy: 1545, 348 + xy: 1899, 483 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-turret-tiny +icon-tree-tiny rotate: false - xy: 1981, 179 + xy: 1887, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-tutorial +icon-trello rotate: false xy: 851, 428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-tutorial-small +icon-trello-small rotate: false - xy: 1343, 210 + xy: 1479, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-tutorial-smaller +icon-trello-smaller rotate: false - xy: 1543, 316 + xy: 1931, 483 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-tutorial-tiny +icon-trello-tiny rotate: false - xy: 1999, 197 + xy: 1905, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-undo +icon-turret rotate: false xy: 851, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-undo-small +icon-turret-small rotate: false - xy: 1377, 244 + xy: 1513, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-undo-smaller +icon-turret-smaller rotate: false - xy: 1579, 382 + xy: 1963, 483 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-undo-tiny +icon-turret-tiny rotate: false - xy: 1963, 143 + xy: 1887, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-units +icon-tutorial rotate: false xy: 851, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-units-small +icon-tutorial-small rotate: false - xy: 1411, 278 + xy: 1547, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-units-smaller +icon-tutorial-smaller rotate: false - xy: 1577, 350 + xy: 1997, 515 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-units-tiny +icon-tutorial-tiny rotate: false - xy: 1981, 161 + xy: 1923, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-unlocks +icon-undo rotate: false xy: 851, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-unlocks-small +icon-undo-small rotate: false - xy: 1445, 312 + xy: 1581, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-unlocks-smaller +icon-undo-smaller rotate: false - xy: 1341, 144 + xy: 1995, 483 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-unlocks-tiny +icon-undo-tiny rotate: false - xy: 1999, 179 + xy: 1905, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-upgrade +icon-units rotate: false xy: 851, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-upgrade-small +icon-units-small rotate: false - xy: 1479, 346 + xy: 1207, 137 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-upgrade-smaller +icon-units-smaller rotate: false - xy: 1339, 112 + xy: 1303, 107 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-upgrade-tiny +icon-units-tiny rotate: false - xy: 1963, 125 + xy: 1923, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-wiki +icon-unlocks rotate: false xy: 851, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-wiki-small +icon-unlocks-small rotate: false - xy: 1513, 380 + xy: 1241, 171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-wiki-smaller +icon-unlocks-smaller rotate: false - xy: 1355, 80 + xy: 1303, 75 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-wiki-tiny +icon-unlocks-tiny rotate: false - xy: 1981, 143 + xy: 1889, 26 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-workshop +icon-upgrade rotate: false xy: 851, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-workshop-small +icon-upgrade-small rotate: false - xy: 1547, 414 + xy: 1275, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-workshop-smaller +icon-upgrade-smaller rotate: false - xy: 1371, 112 + xy: 1303, 43 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-workshop-tiny +icon-upgrade-tiny rotate: false - xy: 1999, 161 + xy: 1889, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-zoom +icon-wiki rotate: false xy: 851, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +icon-wiki-small + rotate: false + xy: 1309, 239 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-wiki-smaller + rotate: false + xy: 1303, 11 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-wiki-tiny + rotate: false + xy: 1907, 26 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-workshop + rotate: false + xy: 851, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-workshop-small + rotate: false + xy: 1343, 273 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-workshop-smaller + rotate: false + xy: 1471, 215 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-workshop-tiny + rotate: false + xy: 1907, 8 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-zoom + rotate: false + xy: 859, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 icon-zoom-small rotate: false - xy: 1581, 448 + xy: 1377, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-zoom-smaller rotate: false - xy: 1387, 80 + xy: 1469, 183 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-zoom-tiny rotate: false - xy: 1963, 107 + xy: 1925, 26 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -19588,7 +19672,7 @@ info-banner index: -1 inventory rotate: false - xy: 1577, 168 + xy: 1839, 363 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -19610,7 +19694,7 @@ nomap index: -1 pane rotate: false - xy: 1649, 652 + xy: 1109, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19618,7 +19702,7 @@ pane index: -1 pane-2 rotate: false - xy: 1611, 652 + xy: 1109, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19626,7 +19710,7 @@ pane-2 index: -1 scroll rotate: false - xy: 1783, 329 + xy: 1891, 368 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -19649,49 +19733,49 @@ scroll-knob-horizontal-black index: -1 scroll-knob-vertical-black rotate: false - xy: 1577, 126 + xy: 1865, 363 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 2035, 531 + xy: 2035, 855 size: 12, 40 orig: 12, 40 offset: 0, 0 index: -1 selection rotate: false - xy: 1834, 493 + xy: 821, 975 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 1678, 508 + xy: 1529, 159 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1647, 476 + xy: 1503, 209 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1647, 436 + xy: 1469, 143 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1647, 396 + xy: 1501, 169 size: 29, 38 orig: 29, 38 offset: 0, 0 @@ -19705,7 +19789,7 @@ slider-vertical index: -1 underline rotate: false - xy: 1801, 652 + xy: 1185, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19713,7 +19797,7 @@ underline index: -1 underline-2 rotate: false - xy: 1687, 652 + xy: 1147, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19721,7 +19805,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 1725, 652 + xy: 1147, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19729,7 +19813,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 1763, 652 + xy: 1185, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19737,14 +19821,14 @@ underline-red index: -1 whiteui rotate: false - xy: 821, 928 + xy: 1876, 327 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 2019, 806 + xy: 1571, 316 size: 27, 61 split: 4, 4, 2, 2 orig: 27, 61 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index da21708541..fb27149b8f 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/sprites/sprites3.png b/core/assets/sprites/sprites3.png index 41b7b27af0..7cd10c87d2 100644 Binary files a/core/assets/sprites/sprites3.png and b/core/assets/sprites/sprites3.png differ diff --git a/core/assets/sprites/sprites5.png b/core/assets/sprites/sprites5.png index 8f762bfdb1..82e66a4467 100644 Binary files a/core/assets/sprites/sprites5.png and b/core/assets/sprites/sprites5.png differ diff --git a/core/src/io/anuke/mindustry/content/Loadouts.java b/core/src/io/anuke/mindustry/content/Loadouts.java deleted file mode 100644 index 631066a24f..0000000000 --- a/core/src/io/anuke/mindustry/content/Loadouts.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.anuke.mindustry.content; - -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.game.*; - -import java.io.*; - -public class Loadouts implements ContentList{ - public static Schematic - basicShard, - advancedShard, - basicFoundation, - basicNucleus; - - @Override - public void load(){ - try{ - basicShard = Schematics.readBase64("bXNjaAB4nD2K2wqAIBiD5ymibnoRn6YnEP1BwUMoBL19FuJ2sbFvUFgYZDaJsLeQrkinN9UJHImsNzlYE7WrIUastuSbnlKx2VJJt+8IQGGKdfO/8J5yrGJSMegLg+YUIA=="); - advancedShard = Schematics.readBase64("bXNjaAB4nD2LjQqAIAyET7OMIOhFfJqeYMxBgSkYCL199gu33fFtB4tOwUTaBCP5QpHFzwtl32DahBeKK1NwPq8hoOcUixwpY+CUxe3XIwBbB/pa6tadVCUP02hgHvp5vZq/0b7pBHPYFOQ="); - basicFoundation = Schematics.readBase64("bXNjaAB4nD1OSQ6DMBBzFhVu8BG+0X8MQyoiJTNSukj8nlCi2Adbtg/GA4OBF8oB00rvyE/9ykafqOIw58A7SWRKy1ZiShhZ5RcOLZhYS1hefQ1gRIeptH9jq/qW2lvc1d2tgWsOfVX/tOwE86AYBA=="); - basicNucleus = Schematics.readBase64("bXNjaAB4nD2MUQqAIBBEJy0s6qOLdJXuYNtCgikYBd2+LNmdj308hkGHtkId7M4YFns4mk/yfB4a48602eDI+mlNznu0FMPFd0wYKCaewl8F0EOueqM+yKSLVfJrNKWnSw/FZGzEGXFG9sy/px4gEBW1"); - }catch(IOException e){ - throw new RuntimeException(e); - } - } -} diff --git a/core/src/io/anuke/mindustry/ctype/ContentList.java b/core/src/io/anuke/mindustry/ctype/ContentList.java deleted file mode 100644 index 1f77c37e18..0000000000 --- a/core/src/io/anuke/mindustry/ctype/ContentList.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.anuke.mindustry.ctype; - -/** Interface for a list of content to be loaded in {@link io.anuke.mindustry.core.ContentLoader}. */ -public interface ContentList{ - /** This method should create all the content. */ - void load(); -} diff --git a/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java b/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java deleted file mode 100644 index 5f800b2098..0000000000 --- a/core/src/io/anuke/mindustry/entities/traits/TeamTrait.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.anuke.mindustry.entities.traits; - -import io.anuke.mindustry.game.Team; - -public interface TeamTrait extends Entity{ - Team getTeam(); -} diff --git a/core/src/io/anuke/mindustry/entities/type/SolidEntity.java b/core/src/io/anuke/mindustry/entities/type/SolidEntity.java deleted file mode 100644 index 7dc6b0aa89..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/SolidEntity.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.anuke.mindustry.entities.type; - -import io.anuke.arc.math.geom.Vector2; -import io.anuke.mindustry.entities.traits.SolidTrait; - -public abstract class SolidEntity extends BaseEntity implements SolidTrait{ - protected transient Vector2 velocity = new Vector2(0f, 0.0001f); - private transient Vector2 lastPosition = new Vector2(); - - @Override - public Vector2 lastPosition(){ - return lastPosition; - } - - @Override - public Vector2 velocity(){ - return velocity; - } -} diff --git a/core/src/io/anuke/mindustry/game/Team.java b/core/src/io/anuke/mindustry/game/Team.java deleted file mode 100644 index 57209fc62c..0000000000 --- a/core/src/io/anuke/mindustry/game/Team.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.anuke.mindustry.game; - -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.graphics.*; - -public enum Team{ - derelict(Color.valueOf("4d4e58")), - sharded(Pal.accent), - crux(Color.valueOf("e82d2d")), - green(Color.valueOf("4dd98b")), - purple(Color.valueOf("9a4bdf")), - blue(Color.royal.cpy()); - - public final static Team[] all = values(); - public final Color color; - public final int intColor; - - Team(Color color){ - this.color = color; - intColor = Color.rgba8888(color); - } - - public String localized(){ - return Core.bundle.get("team." + name() + ".name"); - } -} diff --git a/core/src/io/anuke/mindustry/game/Teams.java b/core/src/io/anuke/mindustry/game/Teams.java deleted file mode 100644 index 45f5daf070..0000000000 --- a/core/src/io/anuke/mindustry/game/Teams.java +++ /dev/null @@ -1,76 +0,0 @@ -package io.anuke.mindustry.game; - -import io.anuke.arc.collection.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.world.*; - -/** Class for various team-based utilities. */ -public class Teams{ - private TeamData[] map = new TeamData[Team.all.length]; - - /** - * Register a team. - * @param team The team type enum. - * @param enemies The array of enemies of this team. Any team not in this array is considered neutral. - */ - public void add(Team team, Team... enemies){ - map[team.ordinal()] = new TeamData(team, EnumSet.of(enemies)); - } - - /** Returns team data by type. */ - public TeamData get(Team team){ - if(map[team.ordinal()] == null){ - add(team, Array.with(Team.all).select(t -> t != team).toArray(Team.class)); - } - return map[team.ordinal()]; - } - - /** Returns whether a team is active, e.g. whether it has any cores remaining. */ - public boolean isActive(Team team){ - //the enemy wave team is always active - return team == Vars.waveTeam || get(team).cores.size > 0; - } - - /** Returns a set of all teams that are enemies of this team. */ - public EnumSet enemiesOf(Team team){ - return get(team).enemies; - } - - /** Returns whether {@param other} is an enemy of {@param #team}. */ - public boolean areEnemies(Team team, Team other){ - return enemiesOf(team).contains(other); - } - - /** Allocates a new array with the active teams. - * Never call in the main game loop.*/ - public Array getActive(){ - return Array.select(map, t -> t != null); - } - - public static class TeamData{ - public final ObjectSet cores = new ObjectSet<>(); - public final EnumSet enemies; - public final Team team; - public Queue brokenBlocks = new Queue<>(); - - public TeamData(Team team, EnumSet enemies){ - this.team = team; - this.enemies = enemies; - } - } - - /** Represents a block made by this team that was destroyed somewhere on the map. - * This does not include deconstructed blocks.*/ - public static class BrokenBlock{ - public final short x, y, rotation, block; - public final int config; - - public BrokenBlock(short x, short y, short rotation, short block, int config){ - this.x = x; - this.y = y; - this.rotation = rotation; - this.block = block; - this.config = config; - } - } -} diff --git a/core/src/io/anuke/mindustry/io/LegacyMapIO.java b/core/src/io/anuke/mindustry/io/LegacyMapIO.java deleted file mode 100644 index 9dbb2bed01..0000000000 --- a/core/src/io/anuke/mindustry/io/LegacyMapIO.java +++ /dev/null @@ -1,214 +0,0 @@ -package io.anuke.mindustry.io; - -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.io.MapIO.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.LegacyColorMapper.*; -import io.anuke.mindustry.world.blocks.*; - -import java.io.*; -import java.util.zip.*; - -import static io.anuke.mindustry.Vars.*; - -/** Map IO for the "old" .mmap format. - * Differentiate between legacy maps and new maps by checking the extension (or the header).*/ -public class LegacyMapIO{ - private static final ObjectMap fallback = ObjectMap.of("alpha-dart-mech-pad", "dart-mech-pad"); - private static final Json json = new Json(); - - /* Convert a map from the old format to the new format. */ - public static void convertMap(Fi in, Fi out) throws IOException{ - Map map = readMap(in, true); - - String waves = map.tags.get("waves", "[]"); - Array groups = new Array<>(json.fromJson(SpawnGroup[].class, waves)); - - Tile[][] tiles = world.createTiles(map.width, map.height); - for(int x = 0; x < map.width; x++){ - for(int y = 0; y < map.height; y++){ - tiles[x][y] = new CachedTile(); - tiles[x][y].x = (short)x; - tiles[x][y].y = (short)y; - } - } - state.rules.spawns = groups; - readTiles(map, tiles); - MapIO.writeMap(out, map); - } - - public static Map readMap(Fi file, boolean custom) throws IOException{ - try(DataInputStream stream = new DataInputStream(file.read(1024))){ - StringMap tags = new StringMap(); - - //meta is uncompressed - int version = stream.readInt(); - if(version != 1){ - throw new IOException("Outdated legacy map format"); - } - int build = stream.readInt(); - short width = stream.readShort(), height = stream.readShort(); - byte tagAmount = stream.readByte(); - - for(int i = 0; i < tagAmount; i++){ - String name = stream.readUTF(); - String value = stream.readUTF(); - tags.put(name, value); - } - - return new Map(file, width, height, tags, custom, version, build); - } - } - - public static void readTiles(Map map, Tile[][] tiles) throws IOException{ - readTiles(map, (x, y) -> tiles[x][y]); - } - - public static void readTiles(Map map, TileProvider tiles) throws IOException{ - readTiles(map.file, map.width, map.height, tiles); - } - - private static void readTiles(Fi file, int width, int height, Tile[][] tiles) throws IOException{ - readTiles(file, width, height, (x, y) -> tiles[x][y]); - } - - private static void readTiles(Fi file, int width, int height, TileProvider tiles) throws IOException{ - try(BufferedInputStream input = file.read(bufferSize)){ - - //read map - { - DataInputStream stream = new DataInputStream(input); - - stream.readInt(); //version - stream.readInt(); //build - stream.readInt(); //width + height - byte tagAmount = stream.readByte(); - - for(int i = 0; i < tagAmount; i++){ - stream.readUTF(); //key - stream.readUTF(); //val - } - } - - try(DataInputStream stream = new DataInputStream(new InflaterInputStream(input))){ - - try{ - byte mapped = stream.readByte(); - IntMap idmap = new IntMap<>(); - IntMap namemap = new IntMap<>(); - - for(int i = 0; i < mapped; i++){ - byte type = stream.readByte(); - short total = stream.readShort(); - - for(int j = 0; j < total; j++){ - String name = stream.readUTF(); - if(type == 1){ - Block res = content.getByName(ContentType.block, fallback.get(name, name)); - idmap.put(j, res == null ? Blocks.air : res); - namemap.put(j, fallback.get(name, name)); - } - } - } - - //read floor and create tiles first - for(int i = 0; i < width * height; i++){ - int x = i % width, y = i / width; - int floorid = stream.readUnsignedByte(); - int oreid = stream.readUnsignedByte(); - int consecutives = stream.readUnsignedByte(); - - Tile tile = tiles.get(x, y); - tile.setFloor((Floor)idmap.get(floorid)); - tile.setOverlay(idmap.get(oreid)); - - for(int j = i + 1; j < i + 1 + consecutives; j++){ - int newx = j % width, newy = j / width; - Tile newTile = tiles.get(newx, newy); - newTile.setFloor((Floor)idmap.get(floorid)); - newTile.setOverlay(idmap.get(oreid)); - } - - i += consecutives; - } - - //read blocks - for(int i = 0; i < width * height; i++){ - int x = i % width, y = i / width; - int id = stream.readUnsignedByte(); - Block block = idmap.get(id); - if(block == null) block = Blocks.air; - - Tile tile = tiles.get(x, y); - //the spawn block is saved in the block tile layer in older maps, shift it to the overlay - if(block != Blocks.spawn){ - tile.setBlock(block); - }else{ - tile.setOverlay(block); - } - - if(namemap.get(id, "").equals("part")){ - stream.readByte(); //link - }else if(tile.entity != null){ - byte tr = stream.readByte(); - stream.readShort(); //read health (which is actually irrelevant) - - byte team = Pack.leftByte(tr); - byte rotation = Pack.rightByte(tr); - - tile.setTeam(Team.all[team]); - tile.entity.health = tile.block().health; - tile.rotation(rotation); - - if(tile.block() == Blocks.liquidSource || tile.block() == Blocks.unloader || tile.block() == Blocks.sorter){ - stream.readByte(); //these blocks have an extra config byte, read it - } - }else{ //no entity/part, read consecutives - int consecutives = stream.readUnsignedByte(); - - for(int j = i + 1; j < i + 1 + consecutives; j++){ - int newx = j % width, newy = j / width; - tiles.get(newx, newy).setBlock(block); - } - - i += consecutives; - } - } - - }finally{ - content.setTemporaryMapper(null); - } - } - } - } - - /** Reads a pixmap in the 3.5 pixmap format. */ - public static void readPixmap(Pixmap pixmap, Tile[][] tiles){ - for(int x = 0; x < pixmap.getWidth(); x++){ - for(int y = 0; y < pixmap.getHeight(); y++){ - int color = pixmap.getPixel(x, pixmap.getHeight() - 1 - y); - LegacyBlock block = LegacyColorMapper.get(color); - Tile tile = tiles[x][y]; - - tile.setFloor(block.floor); - tile.setBlock(block.wall); - if(block.ore != null) tile.setOverlay(block.ore); - - //place core - if(color == Color.rgba8888(Color.green)){ - //actual core parts - tile.setBlock(Blocks.coreShard); - tile.setTeam(Team.sharded); - } - } - } - } -} diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java deleted file mode 100644 index 916831a62b..0000000000 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.anuke.mindustry.mod; - -import io.anuke.arc.collection.*; -//obviously autogenerated, do not touch -public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.Pixmap", "io.anuke.arc.graphics.Texture", "io.anuke.arc.graphics.TextureData", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.I18NBundle", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.Content$ModContentInfo", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.ContentType", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.HoverUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$ServerLoadEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.gen.BufferItem", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.MethodHash", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.PathTile", "io.anuke.mindustry.gen.PropCell", "io.anuke.mindustry.gen.RemoteReadClient", "io.anuke.mindustry.gen.RemoteReadServer", "io.anuke.mindustry.gen.Serialization", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.TileOp", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ErrorContent", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.Object", "java.lang.Runnable", "java.lang.String", "java.lang.System"); -} \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/net/Administration.java b/core/src/io/anuke/mindustry/net/Administration.java deleted file mode 100644 index f7815e03d2..0000000000 --- a/core/src/io/anuke/mindustry/net/Administration.java +++ /dev/null @@ -1,349 +0,0 @@ -package io.anuke.mindustry.net; - -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.mindustry.Vars; - - -import static io.anuke.mindustry.Vars.headless; -import static io.anuke.mindustry.game.EventType.*; - -public class Administration{ - /** All player info. Maps UUIDs to info. This persists throughout restarts. */ - private ObjectMap playerInfo = new ObjectMap<>(); - private Array bannedIPs = new Array<>(); - private Array whitelist = new Array<>(); - - public Administration(){ - Core.settings.defaults( - "strict", true, - "servername", "Server" - ); - - load(); - } - - public int getPlayerLimit(){ - return Core.settings.getInt("playerlimit", 0); - } - - public void setPlayerLimit(int limit){ - Core.settings.putSave("playerlimit", limit); - } - - public void setStrict(boolean on){ - Core.settings.putSave("strict", on); - } - - public boolean getStrict(){ - return Core.settings.getBool("strict"); - } - - public boolean allowsCustomClients(){ - return Core.settings.getBool("allow-custom", !headless); - } - - public void setCustomClients(boolean allowed){ - Core.settings.put("allow-custom", allowed); - Core.settings.save(); - } - - /** Call when a player joins to update their information here. */ - public void updatePlayerJoined(String id, String ip, String name){ - PlayerInfo info = getCreateInfo(id); - info.lastName = name; - info.lastIP = ip; - info.timesJoined++; - if(!info.names.contains(name, false)) info.names.add(name); - if(!info.ips.contains(ip, false)) info.ips.add(ip); - } - - public boolean banPlayer(String uuid){ - return banPlayerID(uuid) || banPlayerIP(getInfo(uuid).lastIP); - } - - /** - * Bans a player by IP; returns whether this player was already banned. - * If there are players who at any point had this IP, they will be UUID banned as well. - */ - public boolean banPlayerIP(String ip){ - if(bannedIPs.contains(ip, false)) - return false; - - for(PlayerInfo info : playerInfo.values()){ - if(info.ips.contains(ip, false)){ - info.banned = true; - } - } - - bannedIPs.add(ip); - save(); - Events.fire(new PlayerIpBanEvent(ip)); - return true; - } - - /** Bans a player by UUID; returns whether this player was already banned. */ - public boolean banPlayerID(String id){ - if(playerInfo.containsKey(id) && playerInfo.get(id).banned) - return false; - - getCreateInfo(id).banned = true; - - save(); - Events.fire(new PlayerBanEvent(Vars.playerGroup.find(p -> id.equals(p.uuid)))); - return true; - } - - /** - * Unbans a player by IP; returns whether this player was banned in the first place. - * This method also unbans any player that was banned and had this IP. - */ - public boolean unbanPlayerIP(String ip){ - boolean found = bannedIPs.contains(ip, false); - - for(PlayerInfo info : playerInfo.values()){ - if(info.ips.contains(ip, false)){ - info.banned = false; - found = true; - } - } - - bannedIPs.removeValue(ip, false); - - if(found){ - save(); - Events.fire(new PlayerIpUnbanEvent(ip)); - } - return found; - } - - /** - * Unbans a player by ID; returns whether this player was banned in the first place. - * This also unbans all IPs the player used. - */ - public boolean unbanPlayerID(String id){ - PlayerInfo info = getCreateInfo(id); - - if(!info.banned) - return false; - - info.banned = false; - bannedIPs.removeAll(info.ips, false); - save(); - Events.fire(new PlayerUnbanEvent(Vars.playerGroup.find(p -> id.equals(p.uuid)))); - return true; - } - - /** - * Returns list of all players with admin status - */ - public Array getAdmins(){ - Array result = new Array<>(); - for(PlayerInfo info : playerInfo.values()){ - if(info.admin){ - result.add(info); - } - } - return result; - } - - /** - * Returns list of all players with admin status - */ - public Array getBanned(){ - Array result = new Array<>(); - for(PlayerInfo info : playerInfo.values()){ - if(info.banned){ - result.add(info); - } - } - return result; - } - - /** - * Returns all banned IPs. This does not include the IPs of ID-banned players. - */ - public Array getBannedIPs(){ - return bannedIPs; - } - - /** - * Makes a player an admin. Returns whether this player was already an admin. - */ - public boolean adminPlayer(String id, String usid){ - PlayerInfo info = getCreateInfo(id); - - if(info.admin && info.adminUsid != null && info.adminUsid.equals(usid)) - return false; - - info.adminUsid = usid; - info.admin = true; - save(); - - return true; - } - - /** - * Makes a player no longer an admin. Returns whether this player was an admin in the first place. - */ - public boolean unAdminPlayer(String id){ - PlayerInfo info = getCreateInfo(id); - - if(!info.admin) - return false; - - info.admin = false; - save(); - - return true; - } - - public boolean isWhitelistEnabled(){ - return Core.settings.getBool("whitelist", false); - } - - public void setWhitelist(boolean enabled){ - Core.settings.putSave("whitelist", enabled); - } - - public boolean isWhitelisted(String id, String usid){ - return !isWhitelistEnabled() || whitelist.contains(usid + id); - } - - public boolean whitelist(String id){ - PlayerInfo info = getCreateInfo(id); - if(whitelist.contains(info.adminUsid + id)) return false; - whitelist.add(info.adminUsid + id); - save(); - return true; - } - - public boolean unwhitelist(String id){ - PlayerInfo info = getCreateInfo(id); - if(whitelist.contains(info.adminUsid + id)){ - whitelist.remove(info.adminUsid + id); - save(); - return true; - } - return false; - } - - public boolean isIPBanned(String ip){ - return bannedIPs.contains(ip, false) || (findByIP(ip) != null && findByIP(ip).banned); - } - - public boolean isIDBanned(String uuid){ - return getCreateInfo(uuid).banned; - } - - public boolean isAdmin(String id, String usid){ - PlayerInfo info = getCreateInfo(id); - return info.admin && usid.equals(info.adminUsid); - } - - /** Finds player info by IP, UUID and name. */ - public ObjectSet findByName(String name){ - ObjectSet result = new ObjectSet<>(); - - for(PlayerInfo info : playerInfo.values()){ - if(info.lastName.toLowerCase().equals(name.toLowerCase()) || (info.names.contains(name, false)) - || info.ips.contains(name, false) || info.id.equals(name)){ - result.add(info); - } - } - - return result; - } - - public Array findByIPs(String ip){ - Array result = new Array<>(); - - for(PlayerInfo info : playerInfo.values()){ - if(info.ips.contains(ip, false)){ - result.add(info); - } - } - - return result; - } - - public PlayerInfo getInfo(String id){ - return getCreateInfo(id); - } - - public PlayerInfo getInfoOptional(String id){ - return playerInfo.get(id); - } - - public PlayerInfo findByIP(String ip){ - for(PlayerInfo info : playerInfo.values()){ - if(info.ips.contains(ip, false)){ - return info; - } - } - return null; - } - - public Array getWhitelisted(){ - return playerInfo.values().toArray().select(p -> isWhitelisted(p.id, p.adminUsid)); - } - - private PlayerInfo getCreateInfo(String id){ - if(playerInfo.containsKey(id)){ - return playerInfo.get(id); - }else{ - PlayerInfo info = new PlayerInfo(id); - playerInfo.put(id, info); - save(); - return info; - } - } - - public void save(){ - Core.settings.putObject("player-info", playerInfo); - Core.settings.putObject("banned-ips", bannedIPs); - Core.settings.putObject("whitelisted", whitelist); - Core.settings.save(); - } - - @SuppressWarnings("unchecked") - private void load(){ - playerInfo = Core.settings.getObject("player-info", ObjectMap.class, ObjectMap::new); - bannedIPs = Core.settings.getObject("banned-ips", Array.class, Array::new); - whitelist = Core.settings.getObject("whitelisted", Array.class, Array::new); - } - - @Serialize - public static class PlayerInfo{ - public String id; - public String lastName = "", lastIP = ""; - public Array ips = new Array<>(); - public Array names = new Array<>(); - public String adminUsid; - public int timesKicked; - public int timesJoined; - public boolean banned, admin; - public long lastKicked; //last kicked timestamp - - PlayerInfo(String id){ - this.id = id; - } - - public PlayerInfo(){ - } - } - - public static class TraceInfo{ - public String ip, uuid; - public boolean modded, mobile; - - public TraceInfo(String ip, String uuid, boolean modded, boolean mobile){ - this.ip = ip; - this.uuid = uuid; - this.modded = modded; - this.mobile = mobile; - } - } - -} diff --git a/core/src/io/anuke/mindustry/plugin/Plugin.java b/core/src/io/anuke/mindustry/plugin/Plugin.java deleted file mode 100644 index d3f4da04da..0000000000 --- a/core/src/io/anuke/mindustry/plugin/Plugin.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.anuke.mindustry.plugin; - -import io.anuke.mindustry.mod.*; - -public abstract class Plugin extends Mod{ - -} diff --git a/core/src/io/anuke/mindustry/world/producers/Produce.java b/core/src/io/anuke/mindustry/world/producers/Produce.java deleted file mode 100644 index c055f50645..0000000000 --- a/core/src/io/anuke/mindustry/world/producers/Produce.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.world.producers; - -public class Produce{ -} diff --git a/core/src/io/anuke/mindustry/world/producers/ProduceItem.java b/core/src/io/anuke/mindustry/world/producers/ProduceItem.java deleted file mode 100644 index f1083e17ed..0000000000 --- a/core/src/io/anuke/mindustry/world/producers/ProduceItem.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.world.producers; - -public class ProduceItem{ -} diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/mindustry/ClientLauncher.java similarity index 89% rename from core/src/io/anuke/mindustry/ClientLauncher.java rename to core/src/mindustry/ClientLauncher.java index 5d04c44010..bc9e2f0663 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/mindustry/ClientLauncher.java @@ -1,26 +1,26 @@ -package io.anuke.mindustry; +package mindustry; -import io.anuke.arc.*; -import io.anuke.arc.assets.*; -import io.anuke.arc.assets.loaders.*; -import io.anuke.arc.audio.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.async.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.ctype.Content; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.mod.*; -import io.anuke.mindustry.net.Net; +import arc.*; +import arc.assets.*; +import arc.assets.loaders.*; +import arc.audio.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.async.*; +import mindustry.core.*; +import mindustry.ctype.Content; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.maps.*; +import mindustry.mod.*; +import mindustry.net.Net; -import static io.anuke.arc.Core.*; -import static io.anuke.mindustry.Vars.*; +import static arc.Core.*; +import static mindustry.Vars.*; public abstract class ClientLauncher extends ApplicationCore implements Platform{ private static final int loadingFPS = 20; diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/mindustry/Vars.java similarity index 88% rename from core/src/io/anuke/mindustry/Vars.java rename to core/src/mindustry/Vars.java index 134865bee2..80e6241e09 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -1,33 +1,34 @@ -package io.anuke.mindustry; +package mindustry; -import io.anuke.arc.Application.*; -import io.anuke.arc.*; -import io.anuke.arc.assets.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.io.*; -import io.anuke.mindustry.ai.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.mod.*; -import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.world.blocks.defense.ForceProjector.*; +import arc.*; +import arc.Application.*; +import arc.assets.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.io.*; +import mindustry.ai.*; +import mindustry.core.*; +import mindustry.entities.*; +import mindustry.entities.effect.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.input.*; +import mindustry.maps.*; +import mindustry.mod.*; +import mindustry.net.*; +import mindustry.net.Net; +import mindustry.world.blocks.defense.ForceProjector.*; import java.nio.charset.*; import java.util.*; -import static io.anuke.arc.Core.settings; +import static arc.Core.settings; @SuppressWarnings("unchecked") public class Vars implements Loadable{ @@ -53,18 +54,16 @@ public class Vars implements Loadable{ public static final String crashReportURL = "http://192.99.169.18/report"; /** URL the links to the wiki's modding guide.*/ public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/"; - /** URL to the JSON file containing all the global, public servers. */ + /** URL to the JSON file containing all the global, public servers. Not queried in BE. */ public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json"; + /** URL to the JSON file containing all the BE servers. Only queried in BE. */ + public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; /** URL the links to the wiki's modding guide.*/ public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md"; /** list of built-in servers.*/ public static final Array defaultServers = Array.with(); /** maximum distance between mine and core that supports automatic transferring */ public static final float mineTransferRange = 220f; - /** team of the player by default */ - public static final Team defaultTeam = Team.sharded; - /** team of the enemy in waves/sectors */ - public static final Team waveTeam = Team.crux; /** whether to enable editing of units in the editor */ public static final boolean enableUnitEditing = false; /** max chat message length */ @@ -124,13 +123,13 @@ public class Vars implements Loadable{ public static boolean steam; /** whether typing into the console is enabled - developers only */ public static boolean enableConsole = false; - /** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */ + /** application data directory, equivalent to {@link Settings#getDataDirectory()} */ public static Fi dataDirectory; /** data subdirectory used for screenshots */ public static Fi screenshotDirectory; - /** data subdirectory used for custom mmaps */ + /** data subdirectory used for custom maps */ public static Fi customMapDirectory; - /** data subdirectory used for custom mmaps */ + /** data subdirectory used for custom map previews */ public static Fi mapPreviewDirectory; /** tmp subdirectory for map conversion */ public static Fi tmpDirectory; @@ -140,6 +139,8 @@ public class Vars implements Loadable{ public static Fi modDirectory; /** data subdirectory used for schematics */ public static Fi schematicDirectory; + /** data subdirectory used for bleeding edge build versions */ + public static Fi bebuildDirectory; /** map file extension */ public static final String mapExtension = "msav"; /** save file extension */ @@ -161,6 +162,7 @@ public class Vars implements Loadable{ public static Platform platform = new Platform(){}; public static Mods mods; public static Schematics schematics = new Schematics(); + public static BeControl becontrol; public static World world; public static Maps maps; @@ -184,7 +186,7 @@ public class Vars implements Loadable{ public static EntityGroup shieldGroup; public static EntityGroup puddleGroup; public static EntityGroup fireGroup; - public static EntityGroup[] unitGroups; + public static EntityGroup unitGroup; public static Player player; @@ -196,7 +198,7 @@ public class Vars implements Loadable{ public static void init(){ Serialization.init(); - DefaultSerializers.typeMappings.put("io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.ctype.ContentType"); + DefaultSerializers.typeMappings.put("mindustry.type.ContentType", "mindustry.ctype.ContentType"); if(loadLocales){ //load locales @@ -224,6 +226,7 @@ public class Vars implements Loadable{ defaultWaves = new DefaultWaves(); collisions = new EntityCollisions(); world = new World(); + becontrol = new BeControl(); maps = new Maps(); spawner = new WaveSpawner(); @@ -239,11 +242,7 @@ public class Vars implements Loadable{ puddleGroup = entities.add(Puddle.class).enableMapping(); shieldGroup = entities.add(ShieldEntity.class, false); fireGroup = entities.add(Fire.class).enableMapping(); - unitGroups = new EntityGroup[Team.all.length]; - - for(Team team : Team.all){ - unitGroups[team.ordinal()] = entities.add(BaseUnit.class).enableMapping(); - } + unitGroup = entities.add(BaseUnit.class).enableMapping(); for(EntityGroup group : entities.all()){ group.setRemoveListener(entity -> { @@ -268,6 +267,7 @@ public class Vars implements Loadable{ tmpDirectory = dataDirectory.child("tmp/"); modDirectory = dataDirectory.child("mods/"); schematicDirectory = dataDirectory.child("schematics/"); + bebuildDirectory = dataDirectory.child("be_builds/"); modDirectory.mkdirs(); diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java similarity index 77% rename from core/src/io/anuke/mindustry/ai/BlockIndexer.java rename to core/src/mindustry/ai/BlockIndexer.java index f6df8f7475..7a100b7778 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -1,21 +1,21 @@ -package io.anuke.mindustry.ai; +package mindustry.ai; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Teams.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.func.*; +import arc.math.*; +import arc.math.geom.*; +import arc.struct.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Class used for indexing special target blocks for AI. */ @SuppressWarnings("unchecked") @@ -28,15 +28,17 @@ public class BlockIndexer{ private final ObjectSet itemSet = new ObjectSet<>(); /** Stores all ore quadtrants on the map. */ private ObjectMap> ores = new ObjectMap<>(); - /** Tags all quadrants. */ + /** Maps each team ID to a quarant. A quadrant is a grid of bits, where each bit is set if and only if there is a block of that team in that quadrant. */ private GridBits[] structQuadrants; /** Stores all damaged tile entities by team. */ - private ObjectSet[] damagedTiles = new ObjectSet[Team.all.length]; + private ObjectSet[] damagedTiles = new ObjectSet[Team.all().length]; /**All ores available on this map.*/ private ObjectSet allOres = new ObjectSet<>(); + /**Stores teams that are present here as tiles.*/ + private ObjectSet activeTeams = new ObjectSet<>(); /** Maps teams to a map of flagged tiles by type. */ - private ObjectSet[][] flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length]; + private ObjectSet[][] flagMap = new ObjectSet[Team.all().length][BlockFlag.all.length]; /** Maps tile positions to their last known tile index data. */ private IntMap typeMap = new IntMap<>(); /** Empty set used for returning. */ @@ -59,8 +61,8 @@ public class BlockIndexer{ Events.on(WorldLoadEvent.class, event -> { scanOres.clear(); scanOres.addAll(Item.getAllOres()); - damagedTiles = new ObjectSet[Team.all.length]; - flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length]; + damagedTiles = new ObjectSet[Team.all().length]; + flagMap = new ObjectSet[Team.all().length][BlockFlag.all.length]; for(int i = 0; i < flagMap.length; i++){ for(int j = 0; j < BlockFlag.all.length; j++){ @@ -73,10 +75,7 @@ public class BlockIndexer{ ores = null; //create bitset for each team type that contains each quadrant - structQuadrants = new GridBits[Team.all.length]; - for(int i = 0; i < Team.all.length; i++){ - structQuadrants[i] = new GridBits(Mathf.ceil(world.width() / (float)quadrantSize), Mathf.ceil(world.height() / (float)quadrantSize)); - } + structQuadrants = new GridBits[Team.all().length]; for(int x = 0; x < world.width(); x++){ for(int y = 0; y < world.height(); y++){ @@ -103,7 +102,32 @@ public class BlockIndexer{ } private ObjectSet[] getFlagged(Team team){ - return flagMap[team.ordinal()]; + return flagMap[team.id]; + } + + private GridBits structQuadrant(Team t){ + int id = Pack.u(t.id); + if(structQuadrants[id] == null){ + structQuadrants[id] = new GridBits(Mathf.ceil(world.width() / (float)quadrantSize), Mathf.ceil(world.height() / (float)quadrantSize)); + } + return structQuadrants[id]; + } + + /** Updates all the structure quadrants for a newly activated team. */ + public void updateTeamIndex(Team team){ + if(structQuadrants == null) return; + + //go through every tile... ouch + for(int x = 0; x < world.width(); x++){ + for(int y = 0; y < world.height(); y++){ + Tile tile = world.tile(x, y); + if(tile.getTeam() == team){ + int quadrantX = tile.x / quadrantSize; + int quadrantY = tile.y / quadrantSize; + structQuadrant(team).set(quadrantX, quadrantY); + } + } + } } /** @return whether this item is present on this map.*/ @@ -115,11 +139,11 @@ public class BlockIndexer{ public ObjectSet getDamaged(Team team){ returnArray.clear(); - if(damagedTiles[team.ordinal()] == null){ - damagedTiles[team.ordinal()] = new ObjectSet<>(); + if(damagedTiles[team.id] == null){ + damagedTiles[team.id] = new ObjectSet<>(); } - ObjectSet set = damagedTiles[team.ordinal()]; + ObjectSet set = damagedTiles[team.id]; for(Tile tile : set){ if((tile.entity == null || tile.entity.getTeam() != team || !tile.entity.damaged()) || tile.block() instanceof BuildBlock){ returnArray.add(tile); @@ -135,13 +159,13 @@ public class BlockIndexer{ /** Get all allied blocks with a flag. */ public ObjectSet getAllied(Team team, BlockFlag type){ - return flagMap[team.ordinal()][type.ordinal()]; + return flagMap[team.id][type.ordinal()]; } /** Get all enemy blocks with a flag. */ public Array getEnemy(Team team, BlockFlag type){ returnArray.clear(); - for(Team enemy : state.teams.enemiesOf(team)){ + for(Team enemy : team.enemies()){ if(state.teams.isActive(enemy)){ ObjectSet set = getFlagged(enemy)[type.ordinal()]; if(set != null){ @@ -155,14 +179,27 @@ public class BlockIndexer{ } public void notifyTileDamaged(TileEntity entity){ - if(damagedTiles[entity.getTeam().ordinal()] == null){ - damagedTiles[entity.getTeam().ordinal()] = new ObjectSet<>(); + if(damagedTiles[(int)entity.getTeam().id] == null){ + damagedTiles[(int)entity.getTeam().id] = new ObjectSet<>(); } - ObjectSet set = damagedTiles[entity.getTeam().ordinal()]; + ObjectSet set = damagedTiles[(int)entity.getTeam().id]; set.add(entity.tile); } + public TileEntity findEnemyTile(Team team, float x, float y, float range, Boolf pred){ + for(Team enemy : activeTeams){ + if(!team.isEnemy(enemy)) continue; + + TileEntity entity = indexer.findTile(enemy, x, y, range, pred, true); + if(entity != null){ + return entity; + } + } + + return null; + } + public TileEntity findTile(Team team, float x, float y, float range, Boolf pred){ return findTile(team, x, y, range, pred, false); } @@ -188,7 +225,7 @@ public class BlockIndexer{ TileEntity e = other.entity; float ndst = Mathf.dst(x, y, e.x, e.y); - if(ndst < range && (closest == null || ndst < dst || (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){ + if(ndst < range && (closest == null || ndst < dst || (usePriority && closest.block.priority.ordinal() <= e.block.priority.ordinal()))){ dst = ndst; closest = e; } @@ -242,6 +279,7 @@ public class BlockIndexer{ } typeMap.put(tile.pos(), new TileIndex(tile.block().flags, tile.getTeam())); } + activeTeams.add(tile.getTeam()); if(ores == null) return; @@ -280,26 +318,25 @@ public class BlockIndexer{ //this quadrant is now 'dirty', re-scan the whole thing int quadrantX = tile.x / quadrantSize; int quadrantY = tile.y / quadrantSize; - int index = quadrantX + quadrantY * quadWidth(); - for(Team team : Team.all){ - TeamData data = state.teams.get(team); + for(Team team : activeTeams){ + GridBits bits = structQuadrant(team); //fast-set this quadrant to 'occupied' if the tile just placed is already of this team - if(tile.getTeam() == data.team && tile.entity != null && tile.block().targetable){ - structQuadrants[data.team.ordinal()].set(quadrantX, quadrantY); + if(tile.getTeam() == team && tile.entity != null && tile.block().targetable){ + bits.set(quadrantX, quadrantY); continue; //no need to process futher } - structQuadrants[data.team.ordinal()].set(quadrantX, quadrantY, false); + bits.set(quadrantX, quadrantY, false); outer: for(int x = quadrantX * quadrantSize; x < world.width() && x < (quadrantX + 1) * quadrantSize; x++){ for(int y = quadrantY * quadrantSize; y < world.height() && y < (quadrantY + 1) * quadrantSize; y++){ Tile result = world.ltile(x, y); //when a targetable block is found, mark this quadrant as occupied and stop searching - if(result.entity != null && result.getTeam() == data.team){ - structQuadrants[data.team.ordinal()].set(quadrantX, quadrantY); + if(result.entity != null && result.getTeam() == team){ + bits.set(quadrantX, quadrantY); break outer; } } @@ -308,7 +345,7 @@ public class BlockIndexer{ } private boolean getQuad(Team team, int quadrantX, int quadrantY){ - return structQuadrants[team.ordinal()].get(quadrantX, quadrantY); + return structQuadrant(team).get(quadrantX, quadrantY); } private int quadWidth(){ diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java similarity index 88% rename from core/src/io/anuke/mindustry/ai/Pathfinder.java rename to core/src/mindustry/ai/Pathfinder.java index 14890b531f..a16ac8f410 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.ai; +package mindustry.ai; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.async.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.func.*; +import arc.math.geom.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import arc.util.async.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.world.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Pathfinder implements Runnable{ private static final long maxUpdate = Time.millisToNanos(4); @@ -27,9 +27,9 @@ public class Pathfinder implements Runnable{ /** unordered array of path data for iteration only. DO NOT iterate ot access this in the main thread.*/ private Array list = new Array<>(); /** Maps teams + flags to a valid path to get to that flag for that team. */ - private PathData[][] pathMap = new PathData[Team.all.length][PathTarget.all.length]; + private PathData[][] pathMap = new PathData[Team.all().length][PathTarget.all.length]; /** Grid map of created path data that should not be queued again. */ - private GridBits created = new GridBits(Team.all.length, PathTarget.all.length); + private GridBits created = new GridBits(Team.all().length, PathTarget.all.length); /** handles task scheduling on the update thread. */ private TaskQueue queue = new TaskQueue(); /** current pathfinding thread */ @@ -42,8 +42,8 @@ public class Pathfinder implements Runnable{ //reset and update internal tile array tiles = new int[world.width()][world.height()]; - pathMap = new PathData[Team.all.length][PathTarget.all.length]; - created = new GridBits(Team.all.length, PathTarget.all.length); + pathMap = new PathData[Team.all().length][PathTarget.all.length]; + created = new GridBits(Team.all().length, PathTarget.all.length); list = new Array<>(); for(int x = 0; x < world.width(); x++){ @@ -53,7 +53,7 @@ public class Pathfinder implements Runnable{ } //special preset which may help speed things up; this is optional - preloadPath(waveTeam, PathTarget.enemyCores); + preloadPath(state.rules.waveTeam, PathTarget.enemyCores); start(); }); @@ -84,8 +84,8 @@ public class Pathfinder implements Runnable{ } public int debugValue(Team team, int x, int y){ - if(pathMap[team.ordinal()][PathTarget.enemyCores.ordinal()] == null) return 0; - return pathMap[team.ordinal()][PathTarget.enemyCores.ordinal()].weights[x][y]; + if(pathMap[team.id][PathTarget.enemyCores.ordinal()] == null) return 0; + return pathMap[team.id][PathTarget.enemyCores.ordinal()].weights[x][y]; } /** Update a tile in the internal pathfinding grid. Causes a complete pathfinding reclaculation. */ @@ -139,7 +139,7 @@ public class Pathfinder implements Runnable{ //stop looping when interrupted externally return; } - }catch(Exception e){ + }catch(Throwable e){ e.printStackTrace(); } } @@ -149,12 +149,12 @@ public class Pathfinder implements Runnable{ public Tile getTargetTile(Tile tile, Team team, PathTarget target){ if(tile == null) return null; - PathData data = pathMap[team.ordinal()][target.ordinal()]; + PathData data = pathMap[team.id][target.ordinal()]; if(data == null){ //if this combination is not found, create it on request - if(!created.get(team.ordinal(), target.ordinal())){ - created.set(team.ordinal(), target.ordinal()); + if(!created.get(team.id, target.ordinal())){ + created.set(team.id, target.ordinal()); //grab targets since this is run on main thread IntArray targets = target.getTargets(team, new IntArray()); queue.post(() -> createPath(team, target, targets)); @@ -188,7 +188,7 @@ public class Pathfinder implements Runnable{ /** @return whether a tile can be passed through by this team. Pathfinding thread only.*/ private boolean passable(int x, int y, Team team){ int tile = tiles[x][y]; - return PathTile.passable(tile) || (PathTile.team(tile) != team.ordinal() && PathTile.team(tile) != Team.derelict.ordinal()); + return PathTile.passable(tile) || (PathTile.team(tile) != team.id && PathTile.team(tile) != (int)Team.derelict.id); } /** @@ -238,7 +238,7 @@ public class Pathfinder implements Runnable{ PathData path = new PathData(team, target, world.width(), world.height()); list.add(path); - pathMap[team.ordinal()][target.ordinal()] = path; + pathMap[team.id][target.ordinal()] = path; //grab targets from passed array synchronized(path.targets){ @@ -303,7 +303,7 @@ public class Pathfinder implements Runnable{ } //spawn points are also enemies. - if(state.rules.waves && team == defaultTeam){ + if(state.rules.waves && team == state.rules.defaultTeam){ for(Tile other : spawner.getGroundSpawns()){ out.add(other.pos()); } diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java similarity index 71% rename from core/src/io/anuke/mindustry/ai/WaveSpawner.java rename to core/src/mindustry/ai/WaveSpawner.java index ca50e36b13..3bd5bc5400 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/mindustry/ai/WaveSpawner.java @@ -1,22 +1,22 @@ -package io.anuke.mindustry.ai; +package mindustry.ai; -import io.anuke.arc.Events; -import io.anuke.arc.collection.Array; -import io.anuke.arc.func.Floatc2; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.arc.util.Tmp; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Damage; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.BaseUnit; -import io.anuke.mindustry.game.EventType.WorldLoadEvent; -import io.anuke.mindustry.game.SpawnGroup; -import io.anuke.mindustry.world.Tile; +import arc.Events; +import arc.struct.Array; +import arc.func.Floatc2; +import arc.math.Angles; +import arc.math.Mathf; +import arc.util.Time; +import arc.util.Tmp; +import mindustry.content.Blocks; +import mindustry.content.Fx; +import mindustry.entities.Damage; +import mindustry.entities.Effects; +import mindustry.entities.type.*; +import mindustry.game.EventType.WorldLoadEvent; +import mindustry.game.SpawnGroup; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class WaveSpawner{ private static final float margin = 40f, coreMargin = tilesize * 3; //how far away from the edge flying units spawn @@ -53,7 +53,7 @@ public class WaveSpawner{ eachFlyerSpawn((spawnX, spawnY) -> { for(int i = 0; i < spawned; i++){ - BaseUnit unit = group.createUnit(waveTeam); + BaseUnit unit = group.createUnit(state.rules.waveTeam); unit.set(spawnX + Mathf.range(spread), spawnY + Mathf.range(spread)); unit.add(); } @@ -66,7 +66,7 @@ public class WaveSpawner{ for(int i = 0; i < spawned; i++){ Tmp.v1.rnd(spread); - BaseUnit unit = group.createUnit(waveTeam); + BaseUnit unit = group.createUnit(state.rules.waveTeam); unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y); Time.run(Math.min(i * 5, 60 * 2), () -> spawnEffect(unit)); @@ -78,7 +78,7 @@ public class WaveSpawner{ eachGroundSpawn((spawnX, spawnY, doShockwave) -> { if(doShockwave){ Time.run(20f, () -> Effects.effect(Fx.spawnShockwave, spawnX, spawnY, state.rules.dropZoneRadius)); - Time.run(40f, () -> Damage.damage(waveTeam, spawnX, spawnY, state.rules.dropZoneRadius, 99999999f, true)); + Time.run(40f, () -> Damage.damage(state.rules.waveTeam, spawnX, spawnY, state.rules.dropZoneRadius, 99999999f, true)); } }); @@ -90,11 +90,11 @@ public class WaveSpawner{ cons.accept(spawn.worldx(), spawn.worldy(), true); } - if(state.rules.attackMode && state.teams.isActive(waveTeam) && !state.teams.get(defaultTeam).cores.isEmpty()){ - Tile firstCore = state.teams.get(defaultTeam).cores.first(); - for(Tile core : state.teams.get(waveTeam).cores){ - Tmp.v1.set(firstCore).sub(core.worldx(), core.worldy()).limit(coreMargin + core.block().size*tilesize); - cons.accept(core.worldx() + Tmp.v1.x, core.worldy() + Tmp.v1.y, false); + if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){ + TileEntity firstCore = state.teams.playerCores().first(); + for(TileEntity core : state.rules.waveTeam.cores()){ + Tmp.v1.set(firstCore).sub(core.x, core.y).limit(coreMargin + core.block.size*tilesize); + cons.accept(core.x + Tmp.v1.x, core.y + Tmp.v1.y, false); } } } @@ -107,9 +107,9 @@ public class WaveSpawner{ cons.get(spawnX, spawnY); } - if(state.rules.attackMode && state.teams.isActive(waveTeam)){ - for(Tile core : state.teams.get(waveTeam).cores){ - cons.get(core.worldx(), core.worldy()); + if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam)){ + for(TileEntity core : state.teams.get(state.rules.waveTeam).cores){ + cons.get(core.x, core.y); } } } diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java similarity index 97% rename from core/src/io/anuke/mindustry/content/Blocks.java rename to core/src/mindustry/content/Blocks.java index f248dbab58..ecbeb7c1c8 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1,34 +1,34 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.defense.*; -import io.anuke.mindustry.world.blocks.defense.turrets.*; -import io.anuke.mindustry.world.blocks.distribution.*; -import io.anuke.mindustry.world.blocks.liquid.*; -import io.anuke.mindustry.world.blocks.logic.*; -import io.anuke.mindustry.world.blocks.power.*; -import io.anuke.mindustry.world.blocks.production.*; -import io.anuke.mindustry.world.blocks.sandbox.*; -import io.anuke.mindustry.world.blocks.storage.*; -import io.anuke.mindustry.world.blocks.units.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.modules.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.*; +import mindustry.ctype.*; +import mindustry.entities.*; +import mindustry.entities.bullet.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.defense.*; +import mindustry.world.blocks.defense.turrets.*; +import mindustry.world.blocks.distribution.*; +import mindustry.world.blocks.liquid.*; +import mindustry.world.blocks.logic.*; +import mindustry.world.blocks.power.*; +import mindustry.world.blocks.production.*; +import mindustry.world.blocks.sandbox.*; +import mindustry.world.blocks.storage.*; +import mindustry.world.blocks.units.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import mindustry.world.modules.*; public class Blocks implements ContentList{ public static Block @@ -49,7 +49,7 @@ public class Blocks implements ContentList{ melter, separator, sporePress, pulverizer, incinerator, coalCentrifuge, //sandbox - powerSource, powerVoid, itemSource, itemVoid, liquidSource, message, illuminator, + powerSource, powerVoid, itemSource, itemVoid, liquidSource, liquidVoid, message, illuminator, //defense copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, @@ -898,10 +898,11 @@ public class Blocks implements ContentList{ }}; junction = new Junction("junction"){{ - requirements(Category.distribution, ItemStack.with(Items.copper, 1), true); + requirements(Category.distribution, ItemStack.with(Items.copper, 2), true); speed = 26; capacity = 12; health = 30; + buildCostMultiplier = 6f; }}; itemBridge = new BufferedItemBridge("bridge-conveyor"){{ @@ -921,16 +922,18 @@ public class Blocks implements ContentList{ sorter = new Sorter("sorter"){{ requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2)); + buildCostMultiplier = 3f; }}; invertedSorter = new Sorter("inverted-sorter"){{ requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2)); + buildCostMultiplier = 3f; invert = true; }}; router = new Router("router"){{ requirements(Category.distribution, ItemStack.with(Items.copper, 3)); - + buildCostMultiplier = 2f; }}; distributor = new Router("distributor"){{ @@ -940,6 +943,7 @@ public class Blocks implements ContentList{ overflowGate = new OverflowGate("overflow-gate"){{ requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 4)); + buildCostMultiplier = 3f; }}; massDriver = new MassDriver("mass-driver"){{ @@ -1234,7 +1238,7 @@ public class Blocks implements ContentList{ //region storage coreShard = new CoreBlock("core-shard"){{ - requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000)); + requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with()); alwaysUnlocked = true; health = 1100; @@ -1243,7 +1247,7 @@ public class Blocks implements ContentList{ }}; coreFoundation = new CoreBlock("core-foundation"){{ - requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 400, Items.silicon, 3000)); + requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with()); health = 2000; itemCapacity = 9000; @@ -1251,7 +1255,7 @@ public class Blocks implements ContentList{ }}; coreNucleus = new CoreBlock("core-nucleus"){{ - requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000, Items.silicon, 2000, Items.surgealloy, 3000)); + requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with()); health = 4000; itemCapacity = 13000; @@ -1388,15 +1392,6 @@ public class Blocks implements ContentList{ range = 110f; health = 250 * size * size; shootSound = Sounds.splash; - - drawer = (tile, entity) -> { - Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); - - Draw.color(entity.liquids.current().color); - Draw.alpha(entity.liquids.total() / liquidCapacity); - Draw.rect(name + "-liquid", tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); - Draw.color(); - }; }}; lancer = new ChargeTurret("lancer"){{ @@ -1511,7 +1506,7 @@ public class Blocks implements ContentList{ } @Override - public void init(io.anuke.mindustry.entities.type.Bullet b){ + public void init(mindustry.entities.type.Bullet b){ 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); } @@ -1821,6 +1816,11 @@ public class Blocks implements ContentList{ alwaysUnlocked = true; }}; + liquidVoid = new LiquidVoid("liquid-void"){{ + requirements(Category.liquid, BuildVisibility.sandboxOnly, ItemStack.with()); + alwaysUnlocked = true; + }}; + message = new MessageBlock("message"){{ requirements(Category.effect, ItemStack.with(Items.graphite, 5)); }}; diff --git a/core/src/io/anuke/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java similarity index 97% rename from core/src/io/anuke/mindustry/content/Bullets.java rename to core/src/mindustry/content/Bullets.java index b3e23d966b..017798731c 100644 --- a/core/src/io/anuke/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.ctype.ContentList; +import mindustry.entities.*; +import mindustry.entities.bullet.*; +import mindustry.entities.effect.*; +import mindustry.entities.type.*; +import mindustry.graphics.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Bullets implements ContentList{ public static BulletType diff --git a/core/src/io/anuke/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java similarity index 98% rename from core/src/io/anuke/mindustry/content/Fx.java rename to core/src/mindustry/content/Fx.java index 4c31f0bd1a..a116034e1a 100644 --- a/core/src/io/anuke/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.effect.GroundEffectEntity.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Cicon; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.ctype.ContentList; +import mindustry.entities.Effects.*; +import mindustry.entities.effect.GroundEffectEntity.*; +import mindustry.entities.type.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.Cicon; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Fx implements ContentList{ public static Effect @@ -1079,6 +1079,7 @@ public class Fx implements ContentList{ healBlockFull = new Effect(20, e -> { Draw.color(e.color); Draw.alpha(e.fout()); + Fill.square(e.x, e.y, e.rotation * tilesize / 2f); }); overdriveBlockFull = new Effect(60, e -> { diff --git a/core/src/io/anuke/mindustry/content/Items.java b/core/src/mindustry/content/Items.java similarity index 93% rename from core/src/io/anuke/mindustry/content/Items.java rename to core/src/mindustry/content/Items.java index 77c88c651b..6269044786 100644 --- a/core/src/io/anuke/mindustry/content/Items.java +++ b/core/src/mindustry/content/Items.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.ItemType; +import arc.graphics.Color; +import mindustry.ctype.ContentList; +import mindustry.type.Item; +import mindustry.type.ItemType; public class Items implements ContentList{ public static Item scrap, copper, lead, graphite, coal, titanium, thorium, silicon, plastanium, phasefabric, surgealloy, diff --git a/core/src/io/anuke/mindustry/content/Liquids.java b/core/src/mindustry/content/Liquids.java similarity index 87% rename from core/src/io/anuke/mindustry/content/Liquids.java rename to core/src/mindustry/content/Liquids.java index bbc934cd16..56d3e481ab 100644 --- a/core/src/io/anuke/mindustry/content/Liquids.java +++ b/core/src/mindustry/content/Liquids.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.type.Liquid; +import arc.graphics.Color; +import mindustry.ctype.ContentList; +import mindustry.type.Liquid; public class Liquids implements ContentList{ public static Liquid water, slag, oil, cryofluid; diff --git a/core/src/mindustry/content/Loadouts.java b/core/src/mindustry/content/Loadouts.java new file mode 100644 index 0000000000..145da6120e --- /dev/null +++ b/core/src/mindustry/content/Loadouts.java @@ -0,0 +1,20 @@ +package mindustry.content; + +import mindustry.ctype.*; +import mindustry.game.*; + +public class Loadouts implements ContentList{ + public static Schematic + basicShard, + advancedShard, + basicFoundation, + basicNucleus; + + @Override + public void load(){ + basicShard = Schematics.readBase64("bXNjaAB4nD2K2wqAIBiD5ymibnoRn6YnEP1BwUMoBL19FuJ2sbFvUFgYZDaJsLeQrkinN9UJHImsNzlYE7WrIUastuSbnlKx2VJJt+8IQGGKdfO/8J5yrGJSMegLg+YUIA=="); + advancedShard = Schematics.readBase64("bXNjaAB4nD2LjQqAIAyET7OMIOhFfJqeYMxBgSkYCL199gu33fFtB4tOwUTaBCP5QpHFzwtl32DahBeKK1NwPq8hoOcUixwpY+CUxe3XIwBbB/pa6tadVCUP02hgHvp5vZq/0b7pBHPYFOQ="); + basicFoundation = Schematics.readBase64("bXNjaAB4nD1OSQ6DMBBzFhVu8BG+0X8MQyoiJTNSukj8nlCi2Adbtg/GA4OBF8oB00rvyE/9ykafqOIw58A7SWRKy1ZiShhZ5RcOLZhYS1hefQ1gRIeptH9jq/qW2lvc1d2tgWsOfVX/tOwE86AYBA=="); + basicNucleus = Schematics.readBase64("bXNjaAB4nD2MUQqAIBBEJy0s6qOLdJXuYNtCgikYBd2+LNmdj308hkGHtkId7M4YFns4mk/yfB4a48602eDI+mlNznu0FMPFd0wYKCaewl8F0EOueqM+yKSLVfJrNKWnSw/FZGzEGXFG9sy/px4gEBW1"); + } +} diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/mindustry/content/Mechs.java similarity index 95% rename from core/src/io/anuke/mindustry/content/Mechs.java rename to core/src/mindustry/content/Mechs.java index 8684dd268b..9bbb67d51a 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/mindustry/content/Mechs.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.*; +import mindustry.ctype.ContentList; +import mindustry.entities.*; +import mindustry.entities.bullet.*; +import mindustry.entities.effect.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; public class Mechs implements ContentList{ public static Mech alpha, delta, tau, omega, dart, javelin, trident, glaive; diff --git a/core/src/io/anuke/mindustry/content/StatusEffects.java b/core/src/mindustry/content/StatusEffects.java similarity index 88% rename from core/src/io/anuke/mindustry/content/StatusEffects.java rename to core/src/mindustry/content/StatusEffects.java index 4dc980869d..6672727847 100644 --- a/core/src/io/anuke/mindustry/content/StatusEffects.java +++ b/core/src/mindustry/content/StatusEffects.java @@ -1,13 +1,12 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.arc.*; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.type.StatusEffect; - -import static io.anuke.mindustry.Vars.waveTeam; +import arc.*; +import arc.math.Mathf; +import mindustry.entities.Effects; +import mindustry.ctype.ContentList; +import mindustry.game.EventType.*; +import mindustry.type.StatusEffect; +import static mindustry.Vars.*; public class StatusEffects implements ContentList{ public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked, corroded, boss; @@ -48,7 +47,7 @@ public class StatusEffects implements ContentList{ init(() -> { trans(shocked, ((unit, time, newTime, result) -> { unit.damage(20f); - if(unit.getTeam() == waveTeam){ + if(unit.getTeam() == state.rules.waveTeam){ Events.fire(Trigger.shock); } result.set(this, time); diff --git a/core/src/io/anuke/mindustry/content/TechTree.java b/core/src/mindustry/content/TechTree.java similarity index 97% rename from core/src/io/anuke/mindustry/content/TechTree.java rename to core/src/mindustry/content/TechTree.java index 8058a4982b..fb9207cdda 100644 --- a/core/src/io/anuke/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -1,11 +1,12 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.arc.collection.Array; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.world.Block; +import arc.math.*; +import arc.struct.*; +import mindustry.ctype.*; +import mindustry.type.*; +import mindustry.world.*; -import static io.anuke.mindustry.content.Blocks.*; +import static mindustry.content.Blocks.*; public class TechTree implements ContentList{ public static Array all; @@ -318,7 +319,7 @@ public class TechTree implements ContentList{ private static TechNode node(Block block, Runnable children){ ItemStack[] requirements = new ItemStack[block.requirements.length]; for(int i = 0; i < requirements.length; i++){ - requirements[i] = new ItemStack(block.requirements[i].item, 30 + block.requirements[i].amount * 6); + requirements[i] = new ItemStack(block.requirements[i].item, 40 + Mathf.round(Mathf.pow(block.requirements[i].amount, 1.25f) * 6, 10)); } return new TechNode(block, requirements, children); diff --git a/core/src/io/anuke/mindustry/content/TypeIDs.java b/core/src/mindustry/content/TypeIDs.java similarity index 52% rename from core/src/io/anuke/mindustry/content/TypeIDs.java rename to core/src/mindustry/content/TypeIDs.java index 2e3f6347b1..b99e321e98 100644 --- a/core/src/io/anuke/mindustry/content/TypeIDs.java +++ b/core/src/mindustry/content/TypeIDs.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.mindustry.entities.effect.Fire; -import io.anuke.mindustry.entities.effect.Puddle; -import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.type.TypeID; +import mindustry.entities.effect.Fire; +import mindustry.entities.effect.Puddle; +import mindustry.entities.type.Player; +import mindustry.ctype.ContentList; +import mindustry.type.TypeID; public class TypeIDs implements ContentList{ public static TypeID fire, puddle, player; diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java similarity index 96% rename from core/src/io/anuke/mindustry/content/UnitTypes.java rename to core/src/mindustry/content/UnitTypes.java index d6e1dd232a..1c5202ab46 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.arc.collection.*; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.entities.type.base.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; +import arc.struct.*; +import mindustry.ctype.ContentList; +import mindustry.entities.bullet.*; +import mindustry.entities.type.*; +import mindustry.entities.type.Bullet; +import mindustry.entities.type.base.*; +import mindustry.gen.*; +import mindustry.type.*; public class UnitTypes implements ContentList{ public static UnitType diff --git a/core/src/io/anuke/mindustry/content/Zones.java b/core/src/mindustry/content/Zones.java similarity index 95% rename from core/src/io/anuke/mindustry/content/Zones.java rename to core/src/mindustry/content/Zones.java index ae6598f60c..1bc988f955 100644 --- a/core/src/io/anuke/mindustry/content/Zones.java +++ b/core/src/mindustry/content/Zones.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.content; +package mindustry.content; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Objectives.*; -import io.anuke.mindustry.maps.generators.*; -import io.anuke.mindustry.maps.generators.MapGenerator.*; -import io.anuke.mindustry.maps.zonegen.*; -import io.anuke.mindustry.type.*; +import mindustry.ctype.ContentList; +import mindustry.game.*; +import mindustry.game.Objectives.*; +import mindustry.maps.generators.*; +import mindustry.maps.generators.MapGenerator.*; +import mindustry.maps.zonegen.*; +import mindustry.type.*; -import static io.anuke.arc.collection.Array.with; -import static io.anuke.mindustry.content.Items.*; -import static io.anuke.mindustry.type.ItemStack.list; +import static arc.struct.Array.with; +import static mindustry.content.Items.*; +import static mindustry.type.ItemStack.list; public class Zones implements ContentList{ public static Zone diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java similarity index 93% rename from core/src/io/anuke/mindustry/core/ContentLoader.java rename to core/src/mindustry/core/ContentLoader.java index 274139b206..dc1e21e917 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/mindustry/core/ContentLoader.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; +import mindustry.entities.bullet.*; +import mindustry.mod.Mods.*; +import mindustry.type.*; +import mindustry.world.*; -import static io.anuke.arc.Core.files; -import static io.anuke.mindustry.Vars.mods; +import static arc.Core.files; +import static mindustry.Vars.mods; /** * Loads all game content. diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/mindustry/core/Control.java similarity index 88% rename from core/src/io/anuke/mindustry/core/Control.java rename to core/src/mindustry/core/Control.java index 56dc35eb2c..7c86601bb3 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -1,36 +1,36 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.arc.*; -import io.anuke.arc.assets.*; -import io.anuke.arc.audio.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.dialogs.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.storage.*; +import arc.*; +import arc.assets.*; +import arc.audio.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.math.geom.*; +import arc.scene.ui.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.core.GameState.*; +import mindustry.entities.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.input.*; +import mindustry.maps.Map; +import mindustry.type.*; +import mindustry.ui.dialogs.*; +import mindustry.world.*; +import mindustry.world.blocks.storage.*; import java.io.*; import java.text.*; import java.util.*; -import static io.anuke.arc.Core.*; -import static io.anuke.mindustry.Vars.net; -import static io.anuke.mindustry.Vars.*; +import static arc.Core.*; +import static mindustry.Vars.net; +import static mindustry.Vars.*; /** * Control module. @@ -63,7 +63,7 @@ public class Control implements ApplicationListener, Loadable{ }); Events.on(PlayEvent.class, event -> { - player.setTeam(state.rules.pvp ? netServer.assignTeam(player, playerGroup.all()) : defaultTeam); + player.setTeam(netServer.assignTeam(player, playerGroup.all())); player.setDead(true); player.add(); @@ -256,9 +256,9 @@ public class Control implements ApplicationListener, Loadable{ world.loadGenerator(zone.generator); zone.rules.get(state.rules); state.rules.zone = zone; - for(Tile core : state.teams.get(defaultTeam).cores){ + for(TileEntity core : state.teams.playerCores()){ for(ItemStack stack : zone.getStartingItems()){ - core.entity.items.add(stack.item, stack.amount); + core.items.add(stack.item, stack.amount); } } state.set(State.playing); @@ -294,8 +294,8 @@ public class Control implements ApplicationListener, Loadable{ Geometry.circle(coreb.x, coreb.y, 10, (cx, cy) -> { Tile tile = world.ltile(cx, cy); - if(tile != null && tile.getTeam() == defaultTeam && !(tile.block() instanceof CoreBlock)){ - world.removeBlock(tile); + if(tile != null && tile.getTeam() == state.rules.defaultTeam && !(tile.block() instanceof CoreBlock)){ + tile.remove(); } }); @@ -305,13 +305,13 @@ public class Control implements ApplicationListener, Loadable{ zone.rules.get(state.rules); state.rules.zone = zone; - for(Tile core : state.teams.get(defaultTeam).cores){ + for(TileEntity core : state.teams.playerCores()){ for(ItemStack stack : zone.getStartingItems()){ - core.entity.items.add(stack.item, stack.amount); + core.items.add(stack.item, stack.amount); } } - Tile core = state.teams.get(defaultTeam).cores.first(); - core.entity.items.clear(); + TileEntity core = state.teams.playerCores().first(); + core.items.clear(); logic.play(); state.rules.waveTimer = false; @@ -434,9 +434,9 @@ public class Control implements ApplicationListener, Loadable{ input.update(); if(world.isZone()){ - for(Tile tile : state.teams.get(player.getTeam()).cores){ + for(TileEntity tile : state.teams.cores(player.getTeam())){ for(Item item : content.items()){ - if(tile.entity != null && tile.entity.items.has(item)){ + if(tile.items.has(item)){ data.unlockContent(item); } } @@ -456,7 +456,7 @@ public class Control implements ApplicationListener, Loadable{ state.set(state.is(State.playing) ? State.paused : State.playing); } - if(Core.input.keyTap(Binding.menu) && !ui.restart.isShown()){ + if(Core.input.keyTap(Binding.menu) && !ui.restart.isShown() && !ui.minimapfrag.shown()){ if(ui.chatfrag.shown()){ ui.chatfrag.hide(); }else if(!ui.paused.isShown() && !scene.hasDialog()){ diff --git a/core/src/io/anuke/mindustry/core/FileTree.java b/core/src/mindustry/core/FileTree.java similarity index 82% rename from core/src/io/anuke/mindustry/core/FileTree.java rename to core/src/mindustry/core/FileTree.java index cd201c5337..810b9669fb 100644 --- a/core/src/io/anuke/mindustry/core/FileTree.java +++ b/core/src/mindustry/core/FileTree.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.arc.*; -import io.anuke.arc.assets.loaders.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; +import arc.*; +import arc.assets.loaders.*; +import arc.struct.*; +import arc.files.*; /** Handles files in a modded context. */ public class FileTree implements FileHandleResolver{ diff --git a/core/src/io/anuke/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java similarity index 72% rename from core/src/io/anuke/mindustry/core/GameState.java rename to core/src/mindustry/core/GameState.java index 0e1c7a2d4b..2b233789eb 100644 --- a/core/src/io/anuke/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -1,12 +1,11 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.arc.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.base.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; +import arc.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.game.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class GameState{ /** Current wave number, can be anything in non-wave modes. */ @@ -26,12 +25,8 @@ public class GameState{ /** Current game state. */ private State state = State.menu; - public int enemies(){ - return net.client() ? enemies : unitGroups[waveTeam.ordinal()].count(b -> !(b instanceof BaseDrone)); - } - public BaseUnit boss(){ - return unitGroups[waveTeam.ordinal()].find(BaseUnit::isBoss); + return unitGroup.find(u -> u.isBoss() && u.getTeam() == rules.waveTeam); } public void set(State astate){ diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java similarity index 72% rename from core/src/io/anuke/mindustry/core/Logic.java rename to core/src/mindustry/core/Logic.java index 69c667e625..4e1e4a5c29 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -1,26 +1,26 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Teams.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.BuildBlock.*; -import io.anuke.mindustry.world.blocks.power.*; +import arc.*; +import arc.util.*; +import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.core.GameState.*; +import mindustry.ctype.*; +import mindustry.entities.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.game.Teams.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.power.*; import java.util.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** * Logic module. @@ -47,8 +47,8 @@ public class Logic implements ApplicationListener{ //blocks that get broken are appended to the team's broken block queue Tile tile = event.tile; Block block = tile.block(); - //skip null entities or nukes, for obvious reasons - if(tile.entity == null || tile.block() instanceof NuclearReactor) return; + //skip null entities or un-rebuildables, for obvious reasons; also skip client since they can't modify these requests + if(tile.entity == null || !tile.block().rebuildable || net.client()) return; if(block instanceof BuildBlock){ @@ -107,9 +107,9 @@ public class Logic implements ApplicationListener{ //add starting items if(!world.isZone()){ - for(Team team : Team.all){ - if(!state.teams.get(team).cores.isEmpty()){ - TileEntity entity = state.teams.get(team).cores.first().entity; + for(TeamData team : state.teams.getActive()){ + if(team.hasCore()){ + TileEntity entity = team.core(); entity.items.clear(); for(ItemStack stack : state.rules.loadout){ entity.items.add(stack.item, stack.amount); @@ -143,23 +143,23 @@ public class Logic implements ApplicationListener{ } private void checkGameOver(){ - if(!state.rules.attackMode && state.teams.get(defaultTeam).cores.size == 0 && !state.gameOver){ + if(!state.rules.attackMode && state.teams.playerCores().size == 0 && !state.gameOver){ state.gameOver = true; - Events.fire(new GameOverEvent(waveTeam)); + Events.fire(new GameOverEvent(state.rules.waveTeam)); }else if(state.rules.attackMode){ Team alive = null; - for(Team team : Team.all){ - if(state.teams.get(team).cores.size > 0){ + for(TeamData team : state.teams.getActive()){ + if(team.hasCore()){ if(alive != null){ return; } - alive = team; + alive = team.team; } } if(alive != null && !state.gameOver){ - if(world.isZone() && alive == defaultTeam){ + if(world.isZone() && alive == state.rules.defaultTeam){ //in attack maps, a victorious game over is equivalent to a launch Call.launchZone(); }else{ @@ -176,7 +176,7 @@ public class Logic implements ApplicationListener{ ui.hudfrag.showLaunch(); } - for(Tile tile : state.teams.get(defaultTeam).cores){ + for(TileEntity tile : state.teams.playerCores()){ Effects.effect(Fx.launch, tile); } @@ -185,19 +185,18 @@ public class Logic implements ApplicationListener{ } Time.runTask(30f, () -> { - for(Tile tile : state.teams.get(defaultTeam).cores){ + for(TileEntity entity : state.teams.playerCores()){ for(Item item : content.items()){ - if(tile == null || tile.entity == null || tile.entity.items == null) continue; - data.addItem(item, tile.entity.items.get(item)); - Events.fire(new LaunchItemEvent(item, tile.entity.items.get(item))); + data.addItem(item, entity.items.get(item)); + Events.fire(new LaunchItemEvent(item, entity.items.get(item))); } - world.removeBlock(tile); + entity.tile.remove(); } state.launched = true; state.gameOver = true; Events.fire(new LaunchEvent()); //manually fire game over event now - Events.fire(new GameOverEvent(defaultTeam)); + Events.fire(new GameOverEvent(state.rules.defaultTeam)); }); } @@ -210,14 +209,18 @@ public class Logic implements ApplicationListener{ @Override public void update(){ + Events.fire(Trigger.update); if(!state.is(State.menu)){ + if(!net.client()){ + state.enemies = unitGroup.count(b -> b.getTeam() == state.rules.waveTeam && b.countsAsEnemy()); + } if(!state.isPaused()){ Time.update(); if(state.rules.waves && state.rules.waveTimer && !state.gameOver){ - if(!state.rules.waitForWaveToEnd || unitGroups[waveTeam.ordinal()].size() == 0){ + if(!state.rules.waitForWaveToEnd || state.enemies == 0){ state.wavetime = Math.max(state.wavetime - Time.delta(), 0); } } @@ -232,20 +235,15 @@ public class Logic implements ApplicationListener{ } if(!state.isEditor()){ - for(EntityGroup group : unitGroups){ - group.update(); - } - + unitGroup.update(); puddleGroup.update(); shieldGroup.update(); bulletGroup.update(); tileGroup.update(); fireGroup.update(); }else{ - for(EntityGroup group : unitGroups){ - group.updateEvents(); - collisions.updatePhysics(group); - } + unitGroup.updateEvents(); + collisions.updatePhysics(unitGroup); } @@ -257,17 +255,13 @@ public class Logic implements ApplicationListener{ } if(!state.isEditor()){ - - for(EntityGroup group : unitGroups){ - if(group.isEmpty()) continue; - collisions.collideGroups(bulletGroup, group); - } - + //bulletGroup + collisions.collideGroups(bulletGroup, unitGroup); collisions.collideGroups(bulletGroup, playerGroup); } } - if(!net.client() && !world.isInvalidMap() && !state.isEditor()){ + if(!net.client() && !world.isInvalidMap() && !state.isEditor() && state.rules.canGameOver){ checkGameOver(); } } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java similarity index 93% rename from core/src/io/anuke/mindustry/core/NetClient.java rename to core/src/mindustry/core/NetClient.java index 6a0f0428e3..8c12884472 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -1,36 +1,36 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.CommandHandler.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.io.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.Administration.*; -import io.anuke.mindustry.net.Net.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.type.TypeID; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.modules.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.graphics.*; +import arc.math.*; +import arc.util.CommandHandler.*; +import arc.util.*; +import arc.util.io.*; +import arc.util.serialization.*; +import mindustry.*; +import mindustry.core.GameState.*; +import mindustry.ctype.ContentType; +import mindustry.entities.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.net.Administration.*; +import mindustry.net.Net.*; +import mindustry.net.*; +import mindustry.net.Packets.*; +import mindustry.type.TypeID; +import mindustry.world.*; +import mindustry.world.modules.*; import java.io.*; import java.util.zip.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class NetClient implements ApplicationListener{ private final static float dataTimeout = 60 * 18; @@ -160,9 +160,17 @@ public class NetClient implements ApplicationListener{ throw new ValidateException(player, "Player has sent a message above the text limit."); } + Events.fire(new PlayerChatEvent(player, message)); + //check if it's a command CommandResponse response = netServer.clientCommands.handleMessage(message, player); if(response.type == ResponseType.noCommand){ //no command to handle + message = netServer.admins.filterMessage(player, message); + //supress chat message if it's filtered out + if(message == null){ + return; + } + //server console logging Log.info("&y{0}: &lb{1}", player.name, message); @@ -189,8 +197,6 @@ public class NetClient implements ApplicationListener{ player.sendMessage(text); } } - - Events.fire(new PlayerChatEvent(player, message)); } public static String colorizeName(int id, String name){ @@ -507,7 +513,7 @@ public class NetClient implements ApplicationListener{ return Core.settings.getString("usid-" + ip, null); }else{ byte[] bytes = new byte[8]; - new RandomXS128().nextBytes(bytes); + new Rand().nextBytes(bytes); String result = new String(Base64Coder.encode(bytes)); Core.settings.put("usid-" + ip, result); Core.settings.save(); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java similarity index 88% rename from core/src/io/anuke/mindustry/core/NetServer.java rename to core/src/mindustry/core/NetServer.java index 218cbd2d83..9fead5492b 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -1,44 +1,66 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.CommandHandler.*; -import io.anuke.arc.util.io.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.net.Administration.*; -import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.graphics.*; +import arc.math.*; +import arc.math.geom.*; +import arc.struct.*; +import arc.util.*; +import arc.util.CommandHandler.*; +import arc.util.io.*; +import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.core.GameState.*; +import mindustry.entities.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.net.Administration; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.game.Teams.*; +import mindustry.gen.*; +import mindustry.net.*; +import mindustry.net.Administration.*; +import mindustry.net.Packets.*; +import mindustry.world.*; +import mindustry.world.blocks.storage.CoreBlock.*; import java.io.*; +import java.net.*; import java.nio.*; import java.util.zip.*; -import static io.anuke.mindustry.Vars.*; +import static arc.util.Log.*; +import static mindustry.Vars.*; public class NetServer implements ApplicationListener{ private final static int maxSnapshotSize = 430, timerBlockSync = 0; - private final static float serverSyncTime = 12, kickDuration = 30 * 1000, blockSyncTime = 60 * 10; - private final static Vector2 vector = new Vector2(); - private final static Rectangle viewport = new Rectangle(); + private final static float serverSyncTime = 12, blockSyncTime = 60 * 8; + private final static Vec2 vector = new Vec2(); + private final static Rect viewport = new Rect(); /** If a player goes away of their server-side coordinates by this distance, they get teleported back. */ private final static float correctDist = 16f; public final Administration admins = new Administration(); public final CommandHandler clientCommands = new CommandHandler("/"); + public TeamAssigner assigner = (player, players) -> { + if(state.rules.pvp){ + //find team with minimum amount of players and auto-assign player to that. + TeamData re = state.teams.getActive().min(data -> { + int count = 0; + for(Player other : players){ + if(other.getTeam() == data.team && other != player){ + count++; + } + } + return count; + }); + return re == null ? null : re.team; + } + + return state.rules.defaultTeam; + }; private boolean closing = false; private Interval timer = new Interval(); @@ -54,7 +76,7 @@ public class NetServer implements ApplicationListener{ public NetServer(){ net.handleServer(Connect.class, (con, connect) -> { - if(admins.isIPBanned(connect.addressTCP)){ + if(admins.isIPBanned(connect.addressTCP) || admins.isSubnetBanned(connect.addressTCP)){ con.kick(KickReason.banned); } }); @@ -72,7 +94,7 @@ public class NetServer implements ApplicationListener{ String uuid = packet.uuid; - if(admins.isIPBanned(con.address)) return; + if(admins.isIPBanned(con.address) || admins.isSubnetBanned(con.address)) return; if(con.hasBegunConnecting){ con.kick(KickReason.idInUse); @@ -94,7 +116,7 @@ public class NetServer implements ApplicationListener{ return; } - if(Time.millis() - info.lastKicked < kickDuration){ + if(Time.millis() < info.lastKicked){ con.kick(KickReason.recentKick); return; } @@ -197,10 +219,7 @@ public class NetServer implements ApplicationListener{ con.player = player; //playing in pvp mode automatically assigns players to teams - if(state.rules.pvp){ - player.setTeam(assignTeam(player, playerGroup.all())); - Log.info("Auto-assigned player {0} to team {1}.", player.name, player.getTeam()); - } + player.setTeam(assignTeam(player, playerGroup.all())); sendWorldData(player); @@ -303,6 +322,11 @@ public class NetServer implements ApplicationListener{ VoteSession[] currentlyKicking = {null}; clientCommands.register("votekick", "[player...]", "Vote to kick a player, with a cooldown.", (args, player) -> { + if(!Config.enableVotekick.bool()){ + player.sendMessage("[scarlet]Vote-kick is disabled on this server."); + return; + } + if(playerGroup.size() < 3){ player.sendMessage("[scarlet]At least 3 players are needed to start a votekick."); return; @@ -390,6 +414,12 @@ public class NetServer implements ApplicationListener{ if(player.isLocal){ player.sendMessage("[scarlet]Re-synchronizing as the host is pointless."); }else{ + if(Time.timeSinceMillis(player.getInfo().lastSyncTime) < 1000 * 5){ + player.sendMessage("[scarlet]You may only /sync every 5 seconds."); + return; + } + + player.getInfo().lastSyncTime = Time.millis(); Call.onWorldDataBegin(player.con); netServer.sendWorldData(player); } @@ -401,19 +431,7 @@ public class NetServer implements ApplicationListener{ } public Team assignTeam(Player current, Iterable players){ - //find team with minimum amount of players and auto-assign player to that. - return Structs.findMin(Team.all, team -> { - if(state.teams.isActive(team) && !state.teams.get(team).cores.isEmpty()){ - int count = 0; - for(Player other : players){ - if(other.getTeam() == team && other != current){ - count++; - } - } - return count; - } - return Integer.MAX_VALUE; - }); + return assigner.assign(current, players); } public void sendWorldData(Player player){ @@ -437,7 +455,7 @@ public class NetServer implements ApplicationListener{ if(!player.con.hasDisconnected){ if(player.con.hasConnected){ Events.fire(new PlayerLeave(player)); - Call.sendMessage("[accent]" + player.name + "[accent] has disconnected."); + if(Config.showConnectMessages.bool()) Call.sendMessage("[accent]" + player.name + "[accent] has disconnected."); Call.onPlayerDisconnect(player.id); } @@ -575,17 +593,21 @@ public class NetServer implements ApplicationListener{ player.add(); player.con.hasConnected = true; - Call.sendMessage("[accent]" + player.name + "[accent] has connected."); + if(Config.showConnectMessages.bool()) Call.sendMessage("[accent]" + player.name + "[accent] has connected."); Log.info("&lm[{1}] &y{0} has connected. ", player.name, player.uuid); + if(!Config.motd.string().equalsIgnoreCase("off")){ + player.sendMessage(Config.motd.string()); + } + Events.fire(new PlayerJoin(player)); } public boolean isWaitingForPlayers(){ if(state.rules.pvp){ int used = 0; - for(Team t : Team.all){ - if(playerGroup.count(p -> p.getTeam() == t) > 0){ + for(TeamData t : state.teams.getActive()){ + if(playerGroup.count(p -> p.getTeam() == t.team) > 0){ used++; } } @@ -594,6 +616,7 @@ public class NetServer implements ApplicationListener{ return false; } + @Override public void update(){ if(!headless && !closing && net.server() && state.is(State.menu)){ @@ -611,6 +634,20 @@ public class NetServer implements ApplicationListener{ } } + /** Should only be used on the headless backend. */ + public void openServer(){ + try{ + net.host(Config.port.num()); + info("&lcOpened a server on port {0}.", Config.port.num()); + }catch(BindException e){ + Log.err("Unable to host: Port already in use! Make sure no other servers are running on the same port in your network."); + state.set(State.menu); + }catch(IOException e){ + err(e); + state.set(State.menu); + } + } + public void kickAll(KickReason reason){ for(NetConnection con : net.getConnections()){ con.kick(reason); @@ -647,20 +684,20 @@ public class NetServer implements ApplicationListener{ public void writeEntitySnapshot(Player player) throws IOException{ syncStream.reset(); - ObjectSet cores = state.teams.get(player.getTeam()).cores; + Array cores = state.teams.cores(player.getTeam()); dataStream.writeByte(cores.size); - for(Tile tile : cores){ - dataStream.writeInt(tile.pos()); - tile.entity.items.write(dataStream); + for(CoreEntity entity : cores){ + dataStream.writeInt(entity.tile.pos()); + entity.items.write(dataStream); } dataStream.close(); byte[] stateBytes = syncStream.toByteArray(); //write basic state data. - Call.onStateSnapshot(player.con, 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); @@ -784,4 +821,8 @@ public class NetServer implements ApplicationListener{ e.printStackTrace(); } } + + public interface TeamAssigner{ + Team assign(Player player, Iterable players); + } } diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/mindustry/core/Platform.java similarity index 86% rename from core/src/io/anuke/mindustry/core/Platform.java rename to core/src/mindustry/core/Platform.java index 0cfb72a058..fda4ea4564 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/mindustry/core/Platform.java @@ -1,21 +1,21 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.arc.*; -import io.anuke.arc.Input.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.mod.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.net.Net.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.dialogs.*; +import arc.*; +import arc.Input.*; +import arc.struct.*; +import arc.files.*; +import arc.func.*; +import arc.math.*; +import arc.scene.ui.*; +import arc.util.serialization.*; +import mindustry.mod.*; +import mindustry.net.*; +import mindustry.net.Net.*; +import mindustry.type.*; +import mindustry.ui.dialogs.*; import org.mozilla.javascript.*; -import static io.anuke.mindustry.Vars.mobile; +import static mindustry.Vars.mobile; public interface Platform{ @@ -90,7 +90,7 @@ public interface Platform{ String uuid = Core.settings.getString("uuid", ""); if(uuid.isEmpty()){ byte[] result = new byte[8]; - new RandomXS128().nextBytes(result); + new Rand().nextBytes(result); uuid = new String(Base64Coder.encode(result)); Core.settings.put("uuid", uuid); Core.settings.save(); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java similarity index 80% rename from core/src/io/anuke/mindustry/core/Renderer.java rename to core/src/mindustry/core/Renderer.java index c8cf2b1063..7d5e6714b5 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -1,32 +1,31 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.arc.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.glutils.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.effect.GroundEffectEntity.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.blocks.defense.ForceProjector.*; +import arc.*; +import arc.files.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.graphics.gl.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.pooling.*; +import mindustry.content.*; +import mindustry.core.GameState.*; +import mindustry.entities.*; +import mindustry.entities.effect.*; +import mindustry.entities.effect.GroundEffectEntity.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.graphics.*; +import mindustry.input.*; +import mindustry.ui.*; +import mindustry.world.blocks.defense.ForceProjector.*; -import static io.anuke.arc.Core.*; -import static io.anuke.mindustry.Vars.*; +import static arc.Core.*; +import static mindustry.Vars.*; public class Renderer implements ApplicationListener{ public final BlockRenderer blocks = new BlockRenderer(); @@ -42,7 +41,7 @@ public class Renderer implements ApplicationListener{ 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 Rect rect = new Rect(), rect2 = new Rect(); private float shakeIntensity, shaketime; public Renderer(){ @@ -57,8 +56,8 @@ public class Renderer implements ApplicationListener{ Effects.setEffectProvider((effect, color, x, y, rotation, data) -> { if(effect == Fx.none) return; if(Core.settings.getBool("effects")){ - Rectangle view = camera.bounds(rect); - Rectangle pos = rect2.setSize(effect.size).setCenter(x, y); + Rect view = camera.bounds(rect); + Rect pos = rect2.setSize(effect.size).setCenter(x, y); if(view.overlaps(pos)){ @@ -120,16 +119,18 @@ public class Renderer implements ApplicationListener{ landTime = 0f; graphics.clear(Color.black); }else{ - Vector2 position = Tmp.v3.set(player); + Vec2 position = Tmp.v3.set(player); if(player.isDead()){ TileEntity core = player.getClosestCore(); - if(core != null && player.spawner == null){ - camera.position.lerpDelta(core.x, core.y, 0.08f); - }else{ - camera.position.lerpDelta(position, 0.08f); + if(core != null){ + if(player.spawner == null){ + camera.position.lerpDelta(core.x, core.y, 0.08f); + }else{ + camera.position.lerpDelta(position, 0.08f); + } } - }else if(control.input instanceof DesktopInput){ + }else if(control.input instanceof DesktopInput && !state.isPaused()){ camera.position.lerpDelta(position, 0.08f); } @@ -344,11 +345,7 @@ public class Renderer implements ApplicationListener{ Draw.rect("circle-shadow", u.x, u.y, size * rad, size * rad); }; - for(EntityGroup group : unitGroups){ - if(!group.isEmpty()){ - group.draw(unit -> !unit.isDead(), draw::get); - } - } + unitGroup.draw(unit -> !unit.isDead(), draw::get); if(!playerGroup.isEmpty()){ playerGroup.draw(unit -> !unit.isDead(), draw::get); @@ -361,34 +358,21 @@ public class Renderer implements ApplicationListener{ float trnsX = -12, trnsY = -13; Draw.color(0, 0, 0, 0.22f); - for(EntityGroup group : unitGroups){ - if(!group.isEmpty()){ - group.draw(unit -> unit.isFlying() && !unit.isDead(), baseUnit -> baseUnit.drawShadow(trnsX, trnsY)); - } - } - - if(!playerGroup.isEmpty()){ - playerGroup.draw(unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY)); - } + unitGroup.draw(unit -> unit.isFlying() && !unit.isDead(), baseUnit -> baseUnit.drawShadow(trnsX, trnsY)); + playerGroup.draw(unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY)); Draw.color(); } private void drawAllTeams(boolean flying){ - for(Team team : Team.all){ - EntityGroup group = unitGroups[team.ordinal()]; + unitGroup.draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder); + playerGroup.draw(p -> p.isFlying() == flying && !p.isDead(), Unit::drawUnder); - if(group.count(p -> p.isFlying() == flying) + playerGroup.count(p -> p.isFlying() == flying && p.getTeam() == team) == 0 && flying) continue; + unitGroup.draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll); + playerGroup.draw(p -> p.isFlying() == flying, Unit::drawAll); - unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder); - playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder); - - unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll); - playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll); - - unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver); - playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver); - } + unitGroup.draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver); + playerGroup.draw(p -> p.isFlying() == flying, Unit::drawOver); } public void scaleCamera(float amount){ diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/mindustry/core/UI.java similarity index 91% rename from core/src/io/anuke/mindustry/core/UI.java rename to core/src/mindustry/core/UI.java index 9b0af80f52..f1b578cc9c 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -1,48 +1,49 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.arc.*; -import io.anuke.arc.Graphics.*; -import io.anuke.arc.Graphics.Cursor.*; -import io.anuke.arc.Input.*; -import io.anuke.arc.assets.*; -import io.anuke.arc.assets.loaders.*; -import io.anuke.arc.assets.loaders.resolvers.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.freetype.*; -import io.anuke.arc.freetype.FreeTypeFontGenerator.*; -import io.anuke.arc.freetype.FreetypeFontLoader.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Texture.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.actions.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.TextField.*; -import io.anuke.arc.scene.ui.Tooltip.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.editor.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.dialogs.*; -import io.anuke.mindustry.ui.fragments.*; +import arc.*; +import arc.Graphics.*; +import arc.Graphics.Cursor.*; +import arc.Input.*; +import arc.assets.*; +import arc.assets.loaders.*; +import arc.assets.loaders.resolvers.*; +import arc.struct.*; +import arc.files.*; +import arc.freetype.*; +import arc.freetype.FreeTypeFontGenerator.*; +import arc.freetype.FreetypeFontLoader.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.Texture.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.math.*; +import arc.scene.*; +import arc.scene.actions.*; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.TextField.*; +import arc.scene.ui.Tooltip.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.core.GameState.*; +import mindustry.editor.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.ui.dialogs.*; +import mindustry.ui.fragments.*; -import static io.anuke.arc.scene.actions.Actions.*; -import static io.anuke.mindustry.Vars.*; +import static arc.scene.actions.Actions.*; +import static mindustry.Vars.*; public class UI implements ApplicationListener, Loadable{ public MenuFragment menufrag; public HudFragment hudfrag; public ChatFragment chatfrag; public ScriptConsoleFragment scriptfrag; + public MinimapFragment minimapfrag; public PlayerListFragment listfrag; public LoadingFragment loadfrag; @@ -68,7 +69,7 @@ public class UI implements ApplicationListener, Loadable{ public ContentInfoDialog content; public DeployDialog deploy; public TechTreeDialog tech; - public MinimapDialog minimap; + //public MinimapDialog minimap; public SchematicsDialog schematics; public ModsDialog mods; public ColorPicker picker; @@ -210,6 +211,7 @@ public class UI implements ApplicationListener, Loadable{ menufrag = new MenuFragment(); hudfrag = new HudFragment(); chatfrag = new ChatFragment(); + minimapfrag = new MinimapFragment(); listfrag = new PlayerListFragment(); loadfrag = new LoadingFragment(); scriptfrag = new ScriptConsoleFragment(); @@ -235,7 +237,6 @@ public class UI implements ApplicationListener, Loadable{ content = new ContentInfoDialog(); deploy = new DeployDialog(); tech = new TechTreeDialog(); - minimap = new MinimapDialog(); mods = new ModsDialog(); schematics = new SchematicsDialog(); @@ -254,6 +255,7 @@ public class UI implements ApplicationListener, Loadable{ hudfrag.build(hudGroup); menufrag.build(menuGroup); chatfrag.container().build(hudGroup); + minimapfrag.build(hudGroup); listfrag.build(hudGroup); scriptfrag.container().build(hudGroup); loadfrag.build(group); @@ -305,7 +307,19 @@ public class UI implements ApplicationListener, Loadable{ hide(); }).disabled(b -> field.getText().isEmpty()); buttons.addButton("$cancel", this::hide); - }}.show(); + keyDown(KeyCode.ENTER, () -> { + String text = field.getText(); + if(!text.isEmpty()){ + confirmed.get(text); + hide(); + } + }); + keyDown(KeyCode.ESCAPE, this::hide); + keyDown(KeyCode.BACK, this::hide); + show(); + Core.scene.setKeyboardFocus(field); + field.setCursorPosition(def.length()); + }}; } } diff --git a/core/src/io/anuke/mindustry/core/Version.java b/core/src/mindustry/core/Version.java similarity index 84% rename from core/src/io/anuke/mindustry/core/Version.java rename to core/src/mindustry/core/Version.java index a6ff7ea6a9..08a105d8fb 100644 --- a/core/src/io/anuke/mindustry/core/Version.java +++ b/core/src/mindustry/core/Version.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.arc.*; -import io.anuke.arc.Files.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.io.*; +import arc.*; +import arc.Files.*; +import arc.struct.*; +import arc.files.*; +import arc.util.*; +import arc.util.io.*; public class Version{ /** Build type. 'official' for official releases; 'custom' or 'bleeding edge' are also used. */ - public static String type; + public static String type = "unknown"; /** Build modifier, e.g. 'alpha' or 'release' */ - public static String modifier; + public static String modifier = "unknown"; /** Number specifying the major version, e.g. '4' */ public static int number; /** Build number, e.g. '43'. set to '-1' for custom builds. */ diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/mindustry/core/World.java similarity index 83% rename from core/src/io/anuke/mindustry/core/World.java rename to core/src/mindustry/core/World.java index 869338ffc7..bbc3f4074c 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -1,25 +1,25 @@ -package io.anuke.mindustry.core; +package mindustry.core; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.maps.filters.*; -import io.anuke.mindustry.maps.filters.GenerateFilter.*; -import io.anuke.mindustry.maps.generators.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.*; +import arc.math.*; +import arc.math.geom.*; +import arc.struct.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.core.GameState.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.game.Teams.*; +import mindustry.io.*; +import mindustry.maps.*; +import mindustry.maps.filters.*; +import mindustry.maps.filters.GenerateFilter.*; +import mindustry.maps.generators.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class World{ public final Context context = new Context(); @@ -217,7 +217,7 @@ public class World{ public void loadMap(Map map, Rules checkRules){ try{ SaveIO.load(map.file, new FilterContext(map)); - }catch(Exception e){ + }catch(Throwable e){ Log.err(e); if(!headless){ ui.showErrorMessage("$map.invalid"); @@ -233,33 +233,22 @@ public class World{ invalidMap = false; if(!headless){ - if(state.teams.get(defaultTeam).cores.size == 0 && !checkRules.pvp){ + if(state.teams.playerCores().size == 0 && !checkRules.pvp){ ui.showErrorMessage("$map.nospawn"); invalidMap = true; }else if(checkRules.pvp){ //pvp maps need two cores to be valid - int teams = 0; - for(Team team : Team.all){ - if(state.teams.get(team).cores.size != 0){ - teams ++; - } - } - if(teams < 2){ + if(state.teams.getActive().count(TeamData::hasCore) < 2){ invalidMap = true; ui.showErrorMessage("$map.nospawn.pvp"); } }else if(checkRules.attackMode){ //attack maps need two cores to be valid - invalidMap = state.teams.get(waveTeam).cores.isEmpty(); + invalidMap = state.teams.get(state.rules.waveTeam).noCores(); if(invalidMap){ ui.showErrorMessage("$map.nospawn.attack"); } } }else{ - invalidMap = true; - for(Team team : Team.all){ - if(state.teams.get(team).cores.size != 0){ - invalidMap = false; - } - } + invalidMap = !state.teams.getActive().contains(TeamData::hasCore); if(invalidMap){ throw new MapException(map, "Map has no cores!"); @@ -275,36 +264,6 @@ public class World{ } } - public void removeBlock(Tile tile){ - if(tile == null) return; - tile.link().getLinkedTiles(other -> other.setBlock(Blocks.air)); - } - - public void setBlock(Tile tile, Block block, Team team){ - setBlock(tile, block, team, 0); - } - - public void setBlock(Tile tile, Block block, Team team, int rotation){ - tile.setBlock(block, team, rotation); - if(block.isMultiblock()){ - int offsetx = -(block.size - 1) / 2; - int offsety = -(block.size - 1) / 2; - - for(int dx = 0; dx < block.size; dx++){ - for(int dy = 0; dy < block.size; dy++){ - int worldx = dx + offsetx + tile.x; - int worldy = dy + offsety + tile.y; - if(!(worldx == tile.x && worldy == tile.y)){ - Tile toplace = world.tile(worldx, worldy); - if(toplace != null){ - toplace.setBlock(BlockPart.get(dx + offsetx, dy + offsety), team); - } - } - } - } - } - } - public void raycastEachWorld(float x0, float y0, float x1, float y1, Raycaster cons){ raycastEach(toTile(x0), toTile(y0), toTile(x1), toTile(y1), cons); } diff --git a/core/src/io/anuke/mindustry/ctype/Content.java b/core/src/mindustry/ctype/Content.java similarity index 82% rename from core/src/io/anuke/mindustry/ctype/Content.java rename to core/src/mindustry/ctype/Content.java index 09a304817d..382d1a22ab 100644 --- a/core/src/io/anuke/mindustry/ctype/Content.java +++ b/core/src/mindustry/ctype/Content.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.ctype; +package mindustry.ctype; -import io.anuke.arc.files.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.mod.Mods.*; +import arc.files.*; +import arc.util.ArcAnnotate.*; +import mindustry.*; +import mindustry.mod.Mods.*; -/** Base class for a content type that is loaded in {@link io.anuke.mindustry.core.ContentLoader}. */ +/** Base class for a content type that is loaded in {@link mindustry.core.ContentLoader}. */ public abstract class Content implements Comparable{ public final short id; /** Info on which mod this content was loaded from. */ @@ -14,7 +14,7 @@ public abstract class Content implements Comparable{ public Content(){ - this.id = (short)Vars.content.getBy(getContentType()).size; + this.id = (short) Vars.content.getBy(getContentType()).size; Vars.content.handleContent(this); } diff --git a/core/src/mindustry/ctype/ContentList.java b/core/src/mindustry/ctype/ContentList.java new file mode 100644 index 0000000000..efe1588f31 --- /dev/null +++ b/core/src/mindustry/ctype/ContentList.java @@ -0,0 +1,7 @@ +package mindustry.ctype; + +/** Interface for a list of content to be loaded in {@link mindustry.core.ContentLoader}. */ +public interface ContentList{ + /** This method should create all the content. */ + void load(); +} diff --git a/core/src/io/anuke/mindustry/ctype/ContentType.java b/core/src/mindustry/ctype/ContentType.java similarity index 88% rename from core/src/io/anuke/mindustry/ctype/ContentType.java rename to core/src/mindustry/ctype/ContentType.java index 5b2e1bdb3b..05c70484e3 100644 --- a/core/src/io/anuke/mindustry/ctype/ContentType.java +++ b/core/src/mindustry/ctype/ContentType.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.ctype; +package mindustry.ctype; /** Do not rearrange, ever! */ public enum ContentType{ diff --git a/core/src/io/anuke/mindustry/ctype/MappableContent.java b/core/src/mindustry/ctype/MappableContent.java similarity index 83% rename from core/src/io/anuke/mindustry/ctype/MappableContent.java rename to core/src/mindustry/ctype/MappableContent.java index 709e7652d4..11a72651a5 100644 --- a/core/src/io/anuke/mindustry/ctype/MappableContent.java +++ b/core/src/mindustry/ctype/MappableContent.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.ctype; +package mindustry.ctype; -import io.anuke.mindustry.*; +import mindustry.*; public abstract class MappableContent extends Content{ public final String name; diff --git a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java similarity index 85% rename from core/src/io/anuke/mindustry/ctype/UnlockableContent.java rename to core/src/mindustry/ctype/UnlockableContent.java index ab1e4d9e4b..af194377bf 100644 --- a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.ctype; +package mindustry.ctype; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.Cicon; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.graphics.g2d.*; +import arc.scene.ui.layout.*; +import mindustry.*; +import mindustry.graphics.*; +import mindustry.ui.Cicon; /** Base interface for an unlockable content type. */ public abstract class UnlockableContent extends MappableContent{ @@ -15,7 +15,7 @@ public abstract class UnlockableContent extends MappableContent{ /** Localized description. May be null. */ public String description; /** Icons by Cicon ID.*/ - protected TextureRegion[] cicons = new TextureRegion[io.anuke.mindustry.ui.Cicon.all.length]; + protected TextureRegion[] cicons = new TextureRegion[mindustry.ui.Cicon.all.length]; public UnlockableContent(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/editor/DrawOperation.java b/core/src/mindustry/editor/DrawOperation.java similarity index 84% rename from core/src/io/anuke/mindustry/editor/DrawOperation.java rename to core/src/mindustry/editor/DrawOperation.java index b5a81a759f..061a7aee84 100755 --- a/core/src/io/anuke/mindustry/editor/DrawOperation.java +++ b/core/src/mindustry/editor/DrawOperation.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.annotations.Annotations.Struct; -import io.anuke.arc.collection.LongArray; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.gen.TileOp; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.Floor; +import mindustry.annotations.Annotations.Struct; +import arc.struct.LongArray; +import mindustry.game.Team; +import mindustry.gen.TileOp; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.blocks.Floor; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class DrawOperation{ private MapEditor editor; @@ -69,7 +69,7 @@ public class DrawOperation{ }else if(type == OpType.rotation.ordinal()){ tile.rotation(to); }else if(type == OpType.team.ordinal()){ - tile.setTeam(Team.all[to]); + tile.setTeam(Team.get(to)); }else if(type == OpType.overlay.ordinal()){ tile.setOverlayID(to); } diff --git a/core/src/io/anuke/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java similarity index 86% rename from core/src/io/anuke/mindustry/editor/EditorTile.java rename to core/src/mindustry/editor/EditorTile.java index 91b76b2364..6a2829b098 100644 --- a/core/src/io/anuke/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.editor.DrawOperation.OpType; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.gen.TileOp; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.modules.*; +import mindustry.content.Blocks; +import mindustry.core.GameState.State; +import mindustry.editor.DrawOperation.OpType; +import mindustry.game.Team; +import mindustry.gen.TileOp; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.blocks.*; +import mindustry.world.modules.*; -import static io.anuke.mindustry.Vars.state; -import static io.anuke.mindustry.Vars.ui; +import static mindustry.Vars.state; +import static mindustry.Vars.ui; //TODO somehow remove or replace this class with a more flexible solution public class EditorTile extends Tile{ @@ -74,7 +74,7 @@ public class EditorTile extends Tile{ return; } - if(getTeamID() == team.ordinal()) return; + if(getTeamID() == team.id) return; op(OpType.team, getTeamID()); super.setTeam(team); } diff --git a/core/src/io/anuke/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java similarity index 93% rename from core/src/io/anuke/mindustry/editor/EditorTool.java rename to core/src/mindustry/editor/EditorTool.java index c38d91b8ed..8e197bf42e 100644 --- a/core/src/io/anuke/mindustry/editor/EditorTool.java +++ b/core/src/mindustry/editor/EditorTool.java @@ -1,15 +1,14 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.collection.IntArray; -import io.anuke.arc.func.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Bresenham2; -import io.anuke.arc.util.Structs; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.BlockPart; +import arc.func.*; +import arc.math.*; +import arc.math.geom.*; +import arc.struct.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.game.*; +import mindustry.world.*; +import mindustry.world.blocks.*; public enum EditorTool{ zoom, @@ -80,7 +79,7 @@ public enum EditorTool{ editor.drawCircle(x, y, tile -> { if(mode == -1){ //erase block - Vars.world.removeBlock(tile); + tile.remove(); }else if(mode == 0){ //erase ore tile.clearOverlay(); @@ -119,7 +118,7 @@ public enum EditorTool{ if(editor.drawBlock.isOverlay()){ Block dest = tile.overlay(); if(dest == editor.drawBlock) return; - tester = t -> t.overlay() == dest; + tester = t -> t.overlay() == dest && !t.floor().isLiquid; setter = t -> t.setOverlay(editor.drawBlock); }else if(editor.drawBlock.isFloor()){ Block dest = tile.floor(); @@ -141,7 +140,7 @@ public enum EditorTool{ if(tile.link().synthetic()){ Team dest = tile.getTeam(); if(dest == editor.drawTeam) return; - fill(editor, x, y, false, t -> t.getTeamID() == dest.ordinal() && t.link().synthetic(), t -> t.setTeam(editor.drawTeam)); + fill(editor, x, y, false, t -> t.getTeamID() == (int)dest.id && t.link().synthetic(), t -> t.setTeam(editor.drawTeam)); } } } diff --git a/core/src/io/anuke/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java similarity index 90% rename from core/src/io/anuke/mindustry/editor/MapEditor.java rename to core/src/mindustry/editor/MapEditor.java index 40b44d2b12..7cab015b1f 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -1,22 +1,21 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.collection.StringMap; -import io.anuke.arc.files.Fi; -import io.anuke.arc.func.Cons; -import io.anuke.arc.func.Boolf; -import io.anuke.arc.graphics.Pixmap; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Structs; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.gen.TileOp; -import io.anuke.mindustry.io.LegacyMapIO; -import io.anuke.mindustry.io.MapIO; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.BlockPart; +import arc.struct.StringMap; +import arc.files.Fi; +import arc.func.Cons; +import arc.func.Boolf; +import arc.graphics.Pixmap; +import arc.math.Mathf; +import arc.util.Structs; +import mindustry.content.Blocks; +import mindustry.game.Team; +import mindustry.gen.TileOp; +import mindustry.io.MapIO; +import mindustry.maps.Map; +import mindustry.world.*; +import mindustry.world.blocks.BlockPart; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MapEditor{ public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15, 20}; @@ -65,7 +64,7 @@ public class MapEditor{ reset(); createTiles(pixmap.getWidth(), pixmap.getHeight()); - load(() -> LegacyMapIO.readPixmap(pixmap, tiles())); + load(() -> MapIO.readPixmap(pixmap, tiles())); renderer.resize(width(), height()); } @@ -86,7 +85,7 @@ public class MapEditor{ for(int x = 0; x < width(); x++){ for(int y = 0; y < height(); y++){ if(tiles[x][y].block().isMultiblock()){ - world.setBlock(tiles[x][y], tiles[x][y].block(), tiles[x][y].getTeam()); + tiles[x][y].set(tiles[x][y].block(), tiles[x][y].getTeam()); } } } @@ -176,7 +175,7 @@ public class MapEditor{ } } - world.setBlock(tile(x, y), drawBlock, drawTeam); + tile(x, y).set(drawBlock, drawTeam); }else{ boolean isFloor = drawBlock.isFloor() && drawBlock != Blocks.air; @@ -185,7 +184,7 @@ public class MapEditor{ //remove linked tiles blocking the way if(!isFloor && (tile.isLinked() || tile.block().isMultiblock())){ - world.removeBlock(tile.link()); + tile.link().remove(); } if(isFloor){ diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java similarity index 95% rename from core/src/io/anuke/mindustry/editor/MapEditorDialog.java rename to core/src/mindustry/editor/MapEditorDialog.java index b8745052a0..b9a28501b9 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -1,37 +1,37 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.actions.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.ui.dialogs.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.storage.*; +import arc.*; +import arc.struct.*; +import arc.files.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.actions.*; +import arc.scene.event.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.core.GameState.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.io.*; +import mindustry.maps.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.ui.dialogs.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.storage.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MapEditorDialog extends Dialog implements Disposable{ public final MapEditor editor; @@ -475,7 +475,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ } table.update(() -> { - Vector2 v = button.localToStageCoordinates(Tmp.v1.setZero()); + Vec2 v = button.localToStageCoordinates(Tmp.v1.setZero()); table.setPosition(v.x, v.y, Align.topLeft); if(!isShown()){ table.remove(); @@ -551,7 +551,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ int i = 0; - for(Team team : Team.all){ + for(Team team : Team.base()){ ImageButton button = new ImageButton(Tex.whiteui, Styles.clearTogglePartiali); button.margin(4f); button.getImageCell().grow(); diff --git a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java similarity index 92% rename from core/src/io/anuke/mindustry/editor/MapGenerateDialog.java rename to core/src/mindustry/editor/MapGenerateDialog.java index 5195d746b4..12f989c272 100644 --- a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -1,29 +1,29 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Pixmap.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.ImageButton.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.async.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.maps.filters.*; -import io.anuke.mindustry.maps.filters.GenerateFilter.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.dialogs.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.Pixmap.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.ui.*; +import arc.scene.ui.ImageButton.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.async.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.io.*; +import mindustry.maps.filters.*; +import mindustry.maps.filters.GenerateFilter.*; +import mindustry.ui.*; +import mindustry.ui.dialogs.*; +import mindustry.world.*; +import mindustry.world.blocks.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; @SuppressWarnings("unchecked") public class MapGenerateDialog extends FloatingDialog{ @@ -138,7 +138,7 @@ public class MapGenerateDialog extends FloatingDialog{ tile.rotation(write.rotation); tile.setFloor((Floor)content.block(write.floor)); tile.setBlock(content.block(write.block)); - tile.setTeam(Team.all[write.team]); + tile.setTeam(Team.get(write.team)); tile.setOverlay(content.block(write.ore)); } } @@ -187,7 +187,7 @@ public class MapGenerateDialog extends FloatingDialog{ return; } - Vector2 v = pane.stageToLocalCoordinates(Core.input.mouse()); + Vec2 v = pane.stageToLocalCoordinates(Core.input.mouse()); if(v.x >= 0 && v.y >= 0 && v.x <= pane.getWidth() && v.y <= pane.getHeight()){ Core.scene.setScrollFocus(pane); @@ -367,7 +367,7 @@ public class MapGenerateDialog extends FloatingDialog{ GenTile tile = buffer1[px][py]; input.apply(x, y, content.block(tile.floor), content.block(tile.block), content.block(tile.ore)); filter.apply(input); - buffer2[px][py].set(input.floor, input.block, input.ore, Team.all[tile.team], tile.rotation); + buffer2[px][py].set(input.floor, input.block, input.ore, Team.get(tile.team), tile.rotation); } } for(int px = 0; px < pixmap.getWidth(); px++){ @@ -415,7 +415,7 @@ public class MapGenerateDialog extends FloatingDialog{ this.floor = floor.id; this.block = wall.id; this.ore = ore.id; - this.team = (byte)team.ordinal(); + this.team = (byte) team.id; this.rotation = (byte)rotation; } @@ -437,7 +437,7 @@ public class MapGenerateDialog extends FloatingDialog{ ctile.setBlock(content.block(block)); ctile.setOverlay(content.block(ore)); ctile.rotation(rotation); - ctile.setTeam(Team.all[team]); + ctile.setTeam(Team.get(team)); return ctile; } } diff --git a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java b/core/src/mindustry/editor/MapInfoDialog.java similarity index 90% rename from core/src/io/anuke/mindustry/editor/MapInfoDialog.java rename to core/src/mindustry/editor/MapInfoDialog.java index b2b942250b..ab120c9880 100644 --- a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java +++ b/core/src/mindustry/editor/MapInfoDialog.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.dialogs.*; +import arc.*; +import arc.struct.*; +import arc.scene.ui.*; +import mindustry.*; +import mindustry.game.*; +import mindustry.io.*; +import mindustry.ui.*; +import mindustry.ui.dialogs.*; public class MapInfoDialog extends FloatingDialog{ private final MapEditor editor; diff --git a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java b/core/src/mindustry/editor/MapLoadDialog.java similarity index 84% rename from core/src/io/anuke/mindustry/editor/MapLoadDialog.java rename to core/src/mindustry/editor/MapLoadDialog.java index 5fb9ffa982..7694d0fc4f 100644 --- a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java +++ b/core/src/mindustry/editor/MapLoadDialog.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.func.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.dialogs.*; +import arc.func.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.maps.*; +import mindustry.ui.*; +import mindustry.ui.dialogs.*; -import static io.anuke.mindustry.Vars.maps; +import static mindustry.Vars.maps; public class MapLoadDialog extends FloatingDialog{ private Map selected = null; diff --git a/core/src/io/anuke/mindustry/editor/MapRenderer.java b/core/src/mindustry/editor/MapRenderer.java similarity index 88% rename from core/src/io/anuke/mindustry/editor/MapRenderer.java rename to core/src/mindustry/editor/MapRenderer.java index 27994abcdc..c5d007c92a 100644 --- a/core/src/io/anuke/mindustry/editor/MapRenderer.java +++ b/core/src/mindustry/editor/MapRenderer.java @@ -1,23 +1,23 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.*; -import io.anuke.arc.collection.IntSet; -import io.anuke.arc.collection.IntSet.IntSetIterator; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.Texture; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.graphics.IndexedRenderer; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.BlockPart; +import arc.*; +import arc.struct.IntSet; +import arc.struct.IntSet.IntSetIterator; +import arc.graphics.Color; +import arc.graphics.Texture; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; +import arc.util.*; +import mindustry.content.Blocks; +import mindustry.game.EventType.*; +import mindustry.game.Team; +import mindustry.graphics.IndexedRenderer; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.blocks.BlockPart; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class MapRenderer implements Disposable{ private static final int chunkSize = 64; diff --git a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java b/core/src/mindustry/editor/MapResizeDialog.java similarity index 88% rename from core/src/io/anuke/mindustry/editor/MapResizeDialog.java rename to core/src/mindustry/editor/MapResizeDialog.java index 525adcefde..6eaf62eb42 100644 --- a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java +++ b/core/src/mindustry/editor/MapResizeDialog.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.func.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.ui.dialogs.*; +import arc.func.*; +import arc.math.*; +import arc.scene.ui.layout.*; +import mindustry.gen.*; +import mindustry.ui.dialogs.*; public class MapResizeDialog extends FloatingDialog{ private static final int minSize = 50, maxSize = 500, increment = 50; diff --git a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java b/core/src/mindustry/editor/MapSaveDialog.java similarity index 87% rename from core/src/io/anuke/mindustry/editor/MapSaveDialog.java rename to core/src/mindustry/editor/MapSaveDialog.java index 93b189349f..34eb4d6286 100644 --- a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java +++ b/core/src/mindustry/editor/MapSaveDialog.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.func.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.ui.dialogs.*; +import arc.func.*; +import arc.scene.ui.*; +import mindustry.*; +import mindustry.maps.*; +import mindustry.ui.dialogs.*; -import static io.anuke.mindustry.Vars.ui; +import static mindustry.Vars.ui; public class MapSaveDialog extends FloatingDialog{ private TextField field; diff --git a/core/src/io/anuke/mindustry/editor/MapView.java b/core/src/mindustry/editor/MapView.java similarity index 88% rename from core/src/io/anuke/mindustry/editor/MapView.java rename to core/src/mindustry/editor/MapView.java index c637e9b6f2..6787f418ab 100644 --- a/core/src/io/anuke/mindustry/editor/MapView.java +++ b/core/src/mindustry/editor/MapView.java @@ -1,24 +1,24 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.GestureDetector; -import io.anuke.arc.input.GestureDetector.GestureListener; -import io.anuke.arc.input.KeyCode; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.Element; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.TextField; -import io.anuke.arc.scene.ui.layout.Scl; -import io.anuke.arc.util.*; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.input.Binding; -import io.anuke.mindustry.ui.GridImage; +import arc.Core; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.input.GestureDetector; +import arc.input.GestureDetector.GestureListener; +import arc.input.KeyCode; +import arc.math.Mathf; +import arc.math.geom.*; +import arc.scene.Element; +import arc.scene.event.*; +import arc.scene.ui.TextField; +import arc.scene.ui.layout.Scl; +import arc.util.*; +import mindustry.graphics.Pal; +import mindustry.input.Binding; +import mindustry.ui.GridImage; -import static io.anuke.mindustry.Vars.mobile; -import static io.anuke.mindustry.Vars.ui; +import static mindustry.Vars.mobile; +import static mindustry.Vars.ui; public class MapView extends Element implements GestureListener{ private MapEditor editor; @@ -27,9 +27,9 @@ public class MapView extends Element implements GestureListener{ private float zoom = 1f; private boolean grid = false; private GridImage image = new GridImage(0, 0); - private Vector2 vec = new Vector2(); - private Rectangle rect = new Rectangle(); - private Vector2[][] brushPolygons = new Vector2[MapEditor.brushSizes.length][0]; + private Vec2 vec = new Vec2(); + private Rect rect = new Rect(); + private Vec2[][] brushPolygons = new Vec2[MapEditor.brushSizes.length][0]; private boolean drawing; private int lastx, lasty; @@ -214,7 +214,7 @@ public class MapView extends Element implements GestureListener{ } } - private Vector2 unproject(int x, int y){ + private Vec2 unproject(int x, int y){ float ratio = 1f / ((float)editor.width() / editor.height()); float size = Math.min(width, height); float sclwidth = size * zoom; @@ -268,9 +268,9 @@ public class MapView extends Element implements GestureListener{ if((!editor.drawBlock.isMultiblock() || tool == EditorTool.eraser) && tool != EditorTool.fill){ if(tool == EditorTool.line && drawing){ - Vector2 v1 = unproject(startx, starty).add(x, y); + Vec2 v1 = unproject(startx, starty).add(x, y); float sx = v1.x, sy = v1.y; - Vector2 v2 = unproject(lastx, lasty).add(x, y); + Vec2 v2 = unproject(lastx, lasty).add(x, y); Lines.poly(brushPolygons[index], sx, sy, scaling); Lines.poly(brushPolygons[index], v2.x, v2.y, scaling); @@ -278,7 +278,7 @@ public class MapView extends Element implements GestureListener{ if((tool.edit || (tool == EditorTool.line && !drawing)) && (!mobile || drawing)){ Point2 p = project(mousex, mousey); - Vector2 v = unproject(p.x, p.y).add(x, y); + Vec2 v = unproject(p.x, p.y).add(x, y); //pencil square outline if(tool == EditorTool.pencil && tool.mode == 1){ @@ -290,7 +290,7 @@ public class MapView extends Element implements GestureListener{ }else{ if((tool.edit || tool == EditorTool.line) && (!mobile || drawing)){ Point2 p = project(mousex, mousey); - Vector2 v = unproject(p.x, p.y).add(x, y); + Vec2 v = unproject(p.x, p.y).add(x, y); float offset = (editor.drawBlock.size % 2 == 0 ? scaling / 2f : 0f); Lines.square( v.x + scaling / 2f + offset, @@ -332,7 +332,7 @@ public class MapView extends Element implements GestureListener{ } @Override - public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1, Vector2 pointer2){ + public boolean pinch(Vec2 initialPointer1, Vec2 initialPointer2, Vec2 pointer1, Vec2 pointer2){ return false; } diff --git a/core/src/io/anuke/mindustry/editor/OperationStack.java b/core/src/mindustry/editor/OperationStack.java similarity index 92% rename from core/src/io/anuke/mindustry/editor/OperationStack.java rename to core/src/mindustry/editor/OperationStack.java index 7927cbb026..f21cde91b8 100755 --- a/core/src/io/anuke/mindustry/editor/OperationStack.java +++ b/core/src/mindustry/editor/OperationStack.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.collection.Array; +import arc.struct.Array; public class OperationStack{ private final static int maxSize = 10; diff --git a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java b/core/src/mindustry/editor/WaveInfoDialog.java similarity index 90% rename from core/src/io/anuke/mindustry/editor/WaveInfoDialog.java rename to core/src/mindustry/editor/WaveInfoDialog.java index 187d8a7fc2..50ee9de42e 100644 --- a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java +++ b/core/src/mindustry/editor/WaveInfoDialog.java @@ -1,28 +1,28 @@ -package io.anuke.mindustry.editor; +package mindustry.editor; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.TextField.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.ui.dialogs.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.input.*; +import arc.math.*; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.TextField.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.ctype.ContentType; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.io.*; +import mindustry.type.*; +import mindustry.ui.Cicon; +import mindustry.ui.dialogs.*; -import static io.anuke.mindustry.Vars.*; -import static io.anuke.mindustry.game.SpawnGroup.never; +import static mindustry.Vars.*; +import static mindustry.game.SpawnGroup.never; public class WaveInfoDialog extends FloatingDialog{ private final static int displayed = 20; @@ -142,7 +142,7 @@ public class WaveInfoDialog extends FloatingDialog{ t.margin(0).defaults().pad(3).padLeft(5f).growX().left(); t.addButton(b -> { b.left(); - b.addImage(group.type.icon(io.anuke.mindustry.ui.Cicon.medium)).size(32f).padRight(3); + b.addImage(group.type.icon(mindustry.ui.Cicon.medium)).size(32f).padRight(3); b.add(group.type.localizedName).color(Pal.accent); }, () -> showUpdate(group)).pad(-6f).padBottom(0f); @@ -224,7 +224,7 @@ public class WaveInfoDialog extends FloatingDialog{ for(UnitType type : content.units()){ p.addButton(t -> { t.left(); - t.addImage(type.icon(io.anuke.mindustry.ui.Cicon.medium)).size(40f).padRight(2f); + t.addImage(type.icon(mindustry.ui.Cicon.medium)).size(40f).padRight(2f); t.add(type.localizedName); }, () -> { lastType = type; diff --git a/core/src/io/anuke/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java similarity index 88% rename from core/src/io/anuke/mindustry/entities/Damage.java rename to core/src/mindustry/entities/Damage.java index e637c6081e..335ac96385 100644 --- a/core/src/io/anuke/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -1,30 +1,30 @@ -package io.anuke.mindustry.entities; +package mindustry.entities; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.Effects.*; +import mindustry.entities.effect.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Utility class for damaging in an area. */ public class Damage{ - private static Rectangle rect = new Rectangle(); - private static Rectangle hitrect = new Rectangle(); - private static Vector2 tr = new Vector2(); + private static Rect rect = new Rect(); + private static Rect hitrect = new Rect(); + private static Vec2 tr = new Vec2(); private static GridBits bits = new GridBits(30, 30); private static IntQueue propagation = new IntQueue(); private static IntSet collidedBlocks = new IntSet(); @@ -88,7 +88,7 @@ public class Damage{ tr.trns(angle, length); Intc2 collider = (cx, cy) -> { Tile tile = world.ltile(cx, cy); - if(tile != null && !collidedBlocks.contains(tile.pos()) && tile.entity != null && tile.getTeamID() != team.ordinal() && tile.entity.collide(hitter)){ + if(tile != null && !collidedBlocks.contains(tile.pos()) && tile.entity != null && tile.getTeamID() != team.id && tile.entity.collide(hitter)){ tile.entity.collision(hitter); collidedBlocks.add(tile.pos()); hitter.getBulletType().hit(hitter, tile.worldx(), tile.worldy()); @@ -127,13 +127,13 @@ public class Damage{ Cons cons = e -> { e.hitbox(hitrect); - Rectangle other = hitrect; + Rect other = hitrect; other.y -= expand; other.x -= expand; other.width += expand * 2; other.height += expand * 2; - Vector2 vec = Geometry.raycastRect(x, y, x2, y2, other); + Vec2 vec = Geometry.raycastRect(x, y, x2, y2, other); if(vec != null){ Effects.effect(effect, vec.x, vec.y); @@ -259,7 +259,7 @@ public class Damage{ for(int dx = -trad; dx <= trad; dx++){ for(int dy = -trad; dy <= trad; dy++){ Tile tile = world.tile(Math.round(x / tilesize) + dx, Math.round(y / tilesize) + dy); - if(tile != null && tile.entity != null && (team == null || state.teams.areEnemies(team, tile.getTeam())) && Mathf.dst(dx, dy) <= trad){ + if(tile != null && tile.entity != null && (team == null ||team.isEnemy(tile.getTeam())) && Mathf.dst(dx, dy) <= trad){ tile.entity.damage(damage); } } diff --git a/core/src/io/anuke/mindustry/entities/Effects.java b/core/src/mindustry/entities/Effects.java similarity index 92% rename from core/src/io/anuke/mindustry/entities/Effects.java rename to core/src/mindustry/entities/Effects.java index ca1492bdbf..6f2a04033a 100644 --- a/core/src/io/anuke/mindustry/entities/Effects.java +++ b/core/src/mindustry/entities/Effects.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.entities; +package mindustry.entities; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.func.Cons; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Position; -import io.anuke.arc.util.pooling.Pools; -import io.anuke.mindustry.entities.type.EffectEntity; -import io.anuke.mindustry.entities.traits.ScaleTrait; +import arc.Core; +import arc.struct.Array; +import arc.func.Cons; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.math.Mathf; +import arc.math.geom.Position; +import arc.util.pooling.Pools; +import mindustry.entities.type.EffectEntity; +import mindustry.entities.traits.ScaleTrait; public class Effects{ private static final EffectContainer container = new EffectContainer(); diff --git a/core/src/io/anuke/mindustry/entities/Entities.java b/core/src/mindustry/entities/Entities.java similarity index 86% rename from core/src/io/anuke/mindustry/entities/Entities.java rename to core/src/mindustry/entities/Entities.java index 8f9ff98300..022af6b95d 100755 --- a/core/src/io/anuke/mindustry/entities/Entities.java +++ b/core/src/mindustry/entities/Entities.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.entities; +package mindustry.entities; -import io.anuke.arc.collection.*; -import io.anuke.mindustry.entities.traits.*; +import arc.struct.*; +import mindustry.entities.traits.*; /** Simple container for managing entity groups.*/ public class Entities{ diff --git a/core/src/io/anuke/mindustry/entities/EntityCollisions.java b/core/src/mindustry/entities/EntityCollisions.java similarity index 89% rename from core/src/io/anuke/mindustry/entities/EntityCollisions.java rename to core/src/mindustry/entities/EntityCollisions.java index 808f8e4fc8..72e177d71e 100644 --- a/core/src/io/anuke/mindustry/entities/EntityCollisions.java +++ b/core/src/mindustry/entities/EntityCollisions.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.entities; +package mindustry.entities; -import io.anuke.arc.collection.Array; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.*; -import io.anuke.mindustry.entities.traits.Entity; -import io.anuke.mindustry.entities.traits.SolidTrait; -import io.anuke.mindustry.world.Tile; +import arc.struct.Array; +import arc.math.Mathf; +import arc.math.geom.*; +import mindustry.entities.traits.Entity; +import mindustry.entities.traits.SolidTrait; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.tilesize; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.tilesize; +import static mindustry.Vars.world; public class EntityCollisions{ //range for tile collision scanning @@ -17,11 +17,11 @@ public class EntityCollisions{ private static final float seg = 1f; //tile collisions - private Rectangle tmp = new Rectangle(); - private Vector2 vector = new Vector2(); - private Vector2 l1 = new Vector2(); - private Rectangle r1 = new Rectangle(); - private Rectangle r2 = new Rectangle(); + private Rect tmp = new Rect(); + private Vec2 vector = new Vec2(); + private Vec2 l1 = new Vec2(); + private Rect r1 = new Rect(); + private Rect r2 = new Rect(); //entity collisions private Array arrOut = new Array<>(); @@ -57,7 +57,7 @@ public class EntityCollisions{ public void moveDelta(SolidTrait entity, float deltax, float deltay, boolean x){ - Rectangle rect = r1; + Rect rect = r1; entity.hitboxTile(rect); entity.hitboxTile(r2); rect.x += deltax; @@ -72,7 +72,7 @@ public class EntityCollisions{ tmp.setSize(tilesize).setCenter(wx * tilesize, wy * tilesize); if(tmp.overlaps(rect)){ - Vector2 v = Geometry.overlap(rect, tmp, x); + Vec2 v = Geometry.overlap(rect, tmp, x); rect.x += v.x; rect.y += v.y; } @@ -84,7 +84,7 @@ public class EntityCollisions{ entity.setY(entity.getY() + rect.y - r2.y); } - public boolean overlapsTile(Rectangle rect){ + public boolean overlapsTile(Rect rect){ rect.getCenter(vector); int r = 1; @@ -157,7 +157,7 @@ public class EntityCollisions{ } private boolean collide(float x1, float y1, float w1, float h1, float vx1, float vy1, - float x2, float y2, float w2, float h2, float vx2, float vy2, Vector2 out){ + float x2, float y2, float w2, float h2, float vx2, float vy2, Vec2 out){ float px = vx1, py = vy1; vx1 -= vx2; diff --git a/core/src/io/anuke/mindustry/entities/EntityGroup.java b/core/src/mindustry/entities/EntityGroup.java similarity index 90% rename from core/src/io/anuke/mindustry/entities/EntityGroup.java rename to core/src/mindustry/entities/EntityGroup.java index 588bca2709..24c3f0e4f0 100644 --- a/core/src/io/anuke/mindustry/entities/EntityGroup.java +++ b/core/src/mindustry/entities/EntityGroup.java @@ -1,17 +1,19 @@ -package io.anuke.mindustry.entities; +package mindustry.entities; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.math.geom.*; -import io.anuke.mindustry.entities.traits.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.*; +import arc.math.geom.*; +import mindustry.entities.traits.*; -import static io.anuke.mindustry.Vars.collisions; +import java.util.*; + +import static mindustry.Vars.collisions; /** Represents a group of a certain type of entity.*/ @SuppressWarnings("unchecked") -public class EntityGroup{ +public class EntityGroup implements Iterable{ private final boolean useTree; private final int id; private final Class type; @@ -19,13 +21,13 @@ public class EntityGroup{ private final Array entitiesToRemove = new Array<>(false, 32); private final Array entitiesToAdd = new Array<>(false, 32); private final Array intersectArray = new Array<>(); - private final Rectangle intersectRect = new Rectangle(); + private final Rect intersectRect = new Rect(); private IntMap map; private QuadTree tree; private Cons removeListener; private Cons addListener; - private final Rectangle viewport = new Rectangle(); + private final Rect viewport = new Rect(); private int count = 0; public EntityGroup(int id, Class type, boolean useTree){ @@ -34,7 +36,7 @@ public class EntityGroup{ this.type = type; if(useTree){ - tree = new QuadTree<>(new Rectangle(0, 0, 0, 0)); + tree = new QuadTree<>(new Rect(0, 0, 0, 0)); } } @@ -180,7 +182,7 @@ public class EntityGroup{ /** Resizes the internal quadtree, if it is enabled.*/ public void resize(float x, float y, float w, float h){ if(useTree){ - tree = new QuadTree<>(new Rectangle(x, y, w, h)); + tree = new QuadTree<>(new Rect(x, y, w, h)); } } @@ -253,8 +255,13 @@ public class EntityGroup{ return null; } - /** Returns the logic-only array for iteration. */ + /** Returns the array for iteration. */ public Array all(){ return entityArray; } + + @Override + public Iterator iterator(){ + return entityArray.iterator(); + } } diff --git a/core/src/io/anuke/mindustry/entities/Predict.java b/core/src/mindustry/entities/Predict.java similarity index 71% rename from core/src/io/anuke/mindustry/entities/Predict.java rename to core/src/mindustry/entities/Predict.java index ef385cbd26..c541771829 100644 --- a/core/src/io/anuke/mindustry/entities/Predict.java +++ b/core/src/mindustry/entities/Predict.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.entities; +package mindustry.entities; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.traits.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.entities.traits.*; /** * Class for predicting shoot angles based on velocities of targets. */ public class Predict{ - private static Vector2 vec = new Vector2(); - private static Vector2 vresult = new Vector2(); + private static Vec2 vec = new Vec2(); + private static Vec2 vresult = new Vec2(); /** * Calculates of intercept of a stationary and moving target. Do not call from multiple threads! @@ -23,7 +23,7 @@ public class Predict{ * @param v speed of bullet * @return the intercept location */ - public static Vector2 intercept(float srcx, float srcy, float dstx, float dsty, float dstvx, float dstvy, float v){ + public static Vec2 intercept(float srcx, float srcy, float dstx, float dsty, float dstvx, float dstvy, float v){ dstvx /= Time.delta(); dstvy /= Time.delta(); float tx = dstx - srcx, @@ -35,10 +35,10 @@ public class Predict{ float c = tx * tx + ty * ty; // Solve quadratic - Vector2 ts = quad(a, b, c); + Vec2 ts = quad(a, b, c); // Find smallest positive solution - Vector2 sol = vresult.set(dstx, dsty); + Vec2 sol = vresult.set(dstx, dsty); if(ts != null){ float t0 = ts.x, t1 = ts.y; float t = Math.min(t0, t1); @@ -54,12 +54,12 @@ public class Predict{ /** * See {@link #intercept(float, float, float, float, float, float, float)}. */ - public static Vector2 intercept(TargetTrait src, TargetTrait dst, float v){ - return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(), dst.getTargetVelocityX() - src.getTargetVelocityX()/2f, dst.getTargetVelocityY() - src.getTargetVelocityY()/2f, v); + public static Vec2 intercept(TargetTrait src, TargetTrait dst, float v){ + return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(), dst.getTargetVelocityX() - src.getTargetVelocityX()/(2f*Time.delta()), dst.getTargetVelocityY() - src.getTargetVelocityY()/(2f*Time.delta()), v); } - private static Vector2 quad(float a, float b, float c){ - Vector2 sol = null; + private static Vec2 quad(float a, float b, float c){ + Vec2 sol = null; if(Math.abs(a) < 1e-6){ if(Math.abs(b) < 1e-6){ sol = Math.abs(c) < 1e-6 ? vec.set(0, 0) : null; diff --git a/core/src/io/anuke/mindustry/entities/TargetPriority.java b/core/src/mindustry/entities/TargetPriority.java similarity index 58% rename from core/src/io/anuke/mindustry/entities/TargetPriority.java rename to core/src/mindustry/entities/TargetPriority.java index 47b0213de3..ec36b03925 100644 --- a/core/src/io/anuke/mindustry/entities/TargetPriority.java +++ b/core/src/mindustry/entities/TargetPriority.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities; +package mindustry.entities; public enum TargetPriority{ base, diff --git a/core/src/io/anuke/mindustry/entities/Units.java b/core/src/mindustry/entities/Units.java similarity index 81% rename from core/src/io/anuke/mindustry/entities/Units.java rename to core/src/mindustry/entities/Units.java index df4ba980df..67fe01dc9e 100644 --- a/core/src/io/anuke/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -1,21 +1,18 @@ -package io.anuke.mindustry.entities; +package mindustry.entities; -import io.anuke.arc.collection.EnumSet; -import io.anuke.arc.func.Cons; -import io.anuke.arc.func.Boolf; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Geometry; -import io.anuke.arc.math.geom.Rectangle; -import io.anuke.mindustry.entities.traits.TargetTrait; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.world.Tile; +import arc.func.*; +import arc.math.*; +import arc.math.geom.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Utility class for unit and team interactions.*/ public class Units{ - private static Rectangle hitrect = new Rectangle(); + private static Rect hitrect = new Rect(); private static Unit result; private static float cdist; private static boolean boolResult; @@ -86,13 +83,7 @@ public class Units{ public static TileEntity findEnemyTile(Team team, float x, float y, float range, Boolf pred){ if(team == Team.derelict) return null; - for(Team enemy : state.teams.enemiesOf(team)){ - TileEntity entity = indexer.findTile(enemy, x, y, range, pred, true); - if(entity != null){ - return entity; - } - } - return null; + return indexer.findEnemyTile(team, x, y, range, pred); } /** Returns the closest target enemy. First, units are checked, then tile entities. */ @@ -157,7 +148,11 @@ public class Units{ /** Iterates over all units in a rectangle. */ public static void nearby(Team team, float x, float y, float width, float height, Cons cons){ - unitGroups[team.ordinal()].intersect(x, y, width, height, cons); + unitGroup.intersect(x, y, width, height, u -> { + if(u.getTeam() == team){ + cons.get(u); + } + }); playerGroup.intersect(x, y, width, height, player -> { if(player.getTeam() == team){ cons.get(player); @@ -167,8 +162,8 @@ public class Units{ /** Iterates over all units in a circle around this position. */ public static void nearby(Team team, float x, float y, float radius, Cons cons){ - unitGroups[team.ordinal()].intersect(x - radius, y - radius, radius*2f, radius*2f, unit -> { - if(unit.withinDst(x, y, radius)){ + unitGroup.intersect(x - radius, y - radius, radius*2f, radius*2f, unit -> { + if(unit.getTeam() == team && unit.withinDst(x, y, radius)){ cons.get(unit); } }); @@ -182,45 +177,43 @@ public class Units{ /** Iterates over all units in a rectangle. */ public static void nearby(float x, float y, float width, float height, Cons cons){ - for(Team team : Team.all){ - unitGroups[team.ordinal()].intersect(x, y, width, height, cons); - } - + unitGroup.intersect(x, y, width, height, cons); playerGroup.intersect(x, y, width, height, cons); } /** Iterates over all units in a rectangle. */ - public static void nearby(Rectangle rect, Cons cons){ + public static void nearby(Rect rect, Cons cons){ nearby(rect.x, rect.y, rect.width, rect.height, cons); } /** Iterates over all units that are enemies of this team. */ public static void nearbyEnemies(Team team, float x, float y, float width, float height, Cons cons){ - EnumSet targets = state.teams.enemiesOf(team); - - for(Team other : targets){ - unitGroups[other.ordinal()].intersect(x, y, width, height, cons); - } + unitGroup.intersect(x, y, width, height, u -> { + if(team.isEnemy(u.getTeam())){ + cons.get(u); + } + }); playerGroup.intersect(x, y, width, height, player -> { - if(targets.contains(player.getTeam())){ + if(team.isEnemy(player.getTeam())){ cons.get(player); } }); } /** Iterates over all units that are enemies of this team. */ - public static void nearbyEnemies(Team team, Rectangle rect, Cons cons){ + public static void nearbyEnemies(Team team, Rect rect, Cons cons){ nearbyEnemies(team, rect.x, rect.y, rect.width, rect.height, cons); } /** Iterates over all units. */ public static void all(Cons cons){ - for(Team team : Team.all){ - unitGroups[team.ordinal()].all().each(cons); - } - + unitGroup.all().each(cons); playerGroup.all().each(cons); } + public static void each(Team team, Cons cons){ + unitGroup.all().each(t -> t.getTeam() == team, cons); + } + } diff --git a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java b/core/src/mindustry/entities/bullet/ArtilleryBulletType.java similarity index 77% rename from core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java rename to core/src/mindustry/entities/bullet/ArtilleryBulletType.java index 1bc00443c6..c59dedf99a 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java +++ b/core/src/mindustry/entities/bullet/ArtilleryBulletType.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.entities.bullet; +package mindustry.entities.bullet; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.gen.*; +import arc.graphics.g2d.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.type.Bullet; +import mindustry.gen.*; //TODO scale velocity depending on fslope() public class ArtilleryBulletType extends BasicBulletType{ @@ -25,7 +25,7 @@ public class ArtilleryBulletType extends BasicBulletType{ } @Override - public void update(io.anuke.mindustry.entities.type.Bullet b){ + public void update(Bullet b){ super.update(b); if(b.timer.get(0, 3 + b.fslope() * 2f)){ diff --git a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java b/core/src/mindustry/entities/bullet/BasicBulletType.java similarity index 81% rename from core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java rename to core/src/mindustry/entities/bullet/BasicBulletType.java index bf20c811ab..44588dedf4 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BasicBulletType.java +++ b/core/src/mindustry/entities/bullet/BasicBulletType.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.entities.bullet; +package mindustry.entities.bullet; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.graphics.Pal; +import arc.Core; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import mindustry.entities.type.Bullet; +import mindustry.graphics.Pal; /** An extended BulletType for most ammo-based bullets shot from turrets and units. */ public class BasicBulletType extends BulletType{ diff --git a/core/src/io/anuke/mindustry/entities/bullet/BombBulletType.java b/core/src/mindustry/entities/bullet/BombBulletType.java similarity index 87% rename from core/src/io/anuke/mindustry/entities/bullet/BombBulletType.java rename to core/src/mindustry/entities/bullet/BombBulletType.java index 55c0a3b87d..50ff842780 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BombBulletType.java +++ b/core/src/mindustry/entities/bullet/BombBulletType.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.entities.bullet; +package mindustry.entities.bullet; -import io.anuke.mindustry.gen.*; +import mindustry.gen.*; public class BombBulletType extends BasicBulletType{ diff --git a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java similarity index 89% rename from core/src/io/anuke/mindustry/entities/bullet/BulletType.java rename to core/src/mindustry/entities/bullet/BulletType.java index bc401c6d6d..6c5417d0ca 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.entities.bullet; +package mindustry.entities.bullet; -import io.anuke.arc.audio.*; -import io.anuke.arc.math.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.Content; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.audio.*; +import arc.math.*; +import mindustry.content.*; +import mindustry.ctype.Content; +import mindustry.ctype.ContentType; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.effect.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.world.*; public abstract class BulletType extends Content{ public float lifetime; diff --git a/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java b/core/src/mindustry/entities/bullet/FlakBulletType.java similarity index 78% rename from core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java rename to core/src/mindustry/entities/bullet/FlakBulletType.java index e53be5fcf2..ead19859cc 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java +++ b/core/src/mindustry/entities/bullet/FlakBulletType.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.entities.bullet; +package mindustry.entities.bullet; -import io.anuke.arc.math.geom.Rectangle; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.type.Bullet; +import arc.math.geom.Rect; +import arc.util.Time; +import mindustry.content.Fx; +import mindustry.entities.Units; +import mindustry.entities.type.Bullet; public class FlakBulletType extends BasicBulletType{ - protected static Rectangle rect = new Rectangle(); + protected static Rect rect = new Rect(); protected float explodeRange = 30f; public FlakBulletType(float speed, float damage){ diff --git a/core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java b/core/src/mindustry/entities/bullet/HealBulletType.java similarity index 78% rename from core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java rename to core/src/mindustry/entities/bullet/HealBulletType.java index 95dbef7b63..4ff0b9fefd 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java +++ b/core/src/mindustry/entities/bullet/HealBulletType.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.entities.bullet; +package mindustry.entities.bullet; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.type.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.blocks.*; public class HealBulletType extends BulletType{ protected float healPercent = 3f; diff --git a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java b/core/src/mindustry/entities/bullet/LiquidBulletType.java similarity index 74% rename from core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java rename to core/src/mindustry/entities/bullet/LiquidBulletType.java index 7d53a852ec..a1039e2748 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java +++ b/core/src/mindustry/entities/bullet/LiquidBulletType.java @@ -1,20 +1,21 @@ -package io.anuke.mindustry.entities.bullet; +package mindustry.entities.bullet; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.geom.*; +import arc.util.ArcAnnotate.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.effect.*; +import mindustry.entities.type.Bullet; +import mindustry.type.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class LiquidBulletType extends BulletType{ - @NonNull Liquid liquid; + public @NonNull Liquid liquid; + public float puddleSize = 5f; public LiquidBulletType(@Nullable Liquid liquid){ super(3.5f, 0); @@ -67,7 +68,7 @@ public class LiquidBulletType extends BulletType{ @Override public void hit(Bullet b, float hitx, float hity){ Effects.effect(hitEffect, liquid.color, hitx, hity); - Puddle.deposit(world.tileWorld(hitx, hity), liquid, 5f); + Puddle.deposit(world.tileWorld(hitx, hity), liquid, puddleSize); if(liquid.temperature <= 0.5f && liquid.flammability < 0.3f){ float intensity = 400f; diff --git a/core/src/io/anuke/mindustry/entities/bullet/MassDriverBolt.java b/core/src/mindustry/entities/bullet/MassDriverBolt.java similarity index 79% rename from core/src/io/anuke/mindustry/entities/bullet/MassDriverBolt.java rename to core/src/mindustry/entities/bullet/MassDriverBolt.java index fe357b7f5f..8fbe5c77db 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/MassDriverBolt.java +++ b/core/src/mindustry/entities/bullet/MassDriverBolt.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.entities.bullet; +package mindustry.entities.bullet; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.math.Angles; +import arc.math.Mathf; +import mindustry.content.Fx; +import mindustry.entities.Effects; +import mindustry.entities.type.Bullet; +import mindustry.graphics.Pal; +import mindustry.world.blocks.distribution.MassDriver.DriverBulletData; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class MassDriverBolt extends BulletType{ @@ -24,7 +24,7 @@ public class MassDriverBolt extends BulletType{ } @Override - public void draw(io.anuke.mindustry.entities.type.Bullet b){ + public void draw(mindustry.entities.type.Bullet b){ float w = 11f, h = 13f; Draw.color(Pal.bulletYellowBack); @@ -37,7 +37,7 @@ public class MassDriverBolt extends BulletType{ } @Override - public void update(io.anuke.mindustry.entities.type.Bullet b){ + public void update(mindustry.entities.type.Bullet b){ //data MUST be an instance of DriverBulletData if(!(b.getData() instanceof DriverBulletData)){ hit(b); @@ -83,7 +83,7 @@ public class MassDriverBolt extends BulletType{ } @Override - public void despawned(io.anuke.mindustry.entities.type.Bullet b){ + public void despawned(mindustry.entities.type.Bullet b){ super.despawned(b); if(!(b.getData() instanceof DriverBulletData)) return; diff --git a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java b/core/src/mindustry/entities/bullet/MissileBulletType.java similarity index 72% rename from core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java rename to core/src/mindustry/entities/bullet/MissileBulletType.java index 6bea5404cb..3c730d975a 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java +++ b/core/src/mindustry/entities/bullet/MissileBulletType.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.entities.bullet; +package mindustry.entities.bullet; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.Pal; +import arc.graphics.Color; +import arc.math.Mathf; +import arc.util.Time; +import mindustry.content.Fx; +import mindustry.entities.Effects; +import mindustry.entities.type.Bullet; +import mindustry.gen.*; +import mindustry.graphics.Pal; public class MissileBulletType extends BasicBulletType{ protected Color trailColor = Pal.missileYellowBack; diff --git a/core/src/io/anuke/mindustry/entities/effect/Decal.java b/core/src/mindustry/entities/effect/Decal.java similarity index 55% rename from core/src/io/anuke/mindustry/entities/effect/Decal.java rename to core/src/mindustry/entities/effect/Decal.java index 103bc14919..cbe0e8edb2 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Decal.java +++ b/core/src/mindustry/entities/effect/Decal.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.entities.effect; +package mindustry.entities.effect; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.type.TimedEntity; -import io.anuke.mindustry.entities.traits.BelowLiquidTrait; -import io.anuke.mindustry.entities.traits.DrawTrait; -import io.anuke.mindustry.graphics.Pal; +import arc.graphics.g2d.Draw; +import arc.math.Mathf; +import mindustry.entities.EntityGroup; +import mindustry.entities.type.TimedEntity; +import mindustry.entities.traits.BelowLiquidTrait; +import mindustry.entities.traits.DrawTrait; +import mindustry.graphics.Pal; -import static io.anuke.mindustry.Vars.groundEffectGroup; +import static mindustry.Vars.groundEffectGroup; /** * Class for creating block rubble on the ground. diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/mindustry/entities/effect/Fire.java similarity index 90% rename from core/src/io/anuke/mindustry/entities/effect/Fire.java rename to core/src/mindustry/entities/effect/Fire.java index 8546ec45e8..a3e15873fa 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/mindustry/entities/effect/Fire.java @@ -1,24 +1,24 @@ -package io.anuke.mindustry.entities.effect; +package mindustry.entities.effect; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Fire extends TimedEntity implements SaveTrait, SyncTrait{ private static final IntMap map = new IntMap<>(); diff --git a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java b/core/src/mindustry/entities/effect/GroundEffectEntity.java similarity index 85% rename from core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java rename to core/src/mindustry/entities/effect/GroundEffectEntity.java index 4dfd0a694e..644757512c 100644 --- a/core/src/io/anuke/mindustry/entities/effect/GroundEffectEntity.java +++ b/core/src/mindustry/entities/effect/GroundEffectEntity.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.entities.effect; +package mindustry.entities.effect; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.Effects.EffectRenderer; -import io.anuke.mindustry.entities.type.EffectEntity; -import io.anuke.mindustry.world.Tile; +import arc.math.Mathf; +import arc.util.Time; +import mindustry.Vars; +import mindustry.entities.Effects; +import mindustry.entities.Effects.Effect; +import mindustry.entities.Effects.EffectRenderer; +import mindustry.entities.type.EffectEntity; +import mindustry.world.Tile; /** * A ground effect contains an effect that is rendered on the ground layer as opposed to the top layer. diff --git a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java b/core/src/mindustry/entities/effect/ItemTransfer.java similarity index 73% rename from core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java rename to core/src/mindustry/entities/effect/ItemTransfer.java index 0d8ab641ff..2018d15a69 100644 --- a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java +++ b/core/src/mindustry/entities/effect/ItemTransfer.java @@ -1,28 +1,28 @@ -package io.anuke.mindustry.entities.effect; +package mindustry.entities.effect; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Interpolation; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Position; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; -import io.anuke.arc.util.pooling.Pools; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.TimedEntity; -import io.anuke.mindustry.entities.traits.DrawTrait; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Tile; +import mindustry.annotations.Annotations.Loc; +import mindustry.annotations.Annotations.Remote; +import arc.graphics.g2d.*; +import arc.math.Interpolation; +import arc.math.Mathf; +import arc.math.geom.Position; +import arc.math.geom.Vec2; +import arc.util.Time; +import arc.util.pooling.Pools; +import mindustry.entities.*; +import mindustry.entities.type.TimedEntity; +import mindustry.entities.traits.DrawTrait; +import mindustry.entities.type.Unit; +import mindustry.graphics.Pal; +import mindustry.type.Item; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ItemTransfer extends TimedEntity implements DrawTrait{ - private Vector2 from = new Vector2(); - private Vector2 current = new Vector2(); - private Vector2 tovec = new Vector2(); + private Vec2 from = new Vec2(); + private Vec2 current = new Vec2(); + private Vec2 tovec = new Vec2(); private Item item; private float seed; private Position to; @@ -44,7 +44,7 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{ create(item, x, y, to, () -> to.addItem(item)); } - @Remote(called = Loc.server) + @Remote(called = Loc.server, unreliable = true) public static void transferItemTo(Item item, int amount, float x, float y, Tile tile){ if(tile == null || tile.entity == null || tile.entity.items == null) return; for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){ diff --git a/core/src/io/anuke/mindustry/entities/effect/Lightning.java b/core/src/mindustry/entities/effect/Lightning.java similarity index 76% rename from core/src/io/anuke/mindustry/entities/effect/Lightning.java rename to core/src/mindustry/entities/effect/Lightning.java index 8d28f33d65..e4658cd1ff 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Lightning.java +++ b/core/src/mindustry/entities/effect/Lightning.java @@ -1,41 +1,41 @@ -package io.anuke.mindustry.entities.effect; +package mindustry.entities.effect; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.IntSet; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.pooling.Pools; -import io.anuke.mindustry.content.Bullets; -import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.entities.type.TimedEntity; -import io.anuke.mindustry.entities.traits.DrawTrait; -import io.anuke.mindustry.entities.traits.TimeTrait; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.world.Tile; +import mindustry.annotations.Annotations.Loc; +import mindustry.annotations.Annotations.Remote; +import arc.struct.Array; +import arc.struct.IntSet; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.pooling.Pools; +import mindustry.content.Bullets; +import mindustry.entities.EntityGroup; +import mindustry.entities.Units; +import mindustry.entities.type.Bullet; +import mindustry.entities.type.TimedEntity; +import mindustry.entities.traits.DrawTrait; +import mindustry.entities.traits.TimeTrait; +import mindustry.entities.type.Unit; +import mindustry.game.Team; +import mindustry.gen.Call; +import mindustry.graphics.Pal; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{ public static final float lifetime = 10f; - private static final RandomXS128 random = new RandomXS128(); - private static final Rectangle rect = new Rectangle(); + private static final Rand random = new Rand(); + private static final Rect rect = new Rect(); private static final Array entities = new Array<>(); private static final IntSet hit = new IntSet(); private static final int maxChain = 8; private static final float hitRange = 30f; private static int lastSeed = 0; - private Array lines = new Array<>(); + private Array lines = new Array<>(); private Color color = Pal.lancerLaser; /** For pooling use only. Do not call directly! */ @@ -70,7 +70,7 @@ public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{ for(int i = 0; i < length / 2; i++){ Bullet.create(Bullets.damageLightning, l, team, x, y, 0f, 1f, 1f, dmg); - l.lines.add(new Vector2(x + Mathf.range(3f), y + Mathf.range(3f))); + l.lines.add(new Vec2(x + Mathf.range(3f), y + Mathf.range(3f))); if(l.lines.size > 1){ bhit[0] = false; diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/mindustry/entities/effect/Puddle.java similarity index 90% rename from core/src/io/anuke/mindustry/entities/effect/Puddle.java rename to core/src/mindustry/entities/effect/Puddle.java index e53e40e8dc..132c2d1379 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java +++ b/core/src/mindustry/entities/effect/Puddle.java @@ -1,34 +1,34 @@ -package io.anuke.mindustry.entities.effect; +package mindustry.entities.effect; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.Pool.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import arc.util.pooling.Pool.*; +import arc.util.pooling.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrait, SyncTrait{ private static final IntMap map = new IntMap<>(); private static final float maxLiquid = 70f; private static final int maxGeneration = 2; private static final Color tmp = new Color(); - private static final Rectangle rect = new Rectangle(); - private static final Rectangle rect2 = new Rectangle(); + private static final Rect rect = new Rect(); + private static final Rect rect2 = new Rect(); private static int seeds; private int loadedPosition = -1; @@ -151,13 +151,13 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai } @Override - public void hitbox(Rectangle rectangle){ - rectangle.setCenter(x, y).setSize(tilesize); + public void hitbox(Rect rect){ + rect.setCenter(x, y).setSize(tilesize); } @Override - public void hitboxTile(Rectangle rectangle){ - rectangle.setCenter(x, y).setSize(0f); + public void hitboxTile(Rect rect){ + rect.setCenter(x, y).setSize(0f); } @Override diff --git a/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java b/core/src/mindustry/entities/effect/RubbleDecal.java similarity index 77% rename from core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java rename to core/src/mindustry/entities/effect/RubbleDecal.java index 222d1355e4..1d26980dc0 100644 --- a/core/src/io/anuke/mindustry/entities/effect/RubbleDecal.java +++ b/core/src/mindustry/entities/effect/RubbleDecal.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.entities.effect; +package mindustry.entities.effect; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; +import arc.Core; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; -import static io.anuke.mindustry.Vars.headless; +import static mindustry.Vars.headless; public class RubbleDecal extends Decal{ private TextureRegion region; diff --git a/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java b/core/src/mindustry/entities/effect/ScorchDecal.java similarity index 78% rename from core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java rename to core/src/mindustry/entities/effect/ScorchDecal.java index 89f4eacf6f..e35cf7a7c0 100644 --- a/core/src/io/anuke/mindustry/entities/effect/ScorchDecal.java +++ b/core/src/mindustry/entities/effect/ScorchDecal.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.entities.effect; +package mindustry.entities.effect; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.world.Tile; +import arc.Core; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Angles; +import arc.math.Mathf; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.headless; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.headless; +import static mindustry.Vars.world; public class ScorchDecal extends Decal{ private static final int scorches = 5; diff --git a/core/src/io/anuke/mindustry/entities/traits/AbsorbTrait.java b/core/src/mindustry/entities/traits/AbsorbTrait.java similarity index 83% rename from core/src/io/anuke/mindustry/entities/traits/AbsorbTrait.java rename to core/src/mindustry/entities/traits/AbsorbTrait.java index d408296c7c..2dd31c487e 100644 --- a/core/src/io/anuke/mindustry/entities/traits/AbsorbTrait.java +++ b/core/src/mindustry/entities/traits/AbsorbTrait.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; public interface AbsorbTrait extends Entity, TeamTrait, DamageTrait{ void absorb(); diff --git a/core/src/io/anuke/mindustry/entities/traits/BelowLiquidTrait.java b/core/src/mindustry/entities/traits/BelowLiquidTrait.java similarity index 72% rename from core/src/io/anuke/mindustry/entities/traits/BelowLiquidTrait.java rename to core/src/mindustry/entities/traits/BelowLiquidTrait.java index c4abd8abf0..e5d54a5f58 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BelowLiquidTrait.java +++ b/core/src/mindustry/entities/traits/BelowLiquidTrait.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; /** * A flag interface for marking an effect as appearing below liquids. diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderMinerTrait.java b/core/src/mindustry/entities/traits/BuilderMinerTrait.java similarity index 91% rename from core/src/io/anuke/mindustry/entities/traits/BuilderMinerTrait.java rename to core/src/mindustry/entities/traits/BuilderMinerTrait.java index 5fbde29251..dff842212c 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderMinerTrait.java +++ b/core/src/mindustry/entities/traits/BuilderMinerTrait.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; /** A class for gracefully merging mining and building traits.*/ public interface BuilderMinerTrait extends MinerTrait, BuilderTrait{ diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/mindustry/entities/traits/BuilderTrait.java similarity index 93% rename from core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java rename to core/src/mindustry/entities/traits/BuilderTrait.java index c7ced76ec8..02ae0bca5b 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/mindustry/entities/traits/BuilderTrait.java @@ -1,27 +1,27 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.*; -import io.anuke.arc.collection.Queue; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.BuildBlock.*; +import arc.*; +import arc.struct.Queue; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.BuildBlock.*; import java.io.*; import java.util.*; -import static io.anuke.mindustry.Vars.*; -import static io.anuke.mindustry.entities.traits.BuilderTrait.BuildDataStatic.*; +import static mindustry.Vars.*; +import static mindustry.entities.traits.BuilderTrait.BuildDataStatic.*; /** Interface for units that build things.*/ public interface BuilderTrait extends Entity, TeamTrait{ @@ -229,7 +229,7 @@ public interface BuilderTrait extends Entity, TeamTrait{ //due to iOS weirdness, this is apparently required class BuildDataStatic{ - static Vector2[] tmptr = new Vector2[]{new Vector2(), new Vector2(), new Vector2(), new Vector2()}; + static Vec2[] tmptr = new Vec2[]{new Vec2(), new Vec2(), new Vec2(), new Vec2()}; } /** Draw placement effects for an entity. */ @@ -343,7 +343,7 @@ public interface BuilderTrait extends Entity, TeamTrait{ return this; } - public Rectangle bounds(Rectangle rect){ + public Rect bounds(Rect rect){ if(breaking){ return rect.set(-100f, -100f, 0f, 0f); }else{ diff --git a/core/src/io/anuke/mindustry/entities/traits/DamageTrait.java b/core/src/mindustry/entities/traits/DamageTrait.java similarity index 53% rename from core/src/io/anuke/mindustry/entities/traits/DamageTrait.java rename to core/src/mindustry/entities/traits/DamageTrait.java index fdb41472e8..13feb85e6e 100644 --- a/core/src/io/anuke/mindustry/entities/traits/DamageTrait.java +++ b/core/src/mindustry/entities/traits/DamageTrait.java @@ -1,6 +1,4 @@ -package io.anuke.mindustry.entities.traits; - -import io.anuke.mindustry.entities.type.*; +package mindustry.entities.traits; public interface DamageTrait{ float damage(); diff --git a/core/src/io/anuke/mindustry/entities/traits/DrawTrait.java b/core/src/mindustry/entities/traits/DrawTrait.java similarity index 73% rename from core/src/io/anuke/mindustry/entities/traits/DrawTrait.java rename to core/src/mindustry/entities/traits/DrawTrait.java index 648d9797b3..472b582c75 100644 --- a/core/src/io/anuke/mindustry/entities/traits/DrawTrait.java +++ b/core/src/mindustry/entities/traits/DrawTrait.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; public interface DrawTrait extends Entity{ diff --git a/core/src/io/anuke/mindustry/entities/traits/Entity.java b/core/src/mindustry/entities/traits/Entity.java similarity index 87% rename from core/src/io/anuke/mindustry/entities/traits/Entity.java rename to core/src/mindustry/entities/traits/Entity.java index 2de8e0e013..5b0416b69f 100644 --- a/core/src/io/anuke/mindustry/entities/traits/Entity.java +++ b/core/src/mindustry/entities/traits/Entity.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.mindustry.entities.EntityGroup; +import mindustry.entities.EntityGroup; public interface Entity extends MoveTrait{ diff --git a/core/src/io/anuke/mindustry/entities/traits/HealthTrait.java b/core/src/mindustry/entities/traits/HealthTrait.java similarity index 92% rename from core/src/io/anuke/mindustry/entities/traits/HealthTrait.java rename to core/src/mindustry/entities/traits/HealthTrait.java index 644e099e75..fb241e0d1b 100644 --- a/core/src/io/anuke/mindustry/entities/traits/HealthTrait.java +++ b/core/src/mindustry/entities/traits/HealthTrait.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.math.Mathf; +import arc.math.Mathf; public interface HealthTrait{ diff --git a/core/src/io/anuke/mindustry/entities/traits/KillerTrait.java b/core/src/mindustry/entities/traits/KillerTrait.java similarity index 59% rename from core/src/io/anuke/mindustry/entities/traits/KillerTrait.java rename to core/src/mindustry/entities/traits/KillerTrait.java index 17efa31c40..7be5f42882 100644 --- a/core/src/io/anuke/mindustry/entities/traits/KillerTrait.java +++ b/core/src/mindustry/entities/traits/KillerTrait.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; public interface KillerTrait{ void killed(Entity other); diff --git a/core/src/io/anuke/mindustry/entities/traits/MinerTrait.java b/core/src/mindustry/entities/traits/MinerTrait.java similarity index 70% rename from core/src/io/anuke/mindustry/entities/traits/MinerTrait.java rename to core/src/mindustry/entities/traits/MinerTrait.java index a312740804..5b3d51c21d 100644 --- a/core/src/io/anuke/mindustry/entities/traits/MinerTrait.java +++ b/core/src/mindustry/entities/traits/MinerTrait.java @@ -1,19 +1,20 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Tile; +import arc.Core; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.Time; +import mindustry.content.*; +import mindustry.entities.Effects; +import mindustry.entities.effect.*; +import mindustry.entities.type.*; +import mindustry.gen.Call; +import mindustry.graphics.*; +import mindustry.type.Item; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public interface MinerTrait extends Entity{ @@ -38,11 +39,26 @@ public interface MinerTrait extends Entity{ /** Returns whether or not this builder can mine a specific item type. */ boolean canMine(Item item); + /** @return whether to offload mined items immediately at the core. if false, items are collected and dropped in a burst. */ + default boolean offloadImmediately(){ + return false; + } + default void updateMining(){ Unit unit = (Unit)this; Tile tile = getMineTile(); TileEntity core = unit.getClosestCore(); + if(core != null && tile != null && tile.drop() != null && !unit.acceptsItem(tile.drop()) && unit.dst(core) < mineTransferRange){ + int accepted = core.tile.block().acceptStack(unit.item().item, unit.item().amount, core.tile, unit); + if(accepted > 0){ + Call.transferItemTo(unit.item().item, accepted, + tile.worldx() + Mathf.range(tilesize / 2f), + tile.worldy() + Mathf.range(tilesize / 2f), core.tile); + unit.clearItem(); + } + } + if(tile == null || core == null || tile.block() != Blocks.air || dst(tile.worldx(), tile.worldy()) > getMiningRange() || tile.drop() == null || !unit.acceptsItem(tile.drop()) || !canMine(tile.drop())){ setMineTile(null); @@ -52,12 +68,13 @@ public interface MinerTrait extends Entity{ if(Mathf.chance(Time.delta() * (0.06 - item.hardness * 0.01) * getMinePower())){ - if(unit.dst(core) < mineTransferRange && core.tile.block().acceptStack(item, 1, core.tile, unit) == 1){ + if(unit.dst(core) < mineTransferRange && core.tile.block().acceptStack(item, 1, core.tile, unit) == 1 && offloadImmediately()){ Call.transferItemTo(item, 1, tile.worldx() + Mathf.range(tilesize / 2f), tile.worldy() + Mathf.range(tilesize / 2f), core.tile); }else if(unit.acceptsItem(item)){ - Call.transferItemToUnit(item, + //this is clientside, since items are synced anyway + ItemTransfer.transferItemToUnit(item, tile.worldx() + Mathf.range(tilesize / 2f), tile.worldy() + Mathf.range(tilesize / 2f), unit); diff --git a/core/src/io/anuke/mindustry/entities/traits/MoveTrait.java b/core/src/mindustry/entities/traits/MoveTrait.java similarity index 77% rename from core/src/io/anuke/mindustry/entities/traits/MoveTrait.java rename to core/src/mindustry/entities/traits/MoveTrait.java index 561c7a76bd..f34abba24f 100644 --- a/core/src/io/anuke/mindustry/entities/traits/MoveTrait.java +++ b/core/src/mindustry/entities/traits/MoveTrait.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.math.geom.Position; +import arc.math.geom.Position; public interface MoveTrait extends Position{ diff --git a/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java b/core/src/mindustry/entities/traits/SaveTrait.java similarity index 74% rename from core/src/io/anuke/mindustry/entities/traits/SaveTrait.java rename to core/src/mindustry/entities/traits/SaveTrait.java index d992de766a..ee051dcd15 100644 --- a/core/src/io/anuke/mindustry/entities/traits/SaveTrait.java +++ b/core/src/mindustry/entities/traits/SaveTrait.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; /** * Marks an entity as serializable. diff --git a/core/src/io/anuke/mindustry/entities/traits/Saveable.java b/core/src/mindustry/entities/traits/Saveable.java similarity index 80% rename from core/src/io/anuke/mindustry/entities/traits/Saveable.java rename to core/src/mindustry/entities/traits/Saveable.java index b0d22e6a34..801e4ab426 100644 --- a/core/src/io/anuke/mindustry/entities/traits/Saveable.java +++ b/core/src/mindustry/entities/traits/Saveable.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; import java.io.*; diff --git a/core/src/io/anuke/mindustry/entities/traits/ScaleTrait.java b/core/src/mindustry/entities/traits/ScaleTrait.java similarity index 90% rename from core/src/io/anuke/mindustry/entities/traits/ScaleTrait.java rename to core/src/mindustry/entities/traits/ScaleTrait.java index 9975bb12a8..2a572659b2 100644 --- a/core/src/io/anuke/mindustry/entities/traits/ScaleTrait.java +++ b/core/src/mindustry/entities/traits/ScaleTrait.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.math.Interpolation; +import arc.math.Interpolation; public interface ScaleTrait{ /** 0 to 1. */ diff --git a/core/src/io/anuke/mindustry/entities/traits/ShooterTrait.java b/core/src/mindustry/entities/traits/ShooterTrait.java similarity index 57% rename from core/src/io/anuke/mindustry/entities/traits/ShooterTrait.java rename to core/src/mindustry/entities/traits/ShooterTrait.java index ca3010eec3..bb20ccc83c 100644 --- a/core/src/io/anuke/mindustry/entities/traits/ShooterTrait.java +++ b/core/src/mindustry/entities/traits/ShooterTrait.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.util.Interval; -import io.anuke.mindustry.type.Weapon; +import arc.util.Interval; +import mindustry.type.Weapon; public interface ShooterTrait extends VelocityTrait, TeamTrait{ diff --git a/core/src/io/anuke/mindustry/entities/traits/SolidTrait.java b/core/src/mindustry/entities/traits/SolidTrait.java similarity index 67% rename from core/src/io/anuke/mindustry/entities/traits/SolidTrait.java rename to core/src/mindustry/entities/traits/SolidTrait.java index 5ebf8105f3..afa2efd6b0 100644 --- a/core/src/io/anuke/mindustry/entities/traits/SolidTrait.java +++ b/core/src/mindustry/entities/traits/SolidTrait.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.math.geom.QuadTree.QuadTreeObject; -import io.anuke.mindustry.Vars; +import arc.math.geom.*; +import arc.math.geom.QuadTree.QuadTreeObject; +import mindustry.Vars; public interface SolidTrait extends QuadTreeObject, MoveTrait, VelocityTrait, Entity, Position{ - void hitbox(Rectangle rectangle); + void hitbox(Rect rect); - void hitboxTile(Rectangle rectangle); + void hitboxTile(Rect rect); - Vector2 lastPosition(); + Vec2 lastPosition(); default boolean collidesGrid(int x, int y){ return true; diff --git a/core/src/io/anuke/mindustry/entities/traits/SpawnerTrait.java b/core/src/mindustry/entities/traits/SpawnerTrait.java similarity index 61% rename from core/src/io/anuke/mindustry/entities/traits/SpawnerTrait.java rename to core/src/mindustry/entities/traits/SpawnerTrait.java index c890d4cbfc..3eeee072e5 100644 --- a/core/src/io/anuke/mindustry/entities/traits/SpawnerTrait.java +++ b/core/src/mindustry/entities/traits/SpawnerTrait.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.math.geom.Position; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.world.Tile; +import arc.math.geom.Position; +import mindustry.entities.type.*; +import mindustry.world.Tile; public interface SpawnerTrait extends TargetTrait, Position{ Tile getTile(); diff --git a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java b/core/src/mindustry/entities/traits/SyncTrait.java similarity index 93% rename from core/src/io/anuke/mindustry/entities/traits/SyncTrait.java rename to core/src/mindustry/entities/traits/SyncTrait.java index 7a25c9c1ed..29da740bc0 100644 --- a/core/src/io/anuke/mindustry/entities/traits/SyncTrait.java +++ b/core/src/mindustry/entities/traits/SyncTrait.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.mindustry.net.Interpolator; +import mindustry.net.Interpolator; import java.io.*; diff --git a/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java b/core/src/mindustry/entities/traits/TargetTrait.java similarity index 84% rename from core/src/io/anuke/mindustry/entities/traits/TargetTrait.java rename to core/src/mindustry/entities/traits/TargetTrait.java index 819e9dbcdc..1544b8d057 100644 --- a/core/src/io/anuke/mindustry/entities/traits/TargetTrait.java +++ b/core/src/mindustry/entities/traits/TargetTrait.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.math.geom.Position; -import io.anuke.mindustry.game.Team; +import arc.math.geom.Position; +import mindustry.game.Team; /** * Base interface for targetable entities. diff --git a/core/src/mindustry/entities/traits/TeamTrait.java b/core/src/mindustry/entities/traits/TeamTrait.java new file mode 100644 index 0000000000..f4424149af --- /dev/null +++ b/core/src/mindustry/entities/traits/TeamTrait.java @@ -0,0 +1,7 @@ +package mindustry.entities.traits; + +import mindustry.game.Team; + +public interface TeamTrait extends Entity{ + Team getTeam(); +} diff --git a/core/src/io/anuke/mindustry/entities/traits/TimeTrait.java b/core/src/mindustry/entities/traits/TimeTrait.java similarity index 77% rename from core/src/io/anuke/mindustry/entities/traits/TimeTrait.java rename to core/src/mindustry/entities/traits/TimeTrait.java index 47dc7dfe48..cf89d7dca8 100644 --- a/core/src/io/anuke/mindustry/entities/traits/TimeTrait.java +++ b/core/src/mindustry/entities/traits/TimeTrait.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; +import arc.math.Mathf; +import arc.util.Time; public interface TimeTrait extends ScaleTrait, Entity{ diff --git a/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java b/core/src/mindustry/entities/traits/TypeTrait.java similarity index 94% rename from core/src/io/anuke/mindustry/entities/traits/TypeTrait.java rename to core/src/mindustry/entities/traits/TypeTrait.java index deddefe7ed..00917194fc 100644 --- a/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java +++ b/core/src/mindustry/entities/traits/TypeTrait.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.mindustry.type.TypeID; +import mindustry.type.TypeID; public interface TypeTrait{ diff --git a/core/src/io/anuke/mindustry/entities/traits/VelocityTrait.java b/core/src/mindustry/entities/traits/VelocityTrait.java similarity index 83% rename from core/src/io/anuke/mindustry/entities/traits/VelocityTrait.java rename to core/src/mindustry/entities/traits/VelocityTrait.java index e5bddaed43..6eb42254d7 100644 --- a/core/src/io/anuke/mindustry/entities/traits/VelocityTrait.java +++ b/core/src/mindustry/entities/traits/VelocityTrait.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.entities.traits; +package mindustry.entities.traits; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; +import arc.math.geom.Vec2; +import arc.util.Time; public interface VelocityTrait extends MoveTrait{ - Vector2 velocity(); + Vec2 velocity(); default void applyImpulse(float x, float y){ velocity().x += x / mass(); diff --git a/core/src/io/anuke/mindustry/entities/type/BaseEntity.java b/core/src/mindustry/entities/type/BaseEntity.java similarity index 87% rename from core/src/io/anuke/mindustry/entities/type/BaseEntity.java rename to core/src/mindustry/entities/type/BaseEntity.java index 97de965cfe..6aa4f0f8b7 100755 --- a/core/src/io/anuke/mindustry/entities/type/BaseEntity.java +++ b/core/src/mindustry/entities/type/BaseEntity.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.entities.type; +package mindustry.entities.type; -import io.anuke.mindustry.*; -import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.traits.Entity; +import mindustry.*; +import mindustry.entities.EntityGroup; +import mindustry.entities.traits.Entity; public abstract class BaseEntity implements Entity{ private static int lastid; diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/mindustry/entities/type/BaseUnit.java similarity index 84% rename from core/src/io/anuke/mindustry/entities/type/BaseUnit.java rename to core/src/mindustry/entities/type/BaseUnit.java index 6dfa7baa84..6062662e9b 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/mindustry/entities/type/BaseUnit.java @@ -1,34 +1,34 @@ -package io.anuke.mindustry.entities.type; +package mindustry.entities.type; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.type.TypeID; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.defense.DeflectorWall.*; -import io.anuke.mindustry.world.blocks.units.CommandCenter.*; -import io.anuke.mindustry.world.blocks.units.UnitFactory.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.ctype.ContentType; +import mindustry.entities.*; +import mindustry.entities.traits.*; +import mindustry.entities.units.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.type.TypeID; +import mindustry.ui.Cicon; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.defense.DeflectorWall.*; +import mindustry.world.blocks.units.CommandCenter.*; +import mindustry.world.blocks.units.UnitFactory.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Base class for AI units. */ public abstract class BaseUnit extends Unit implements ShooterTrait{ @@ -126,6 +126,11 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ this.team = team; } + /** @return whether this unit counts toward the enemy amount in the wave UI. */ + public boolean countsAsEnemy(){ + return true; + } + public UnitType getType(){ return type; } @@ -180,23 +185,16 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } } - public Tile getClosest(BlockFlag flag){ + public @Nullable Tile getClosest(BlockFlag flag){ return Geometry.findClosest(x, y, indexer.getAllied(team, flag)); } - public Tile getClosestSpawner(){ + public @Nullable Tile getClosestSpawner(){ return Geometry.findClosest(x, y, Vars.spawner.getGroundSpawns()); } - public TileEntity getClosestEnemyCore(){ - for(Team enemy : Vars.state.teams.enemiesOf(team)){ - Tile tile = Geometry.findClosest(x, y, Vars.state.teams.get(enemy).cores); - if(tile != null){ - return tile.entity; - } - } - - return null; + public @Nullable TileEntity getClosestEnemyCore(){ + return Vars.state.teams.closestEnemyCore(x, y, team); } public UnitState getStartState(){ @@ -354,18 +352,18 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } @Override - public void hitbox(Rectangle rectangle){ - rectangle.setSize(type.hitsize).setCenter(x, y); + public void hitbox(Rect rect){ + rect.setSize(type.hitsize).setCenter(x, y); } @Override - public void hitboxTile(Rectangle rectangle){ - rectangle.setSize(type.hitsizeTile).setCenter(x, y); + public void hitboxTile(Rect rect){ + rect.setSize(type.hitsizeTile).setCenter(x, y); } @Override public EntityGroup targetGroup(){ - return unitGroups[team.ordinal()]; + return unitGroup; } @Override diff --git a/core/src/io/anuke/mindustry/entities/type/Bullet.java b/core/src/mindustry/entities/type/Bullet.java similarity index 90% rename from core/src/io/anuke/mindustry/entities/type/Bullet.java rename to core/src/mindustry/entities/type/Bullet.java index abf7952aeb..f7e676ecc9 100644 --- a/core/src/io/anuke/mindustry/entities/type/Bullet.java +++ b/core/src/mindustry/entities/type/Bullet.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.entities.type; +package mindustry.entities.type; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.Pool.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; +import mindustry.annotations.Annotations.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import arc.util.pooling.Pool.*; +import arc.util.pooling.*; +import mindustry.entities.*; +import mindustry.entities.bullet.*; +import mindustry.entities.effect.*; +import mindustry.entities.traits.*; +import mindustry.game.*; +import mindustry.graphics.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Poolable, DrawTrait, VelocityTrait, TimeTrait, TeamTrait, AbsorbTrait{ public Interval timer = new Interval(3); @@ -56,7 +56,7 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool bullet.velocity.set(0, type.speed).setAngle(angle).scl(velocityScl); if(type.keepVelocity){ - bullet.velocity.add(owner instanceof VelocityTrait ? ((VelocityTrait)owner).velocity() : Vector2.ZERO); + bullet.velocity.add(owner instanceof VelocityTrait ? ((VelocityTrait)owner).velocity() : Vec2.ZERO); } bullet.team = team; @@ -246,13 +246,13 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool } @Override - public void hitbox(Rectangle rectangle){ - rectangle.setSize(type.hitSize).setCenter(x, y); + public void hitbox(Rect rect){ + rect.setSize(type.hitSize).setCenter(x, y); } @Override - public void hitboxTile(Rectangle rectangle){ - rectangle.setSize(type.hitSize).setCenter(x, y); + public void hitboxTile(Rect rect){ + rect.setSize(type.hitSize).setCenter(x, y); } @Override @@ -297,7 +297,7 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool } @Override - public Vector2 velocity(){ + public Vec2 velocity(){ return velocity; } diff --git a/core/src/io/anuke/mindustry/entities/type/DestructibleEntity.java b/core/src/mindustry/entities/type/DestructibleEntity.java similarity index 91% rename from core/src/io/anuke/mindustry/entities/type/DestructibleEntity.java rename to core/src/mindustry/entities/type/DestructibleEntity.java index 1db9308eef..99efe3b00c 100644 --- a/core/src/io/anuke/mindustry/entities/type/DestructibleEntity.java +++ b/core/src/mindustry/entities/type/DestructibleEntity.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.entities.type; +package mindustry.entities.type; -import io.anuke.mindustry.entities.traits.*; +import mindustry.entities.traits.*; public abstract class DestructibleEntity extends SolidEntity implements HealthTrait{ public transient boolean dead; diff --git a/core/src/io/anuke/mindustry/entities/type/EffectEntity.java b/core/src/mindustry/entities/type/EffectEntity.java similarity index 76% rename from core/src/io/anuke/mindustry/entities/type/EffectEntity.java rename to core/src/mindustry/entities/type/EffectEntity.java index 33b2f47475..95f40d8100 100644 --- a/core/src/io/anuke/mindustry/entities/type/EffectEntity.java +++ b/core/src/mindustry/entities/type/EffectEntity.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.entities.type; +package mindustry.entities.type; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.util.pooling.Pool.Poolable; -import io.anuke.arc.util.pooling.Pools; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.traits.DrawTrait; -import io.anuke.mindustry.entities.traits.Entity; +import arc.graphics.Color; +import arc.util.pooling.Pool.Poolable; +import arc.util.pooling.Pools; +import mindustry.entities.Effects; +import mindustry.entities.Effects.Effect; +import mindustry.entities.EntityGroup; +import mindustry.entities.traits.DrawTrait; +import mindustry.entities.traits.Entity; -import static io.anuke.mindustry.Vars.effectGroup; +import static mindustry.Vars.effectGroup; public class EffectEntity extends TimedEntity implements Poolable, DrawTrait{ public Effect effect; diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/mindustry/entities/type/Player.java similarity index 92% rename from core/src/io/anuke/mindustry/entities/type/Player.java rename to core/src/mindustry/entities/type/Player.java index 45405aad70..79bb9a0bbd 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/mindustry/entities/type/Player.java @@ -1,37 +1,37 @@ -package io.anuke.mindustry.entities.type; +package mindustry.entities.type; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.net.Administration.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import arc.util.pooling.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.core.*; +import mindustry.ctype.ContentType; +import mindustry.entities.*; +import mindustry.entities.traits.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.input.*; +import mindustry.io.*; +import mindustry.net.Administration.*; +import mindustry.net.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public static final int timerSync = 2; @@ -41,15 +41,14 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ private static final int timerShootRight = 1; private static final float liftoffBoost = 0.2f; - private static final Rectangle rect = new Rectangle(); + private static final Rect rect = new Rect(); //region instance variables public float baseRotation; public float pointerX, pointerY; public String name = "noname"; - public @Nullable - String uuid, usid; + public @Nullable String uuid, usid; public boolean isAdmin, isTransferring, isShooting, isBoosting, isMobile, isTyping, isBuilding = true; public boolean buildWasAutoPaused = false; public float boostHeat, shootHeat, destructTime; @@ -71,7 +70,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ private float walktime, itemtime; private Queue placeQueue = new Queue<>(); private Tile mining; - private Vector2 movement = new Vector2(); + private Vec2 movement = new Vec2(); private boolean moved; //endregion @@ -93,13 +92,13 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ } @Override - public void hitbox(Rectangle rectangle){ - rectangle.setSize(mech.hitsize).setCenter(x, y); + public void hitbox(Rect rect){ + rect.setSize(mech.hitsize).setCenter(x, y); } @Override - public void hitboxTile(Rectangle rectangle){ - rectangle.setSize(mech.hitsize * 2f / 3f).setCenter(x, y); + public void hitboxTile(Rect rect){ + rect.setSize(mech.hitsize * 2f / 3f).setCenter(x, y); } @Override @@ -119,6 +118,11 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ heal(); } + @Override + public boolean offloadImmediately(){ + return true; + } + @Override public TypeID getTypeID(){ return TypeIDs.player; @@ -345,13 +349,13 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ Draw.reset(); } + public void drawBackItems(){ + drawBackItems(itemtime, isLocal); + } + @Override public void drawStats(){ - Draw.color(Color.black, team.color, healthf() + Mathf.absin(Time.time(), healthf() * 5f, 1f - healthf())); - Draw.rect(getPowerCellRegion(), x + Angles.trnsx(rotation, mech.cellTrnsY, 0f), y + Angles.trnsy(rotation, mech.cellTrnsY, 0f), rotation - 90); - Draw.reset(); - drawBackItems(itemtime, isLocal); - drawLight(); + mech.drawStats(this); } @Override @@ -568,6 +572,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ protected void updateKeyboard(){ Tile tile = world.tileWorld(x, y); + boolean canMove = !Core.scene.hasKeyboard() || ui.minimapfrag.shown(); isBoosting = Core.input.keyDown(Binding.dash) && !mech.flying; @@ -594,18 +599,18 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ } if(Core.input.keyDown(Binding.mouse_move)){ - movement.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2) * 0.005f, -1, 1) * speed; - movement.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2) * 0.005f, -1, 1) * speed; + movement.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2f) * 0.005f, -1, 1) * speed; + movement.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2f) * 0.005f, -1, 1) * speed; } - Vector2 vec = Core.input.mouseWorld(control.input.getMouseX(), control.input.getMouseY()); + Vec2 vec = Core.input.mouseWorld(control.input.getMouseX(), control.input.getMouseY()); pointerX = vec.x; pointerY = vec.y; updateShooting(); movement.limit(speed).scl(Time.delta()); - if(!Core.scene.hasKeyboard()){ + if(canMove){ velocity.add(movement.x, movement.y); }else{ isShooting = false; @@ -614,7 +619,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ updateVelocityStatus(); moved = dst(prex, prey) > 0.001f; - if(!Core.scene.hasKeyboard()){ + if(canMove){ float baseLerp = mech.getRotationAlpha(this); if(!isShooting() || !mech.turnCursor){ if(!movement.isZero()){ @@ -631,7 +636,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ if(!state.isEditor() && isShooting() && mech.canShoot(this)){ if(!mech.turnCursor){ //shoot forward ignoring cursor - mech.weapon.update(this, x + Angles.trnsx(rotation, 1f), y + Angles.trnsy(rotation, 1f)); + mech.weapon.update(this, x + Angles.trnsx(rotation, mech.weapon.targetDistance), y + Angles.trnsy(rotation, mech.weapon.targetDistance)); }else{ mech.weapon.update(this, pointerX, pointerY); } @@ -738,7 +743,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f); } - Vector2 intercept = Predict.intercept(this, target, getWeapon().bullet.speed); + Vec2 intercept = Predict.intercept(this, target, getWeapon().bullet.speed); pointerX = intercept.x; pointerY = intercept.y; diff --git a/core/src/mindustry/entities/type/SolidEntity.java b/core/src/mindustry/entities/type/SolidEntity.java new file mode 100644 index 0000000000..d3d0685f3f --- /dev/null +++ b/core/src/mindustry/entities/type/SolidEntity.java @@ -0,0 +1,19 @@ +package mindustry.entities.type; + +import arc.math.geom.Vec2; +import mindustry.entities.traits.SolidTrait; + +public abstract class SolidEntity extends BaseEntity implements SolidTrait{ + protected transient Vec2 velocity = new Vec2(0f, 0.0001f); + private transient Vec2 lastPosition = new Vec2(); + + @Override + public Vec2 lastPosition(){ + return lastPosition; + } + + @Override + public Vec2 velocity(){ + return velocity; + } +} diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/mindustry/entities/type/TileEntity.java similarity index 85% rename from core/src/io/anuke/mindustry/entities/type/TileEntity.java rename to core/src/mindustry/entities/type/TileEntity.java index 8c9617b28b..cf5a2f4bdb 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/mindustry/entities/type/TileEntity.java @@ -1,26 +1,27 @@ -package io.anuke.mindustry.entities.type; +package mindustry.entities.type; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.Events; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.ObjectSet; -import io.anuke.arc.math.geom.Point2; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.traits.HealthTrait; -import io.anuke.mindustry.entities.traits.TargetTrait; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.EventType.BlockDestroyEvent; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.modules.*; +import arc.math.*; +import mindustry.annotations.Annotations.*; +import arc.Events; +import arc.struct.Array; +import arc.struct.ObjectSet; +import arc.math.geom.Point2; +import arc.math.geom.Vec2; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.EntityGroup; +import mindustry.entities.traits.HealthTrait; +import mindustry.entities.traits.TargetTrait; +import mindustry.game.*; +import mindustry.game.EventType.BlockDestroyEvent; +import mindustry.gen.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.modules.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ public static final float timeToSleep = 60f * 4; //4 seconds to fall asleep @@ -124,7 +125,8 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ @CallSuper public void write(DataOutput stream) throws IOException{ stream.writeShort((short)health); - stream.writeByte(Pack.byteByte(tile.getTeamID(), tile.rotation())); //team + rotation + stream.writeByte(Pack.byteByte((byte)8, tile.rotation())); //rotation + marker to indicate that team is moved (8 isn't valid) + stream.writeByte(tile.getTeamID()); if(items != null) items.write(stream); if(power != null) power.write(stream); if(liquids != null) liquids.write(stream); @@ -134,11 +136,11 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ @CallSuper public void read(DataInput stream, byte revision) throws IOException{ health = stream.readUnsignedShort(); - byte tr = stream.readByte(); - byte team = Pack.leftByte(tr); - byte rotation = Pack.rightByte(tr); + byte packedrot = stream.readByte(); + byte team = Pack.leftByte(packedrot) == 8 ? stream.readByte() : Pack.leftByte(packedrot); + byte rotation = Pack.rightByte(packedrot); - tile.setTeam(Team.all[team]); + tile.setTeam(Team.get(team)); tile.rotation(rotation); if(items != null) items.read(stream); @@ -164,9 +166,16 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ Call.onTileDestroyed(tile); } + @Override public void damage(float damage){ if(dead) return; + if(Mathf.zero(state.rules.blockHealthMultiplier)){ + damage = health + 1; + }else{ + damage /= state.rules.blockHealthMultiplier; + } + float preHealth = health; Call.onTileDamage(tile, health - block.handleDamage(tile, damage)); @@ -277,7 +286,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ Events.fire(new BlockDestroyEvent(tile)); block.breakSound.at(tile); block.onDestroyed(tile); - world.removeBlock(tile); + tile.remove(); remove(); } } @@ -288,8 +297,8 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ } @Override - public Vector2 velocity(){ - return Vector2.ZERO; + public Vec2 velocity(){ + return Vec2.ZERO; } @Override diff --git a/core/src/io/anuke/mindustry/entities/type/TimedEntity.java b/core/src/mindustry/entities/type/TimedEntity.java similarity index 71% rename from core/src/io/anuke/mindustry/entities/type/TimedEntity.java rename to core/src/mindustry/entities/type/TimedEntity.java index dbd74260fe..413b1c3fd5 100644 --- a/core/src/io/anuke/mindustry/entities/type/TimedEntity.java +++ b/core/src/mindustry/entities/type/TimedEntity.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.entities.type; +package mindustry.entities.type; -import io.anuke.arc.util.pooling.Pool.Poolable; -import io.anuke.mindustry.entities.traits.ScaleTrait; -import io.anuke.mindustry.entities.traits.TimeTrait; +import arc.util.pooling.Pool.Poolable; +import mindustry.entities.traits.ScaleTrait; +import mindustry.entities.traits.TimeTrait; public abstract class TimedEntity extends BaseEntity implements ScaleTrait, TimeTrait, Poolable{ public float time; diff --git a/core/src/io/anuke/mindustry/entities/type/Unit.java b/core/src/mindustry/entities/type/Unit.java similarity index 88% rename from core/src/io/anuke/mindustry/entities/type/Unit.java rename to core/src/mindustry/entities/type/Unit.java index 73dec77656..42463dc508 100644 --- a/core/src/io/anuke/mindustry/entities/type/Unit.java +++ b/core/src/mindustry/entities/type/Unit.java @@ -1,34 +1,32 @@ -package io.anuke.mindustry.entities.type; +package mindustry.entities.type; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Teams.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.effect.*; +import mindustry.entities.traits.*; +import mindustry.entities.units.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.net.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public abstract class Unit extends DestructibleEntity implements SaveTrait, TargetTrait, SyncTrait, DrawTrait, TeamTrait{ /** Total duration of hit flash effect */ @@ -39,7 +37,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public static final float maxAbsVelocity = 127f / velocityPercision; public static final int noSpawner = Pos.get(-1, 1); - private static final Vector2 moveVector = new Vector2(); + private static final Vec2 moveVector = new Vec2(); public float rotation; @@ -90,7 +88,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ if(isDead()) return false; if(other instanceof DamageTrait){ - return other instanceof TeamTrait && state.teams.areEnemies((((TeamTrait)other).getTeam()), team); + return other instanceof TeamTrait && (((TeamTrait)other).getTeam()).isEnemy(team); }else{ return other instanceof Unit && ((Unit)other).isFlying() == isFlying(); } @@ -118,7 +116,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ } @Override - public Vector2 velocity(){ + public Vec2 velocity(){ return velocity; } @@ -158,7 +156,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ this.item.amount = itemAmount; this.item.item = content.item(itemID); this.dead = dead; - this.team = Team.all[team]; + this.team = Team.get(team); this.health = health; this.x = x; this.y = y; @@ -169,7 +167,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public void writeSave(DataOutput stream, boolean net) throws IOException{ if(item.item == null) item.item = Items.copper; - stream.writeByte(team.ordinal()); + stream.writeByte(team.id); stream.writeBoolean(isDead()); stream.writeFloat(net ? interpolator.target.x : x); stream.writeFloat(net ? interpolator.target.y : y); @@ -217,13 +215,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ float fsize = getSize() / radScl; moveVector.setZero(); float cx = x - fsize/2f, cy = y - fsize/2f; - - for(Team team : Team.all){ - if(team != getTeam() || !(this instanceof Player)){ - avoid(unitGroups[team.ordinal()].intersect(cx, cy, fsize, fsize)); - } - } - + avoid(unitGroup.intersect(cx, cy, fsize, fsize)); if(!(this instanceof Player)){ avoid(playerGroup.intersect(cx, cy, fsize, fsize)); } @@ -234,7 +226,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ float radScl = 1.5f; for(Unit en : arr){ - if(en.isFlying() != isFlying() || (en instanceof Player && en.getTeam() != getTeam())) continue; + if(en.isFlying() != isFlying() || (en instanceof Player && en.getTeam() != getTeam()) || (this instanceof Player && en.isFlying())) continue; float dst = dst(en); float scl = Mathf.clamp(1f - dst / (getSize()/(radScl*2f) + en.getSize()/(radScl*2f))); moveVector.add(Tmp.v1.set((x - en.x) * scl, (y - en.y) * scl).limit(0.4f)); @@ -242,14 +234,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ } public @Nullable TileEntity getClosestCore(){ - TeamData data = state.teams.get(team); - - Tile tile = Geometry.findClosest(x, y, data.cores); - if(tile == null){ - return null; - }else{ - return tile.entity; - } + return state.teams.closestCore(x, y, team); } public Floor getFloorOn(){ @@ -267,6 +252,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ Tile tile = world.tileWorld(x, y); status.update(this); + item.amount = Mathf.clamp(this.item.amount, 0, getItemCapacity()); velocity.limit(maxVelocity()).scl(1f + (status.getSpeedMultiplier() - 1f) * Time.delta()); @@ -275,7 +261,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ } //apply knockback based on spawns - if(getTeam() != waveTeam){ + if(getTeam() != state.rules.waveTeam){ float relativeSize = state.rules.dropZoneRadius + getSize()/2f + 1f; for(Tile spawn : spawner.getGroundSpawns()){ if(withinDst(spawn.worldx(), spawn.worldy(), relativeSize)){ @@ -356,6 +342,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public void addItem(Item item, int amount){ this.item.amount = this.item.item == item ? this.item.amount + amount : amount; this.item.item = item; + this.item.amount = Mathf.clamp(this.item.amount, 0, getItemCapacity()); } public void clearItem(){ diff --git a/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java b/core/src/mindustry/entities/type/base/BaseDrone.java similarity index 84% rename from core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java rename to core/src/mindustry/entities/type/base/BaseDrone.java index a6a4d0dbfa..02a8fd9d32 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java +++ b/core/src/mindustry/entities/type/base/BaseDrone.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.entities.type.base; +package mindustry.entities.type.base; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Geometry; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockFlag; +import arc.math.Mathf; +import arc.math.geom.Geometry; +import mindustry.entities.units.*; +import mindustry.world.Tile; +import mindustry.world.meta.BlockFlag; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public abstract class BaseDrone extends FlyingUnit{ public final UnitState retreat = new UnitState(){ @@ -32,6 +32,10 @@ public abstract class BaseDrone extends FlyingUnit{ } }; + public boolean countsAsEnemy(){ + return false; + } + @Override public void onCommand(UnitCommand command){ //do nothing, normal commands are not applicable here diff --git a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java b/core/src/mindustry/entities/type/base/BuilderDrone.java similarity index 90% rename from core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java rename to core/src/mindustry/entities/type/base/BuilderDrone.java index fdaaa049dd..336be7be6e 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java +++ b/core/src/mindustry/entities/type/base/BuilderDrone.java @@ -1,23 +1,22 @@ -package io.anuke.mindustry.entities.type.base; +package mindustry.entities.type.base; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Teams.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.BuildBlock.*; +import arc.*; +import arc.math.*; +import arc.struct.*; +import arc.util.*; +import mindustry.entities.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.entities.units.*; +import mindustry.game.EventType.*; +import mindustry.game.Teams.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.BuildBlock.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class BuilderDrone extends BaseDrone implements BuilderTrait{ private static final StaticReset reset = new StaticReset(); @@ -114,12 +113,10 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ public BuilderDrone(){ if(reset.check()){ Events.on(BuildSelectEvent.class, event -> { - EntityGroup group = unitGroups[event.team.ordinal()]; - if(!(event.tile.entity instanceof BuildEntity)) return; - for(BaseUnit unit : group.all()){ - if(unit instanceof BuilderDrone){ + for(BaseUnit unit : unitGroup.all()){ + if(unit instanceof BuilderDrone && unit.getTeam() == getTeam()){ BuilderDrone drone = (BuilderDrone)unit; if(drone.isBuilding()){ //stop building if opposite building begins. @@ -189,7 +186,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ } if(timer.get(timerTarget, 80) && Units.closestEnemy(getTeam(), x, y, 100f, u -> !(u instanceof BaseDrone)) == null && !isBuilding()){ - TeamData data = Vars.state.teams.get(team); + TeamData data = team.data(); if(!data.brokenBlocks.isEmpty()){ BrokenBlock block = data.brokenBlocks.removeLast(); if(Build.validPlace(getTeam(), block.x, block.y, content.block(block.block), block.rotation)){ diff --git a/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java b/core/src/mindustry/entities/type/base/FlyingUnit.java similarity index 92% rename from core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java rename to core/src/mindustry/entities/type/base/FlyingUnit.java index 017ebad34f..35473b7a4e 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java +++ b/core/src/mindustry/entities/type/base/FlyingUnit.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.entities.type.base; +package mindustry.entities.type.base; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.*; +import mindustry.entities.*; +import mindustry.entities.bullet.*; +import mindustry.entities.type.*; +import mindustry.entities.units.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class FlyingUnit extends BaseUnit{ protected float[] weaponAngles = {0,0}; @@ -65,7 +65,7 @@ public class FlyingUnit extends BaseUnit{ getWeapon().update(FlyingUnit.this, wx + Tmp.v2.x, wy + Tmp.v2.y, weaponAngles[wi], left); } }else{ - Vector2 to = Predict.intercept(FlyingUnit.this, target, ammo.speed); + Vec2 to = Predict.intercept(FlyingUnit.this, target, ammo.speed); getWeapon().update(FlyingUnit.this, to.x, to.y); } } diff --git a/core/src/io/anuke/mindustry/entities/type/base/GroundUnit.java b/core/src/mindustry/entities/type/base/GroundUnit.java similarity index 87% rename from core/src/io/anuke/mindustry/entities/type/base/GroundUnit.java rename to core/src/mindustry/entities/type/base/GroundUnit.java index c35c6c1528..56ba404a30 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/GroundUnit.java +++ b/core/src/mindustry/entities/type/base/GroundUnit.java @@ -1,26 +1,26 @@ -package io.anuke.mindustry.entities.type.base; +package mindustry.entities.type.base; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.ai.Pathfinder.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.*; +import mindustry.ai.Pathfinder.*; +import mindustry.entities.*; +import mindustry.entities.bullet.*; +import mindustry.entities.type.*; +import mindustry.entities.units.*; +import mindustry.game.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class GroundUnit extends BaseUnit{ - protected static Vector2 vec = new Vector2(); + protected static Vec2 vec = new Vec2(); protected float walkTime; protected float stuckTime; @@ -175,7 +175,7 @@ public class GroundUnit extends BaseUnit{ if(Angles.near(angleTo(target), rotation, 13f)){ BulletType ammo = getWeapon().bullet; - Vector2 to = Predict.intercept(GroundUnit.this, target, ammo.speed); + Vec2 to = Predict.intercept(GroundUnit.this, target, ammo.speed); getWeapon().update(GroundUnit.this, to.x, to.y); } @@ -237,15 +237,15 @@ public class GroundUnit extends BaseUnit{ protected void moveAwayFromCore(){ Team enemy = null; - for(Team team : Vars.state.teams.enemiesOf(team)){ - if(Vars.state.teams.isActive(team)){ + for(Team team : team.enemies()){ + if(team.active()){ enemy = team; break; } } if(enemy == null){ - for(Team team : Vars.state.teams.enemiesOf(team)){ + for(Team team : team.enemies()){ enemy = team; break; } diff --git a/core/src/io/anuke/mindustry/entities/type/base/HoverUnit.java b/core/src/mindustry/entities/type/base/HoverUnit.java similarity index 82% rename from core/src/io/anuke/mindustry/entities/type/base/HoverUnit.java rename to core/src/mindustry/entities/type/base/HoverUnit.java index 6aae538484..a1dfd25819 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/HoverUnit.java +++ b/core/src/mindustry/entities/type/base/HoverUnit.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.entities.type.base; +package mindustry.entities.type.base; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.entities.Units; +import arc.graphics.g2d.Draw; +import arc.math.Angles; +import arc.math.Mathf; +import mindustry.entities.Units; public class HoverUnit extends FlyingUnit{ diff --git a/core/src/io/anuke/mindustry/entities/type/base/MinerDrone.java b/core/src/mindustry/entities/type/base/MinerDrone.java similarity index 88% rename from core/src/io/anuke/mindustry/entities/type/base/MinerDrone.java rename to core/src/mindustry/entities/type/base/MinerDrone.java index 2d90b8a604..5c10983577 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/MinerDrone.java +++ b/core/src/mindustry/entities/type/base/MinerDrone.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.entities.type.base; +package mindustry.entities.type.base; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Structs; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.entities.traits.MinerTrait; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.entities.units.UnitState; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.ItemType; -import io.anuke.mindustry.world.Pos; -import io.anuke.mindustry.world.Tile; +import arc.math.Mathf; +import arc.util.Structs; +import mindustry.content.Blocks; +import mindustry.entities.traits.MinerTrait; +import mindustry.entities.type.TileEntity; +import mindustry.entities.units.UnitState; +import mindustry.gen.Call; +import mindustry.type.Item; +import mindustry.type.ItemType; +import mindustry.world.Pos; +import mindustry.world.Tile; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** A drone that only mines.*/ public class MinerDrone extends BaseDrone implements MinerTrait{ diff --git a/core/src/io/anuke/mindustry/entities/type/base/RepairDrone.java b/core/src/mindustry/entities/type/base/RepairDrone.java similarity index 82% rename from core/src/io/anuke/mindustry/entities/type/base/RepairDrone.java rename to core/src/mindustry/entities/type/base/RepairDrone.java index be16cd1724..a796d6eddc 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/RepairDrone.java +++ b/core/src/mindustry/entities/type/base/RepairDrone.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.entities.type.base; +package mindustry.entities.type.base; -import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.entities.units.UnitState; -import io.anuke.mindustry.world.Pos; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.*; +import mindustry.entities.Units; +import mindustry.entities.type.TileEntity; +import mindustry.entities.units.UnitState; +import mindustry.world.Pos; +import mindustry.world.Tile; +import mindustry.world.blocks.*; import java.io.*; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.world; public class RepairDrone extends BaseDrone{ public final UnitState repair = new UnitState(){ diff --git a/core/src/io/anuke/mindustry/entities/units/StateMachine.java b/core/src/mindustry/entities/units/StateMachine.java similarity index 91% rename from core/src/io/anuke/mindustry/entities/units/StateMachine.java rename to core/src/mindustry/entities/units/StateMachine.java index 7ed555e7b6..18255cec1b 100644 --- a/core/src/io/anuke/mindustry/entities/units/StateMachine.java +++ b/core/src/mindustry/entities/units/StateMachine.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.units; +package mindustry.entities.units; public class StateMachine{ private UnitState state; diff --git a/core/src/io/anuke/mindustry/entities/units/Statuses.java b/core/src/mindustry/entities/units/Statuses.java similarity index 90% rename from core/src/io/anuke/mindustry/entities/units/Statuses.java rename to core/src/mindustry/entities/units/Statuses.java index 2d2da40f1f..637bbf1a55 100644 --- a/core/src/io/anuke/mindustry/entities/units/Statuses.java +++ b/core/src/mindustry/entities/units/Statuses.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.entities.units; +package mindustry.entities.units; -import io.anuke.arc.collection.Bits; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.type.*; +import arc.struct.Bits; +import arc.struct.*; +import arc.graphics.*; +import arc.util.*; +import arc.util.pooling.*; +import mindustry.content.*; +import mindustry.ctype.ContentType; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.type.*; import java.io.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; /** Class for controlling status effects on an entity. */ public class Statuses implements Saveable{ diff --git a/core/src/io/anuke/mindustry/entities/units/UnitCommand.java b/core/src/mindustry/entities/units/UnitCommand.java similarity index 81% rename from core/src/io/anuke/mindustry/entities/units/UnitCommand.java rename to core/src/mindustry/entities/units/UnitCommand.java index 654b3b0970..dccc5076f6 100644 --- a/core/src/io/anuke/mindustry/entities/units/UnitCommand.java +++ b/core/src/mindustry/entities/units/UnitCommand.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.entities.units; +package mindustry.entities.units; -import io.anuke.arc.*; +import arc.*; public enum UnitCommand{ attack, retreat, rally; diff --git a/core/src/io/anuke/mindustry/entities/units/UnitDrops.java b/core/src/mindustry/entities/units/UnitDrops.java similarity index 74% rename from core/src/io/anuke/mindustry/entities/units/UnitDrops.java rename to core/src/mindustry/entities/units/UnitDrops.java index 142f2f3d65..f57ff0a75d 100644 --- a/core/src/io/anuke/mindustry/entities/units/UnitDrops.java +++ b/core/src/mindustry/entities/units/UnitDrops.java @@ -1,19 +1,20 @@ -package io.anuke.mindustry.entities.units; +package mindustry.entities.units; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.Items; -import io.anuke.mindustry.entities.type.BaseUnit; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Item; +import arc.math.Mathf; +import mindustry.Vars; +import mindustry.content.Items; +import mindustry.entities.type.BaseUnit; +import mindustry.entities.type.TileEntity; +import mindustry.gen.Call; +import mindustry.type.Item; +import static mindustry.Vars.*; public class UnitDrops{ private static Item[] dropTable; public static void dropItems(BaseUnit unit){ //items only dropped in waves for enemy team - if(unit.getTeam() != Vars.waveTeam || !Vars.state.rules.unitDrops){ + if(unit.getTeam() != state.rules.waveTeam || !Vars.state.rules.unitDrops){ return; } diff --git a/core/src/io/anuke/mindustry/entities/units/UnitState.java b/core/src/mindustry/entities/units/UnitState.java similarity index 75% rename from core/src/io/anuke/mindustry/entities/units/UnitState.java rename to core/src/mindustry/entities/units/UnitState.java index 5c5f9c64a8..d64dd49446 100644 --- a/core/src/io/anuke/mindustry/entities/units/UnitState.java +++ b/core/src/mindustry/entities/units/UnitState.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.units; +package mindustry.entities.units; public interface UnitState{ default void entered(){ diff --git a/core/src/io/anuke/mindustry/game/DefaultWaves.java b/core/src/mindustry/game/DefaultWaves.java similarity index 97% rename from core/src/io/anuke/mindustry/game/DefaultWaves.java rename to core/src/mindustry/game/DefaultWaves.java index 7bf39a29b3..82fddd3a62 100644 --- a/core/src/io/anuke/mindustry/game/DefaultWaves.java +++ b/core/src/mindustry/game/DefaultWaves.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.collection.Array; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.type.ItemStack; +import arc.struct.Array; +import mindustry.content.*; +import mindustry.type.ItemStack; public class DefaultWaves{ private Array spawns; diff --git a/core/src/io/anuke/mindustry/game/Difficulty.java b/core/src/mindustry/game/Difficulty.java similarity index 89% rename from core/src/io/anuke/mindustry/game/Difficulty.java rename to core/src/mindustry/game/Difficulty.java index 3b65017ff3..7c2e20e15f 100644 --- a/core/src/io/anuke/mindustry/game/Difficulty.java +++ b/core/src/mindustry/game/Difficulty.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.Core; +import arc.Core; /** Presets for time between waves. Currently unused.*/ public enum Difficulty{ diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java similarity index 95% rename from core/src/io/anuke/mindustry/game/EventType.java rename to core/src/mindustry/game/EventType.java index 4459e6860c..365e8f2b7c 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.ctype.UnlockableContent; -import io.anuke.mindustry.entities.traits.BuilderTrait; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.Tile; +import arc.util.ArcAnnotate.*; +import mindustry.core.GameState.State; +import mindustry.ctype.UnlockableContent; +import mindustry.entities.traits.BuilderTrait; +import mindustry.entities.type.*; +import mindustry.entities.units.*; +import mindustry.type.*; +import mindustry.world.Tile; public class EventType{ @@ -28,7 +28,9 @@ public class EventType{ exclusionDeath, suicideBomb, openWiki, - teamCoreDamage + teamCoreDamage, + socketConfigChanged, + update } public static class WinEvent{} diff --git a/core/src/io/anuke/mindustry/game/Gamemode.java b/core/src/mindustry/game/Gamemode.java similarity index 92% rename from core/src/io/anuke/mindustry/game/Gamemode.java rename to core/src/mindustry/game/Gamemode.java index f448bb637f..3679ba0ad2 100644 --- a/core/src/io/anuke/mindustry/game/Gamemode.java +++ b/core/src/mindustry/game/Gamemode.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.*; -import io.anuke.arc.func.*; -import io.anuke.mindustry.maps.*; +import arc.*; +import arc.func.*; +import mindustry.maps.*; -import static io.anuke.mindustry.Vars.waveTeam; +import static mindustry.Vars.*; /** Defines preset rule sets. */ public enum Gamemode{ @@ -22,7 +22,7 @@ public enum Gamemode{ attack(rules -> { rules.unitDrops = true; rules.attackMode = true; - }, map -> map.teams.contains(waveTeam.ordinal())), + }, map -> map.teams.contains((int)state.rules.waveTeam.id)), pvp(rules -> { rules.pvp = true; rules.enemyCoreBuildRadius = 600f; diff --git a/core/src/io/anuke/mindustry/game/GlobalData.java b/core/src/mindustry/game/GlobalData.java similarity index 93% rename from core/src/io/anuke/mindustry/game/GlobalData.java rename to core/src/mindustry/game/GlobalData.java index d211683e2c..3dbf592a71 100644 --- a/core/src/io/anuke/mindustry/game/GlobalData.java +++ b/core/src/mindustry/game/GlobalData.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.io.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.type.*; +import arc.*; +import arc.struct.*; +import arc.files.*; +import arc.util.io.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.ctype.*; +import mindustry.game.EventType.*; +import mindustry.type.*; import java.io.*; import java.util.zip.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Stores player unlocks. Clientside only. */ public class GlobalData{ diff --git a/core/src/io/anuke/mindustry/game/LoopControl.java b/core/src/mindustry/game/LoopControl.java similarity index 86% rename from core/src/io/anuke/mindustry/game/LoopControl.java rename to core/src/mindustry/game/LoopControl.java index e69d3bd260..8e0a9f1801 100644 --- a/core/src/io/anuke/mindustry/game/LoopControl.java +++ b/core/src/mindustry/game/LoopControl.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.*; -import io.anuke.arc.audio.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.mindustry.*; +import arc.*; +import arc.audio.*; +import arc.struct.*; +import arc.math.*; +import arc.math.geom.*; +import mindustry.*; public class LoopControl{ private ObjectMap sounds = new ObjectMap<>(); @@ -53,7 +53,7 @@ public class LoopControl{ private class SoundData{ float volume; float total; - Vector2 sum = new Vector2(); + Vec2 sum = new Vec2(); int soundID; float curVolume; diff --git a/core/src/io/anuke/mindustry/game/MusicControl.java b/core/src/mindustry/game/MusicControl.java similarity index 89% rename from core/src/io/anuke/mindustry/game/MusicControl.java rename to core/src/mindustry/game/MusicControl.java index 16a3301ae3..26a44876ac 100644 --- a/core/src/io/anuke/mindustry/game/MusicControl.java +++ b/core/src/mindustry/game/MusicControl.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.*; -import io.anuke.arc.audio.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; +import arc.*; +import arc.audio.*; +import arc.struct.*; +import arc.math.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.core.GameState.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Controls playback of multiple music tracks.*/ public class MusicControl{ @@ -83,7 +83,7 @@ public class MusicControl{ /** Whether to play dark music.*/ private boolean isDark(){ - if(!state.teams.get(player.getTeam()).cores.isEmpty() && state.teams.get(player.getTeam()).cores.first().entity.healthf() < 0.85f){ + if(state.teams.get(player.getTeam()).hasCore() && state.teams.get(player.getTeam()).core().healthf() < 0.85f){ //core damaged -> dark return true; } @@ -94,7 +94,7 @@ public class MusicControl{ } //dark based on enemies - return Mathf.chance(state.enemies() / 70f + 0.1f); + return Mathf.chance(state.enemies / 70f + 0.1f); } /** Plays and fades in a music track. This must be called every frame. diff --git a/core/src/io/anuke/mindustry/game/Objective.java b/core/src/mindustry/game/Objective.java similarity index 77% rename from core/src/io/anuke/mindustry/game/Objective.java rename to core/src/mindustry/game/Objective.java index dcd1146a10..344fd728de 100644 --- a/core/src/io/anuke/mindustry/game/Objective.java +++ b/core/src/mindustry/game/Objective.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.game.Objectives.*; -import io.anuke.mindustry.type.*; +import arc.scene.ui.layout.*; +import arc.util.ArcAnnotate.*; +import mindustry.game.Objectives.*; +import mindustry.type.*; /** Defines a specific objective for a game. */ public interface Objective{ diff --git a/core/src/io/anuke/mindustry/game/Objectives.java b/core/src/mindustry/game/Objectives.java similarity index 92% rename from core/src/io/anuke/mindustry/game/Objectives.java rename to core/src/mindustry/game/Objectives.java index 340346bc13..82561fe4a2 100644 --- a/core/src/io/anuke/mindustry/game/Objectives.java +++ b/core/src/mindustry/game/Objectives.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.util.ArcAnnotate.*; +import mindustry.type.*; +import mindustry.world.*; /** Holds objective classes. */ public class Objectives{ diff --git a/core/src/io/anuke/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java similarity index 83% rename from core/src/io/anuke/mindustry/game/Rules.java rename to core/src/mindustry/game/Rules.java index dbafda9579..0515d2ca60 100644 --- a/core/src/io/anuke/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.graphics.*; +import mindustry.content.*; +import mindustry.io.*; +import mindustry.type.*; +import mindustry.world.*; /** * Defines current rules on how the game should function. @@ -34,6 +34,8 @@ public class Rules{ public float unitHealthMultiplier = 1f; /** How much health players start with. */ public float playerHealthMultiplier = 1f; + /** How much health blocks start with. */ + public float blockHealthMultiplier = 1f; /** How much damage player mechs deal. */ public float playerDamageMultiplier = 1f; /** How much damage any other units deal. */ @@ -70,6 +72,8 @@ public class Rules{ public boolean editor = false; /** Whether the tutorial is enabled. False by default. */ public boolean tutorial = false; + /** Whether a gameover can happen at all. Set this to false to implement custom gameover conditions. */ + public boolean canGameOver = true; /** Starting items put in cores */ public Array loadout = Array.with(ItemStack.with(Items.copper, 100)); /** Blocks that cannot be placed. */ @@ -78,6 +82,12 @@ public class Rules{ public boolean lighting = false; /** Ambient light color, used when lighting is enabled. */ public Color ambientLight = new Color(0.01f, 0.01f, 0.04f, 0.99f); + /** team of the player by default */ + public Team defaultTeam = Team.sharded; + /** team of the enemy in waves/sectors */ + public Team waveTeam = Team.crux; + /** special tags for additional info */ + public StringMap tags = new StringMap(); /** Copies this ruleset exactly. Not very efficient at all, do not use often. */ public Rules copy(){ diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/mindustry/game/Saves.java similarity index 93% rename from core/src/io/anuke/mindustry/game/Saves.java rename to core/src/mindustry/game/Saves.java index 911fb5d558..cd3389d1f0 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/mindustry/game/Saves.java @@ -1,25 +1,25 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.*; -import io.anuke.arc.assets.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.async.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.io.SaveIO.*; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.type.*; +import arc.*; +import arc.assets.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.util.*; +import arc.util.async.*; +import mindustry.*; +import mindustry.core.GameState.*; +import mindustry.game.EventType.*; +import mindustry.io.*; +import mindustry.io.SaveIO.*; +import mindustry.maps.Map; +import mindustry.type.*; import java.io.*; import java.text.*; import java.util.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Saves{ private Array saves = new Array<>(); diff --git a/core/src/io/anuke/mindustry/game/Schematic.java b/core/src/mindustry/game/Schematic.java similarity index 88% rename from core/src/io/anuke/mindustry/game/Schematic.java rename to core/src/mindustry/game/Schematic.java index 32395fcf54..602e579828 100644 --- a/core/src/io/anuke/mindustry/game/Schematic.java +++ b/core/src/mindustry/game/Schematic.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.collection.*; -import io.anuke.arc.collection.IntIntMap.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.storage.*; +import arc.struct.*; +import arc.struct.IntIntMap.*; +import arc.files.*; +import arc.util.ArcAnnotate.*; +import mindustry.*; +import mindustry.mod.Mods.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.storage.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Schematic implements Publishable, Comparable{ public final Array tiles; diff --git a/core/src/io/anuke/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java similarity index 91% rename from core/src/io/anuke/mindustry/game/Schematics.java rename to core/src/mindustry/game/Schematics.java index 326c199d05..7a96ed672b 100644 --- a/core/src/io/anuke/mindustry/game/Schematics.java +++ b/core/src/mindustry/game/Schematics.java @@ -1,33 +1,33 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.*; -import io.anuke.arc.assets.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.glutils.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.io.Streams.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Schematic.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.input.Placement.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.production.*; -import io.anuke.mindustry.world.blocks.storage.*; +import arc.*; +import arc.assets.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.graphics.gl.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import arc.util.io.Streams.*; +import arc.util.serialization.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.ctype.ContentType; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.game.EventType.*; +import mindustry.game.Schematic.*; +import mindustry.input.*; +import mindustry.input.Placement.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.production.*; +import mindustry.world.blocks.storage.*; import java.io.*; import java.util.zip.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Handles schematics.*/ public class Schematics implements Loadable{ @@ -142,6 +142,7 @@ public class Schematics implements Loadable{ ui.showException(e); } } + all.sort(); } public void savePreview(Schematic schematic, Fi file){ @@ -249,12 +250,13 @@ public class Schematics implements Loadable{ public void placeLoadout(Schematic schem, int x, int y){ Stile coreTile = schem.tiles.find(s -> s.block instanceof CoreBlock); + if(coreTile == null) throw new IllegalArgumentException("Schematic has no core tile. Exiting."); int ox = x - coreTile.x, oy = y - coreTile.y; schem.tiles.each(st -> { Tile tile = world.tile(st.x + ox, st.y + oy); if(tile == null) return; - world.setBlock(tile, st.block, defaultTeam); + tile.set(st.block, state.rules.defaultTeam); tile.rotation(st.rotation); if(st.block.posConfig){ tile.configureAny(Pos.get(tile.x - st.x + Pos.x(st.config), tile.y - st.y + Pos.y(st.config))); @@ -279,6 +281,7 @@ public class Schematics implements Loadable{ ui.showException(e); Log.err(e); } + all.sort(); } public void remove(Schematic s){ @@ -291,6 +294,7 @@ public class Schematics implements Loadable{ previews.get(s).dispose(); previews.remove(s); } + all.sort(); } /** Creates a schematic from a world selection. */ @@ -339,7 +343,8 @@ public class Schematics implements Loadable{ for(int cy = oy; cy <= oy2; cy++){ Tile tile = world.ltile(cx, cy); - if(tile != null && tile.entity != null && !counted.contains(tile.pos()) && !(tile.block() instanceof BuildBlock) && tile.entity.block.isVisible()){ + if(tile != null && tile.entity != null && !counted.contains(tile.pos()) && !(tile.block() instanceof BuildBlock) + && (tile.entity.block.isVisible() || (tile.entity.block instanceof CoreBlock && Core.settings.getBool("coreselect")))){ int config = tile.entity.config(); if(tile.block().posConfig){ config = Pos.get(Pos.x(config) + offsetX, Pos.y(config) + offsetY); @@ -368,8 +373,12 @@ public class Schematics implements Loadable{ //region IO methods /** Loads a schematic from base64. May throw an exception. */ - public static Schematic readBase64(String schematic) throws IOException{ - return read(new ByteArrayInputStream(Base64Coder.decode(schematic))); + public static Schematic readBase64(String schematic){ + try{ + return read(new ByteArrayInputStream(Base64Coder.decode(schematic))); + }catch(IOException e){ + throw new RuntimeException(e); + } } public static Schematic read(Fi file) throws IOException{ diff --git a/core/src/io/anuke/mindustry/game/SoundLoop.java b/core/src/mindustry/game/SoundLoop.java similarity index 91% rename from core/src/io/anuke/mindustry/game/SoundLoop.java rename to core/src/mindustry/game/SoundLoop.java index 3266721ed6..444ce0c857 100644 --- a/core/src/io/anuke/mindustry/game/SoundLoop.java +++ b/core/src/mindustry/game/SoundLoop.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.audio.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; +import arc.audio.*; +import arc.math.*; +import arc.util.*; /** A simple class for playing a looping sound at a position.*/ public class SoundLoop{ diff --git a/core/src/io/anuke/mindustry/game/SpawnGroup.java b/core/src/mindustry/game/SpawnGroup.java similarity index 89% rename from core/src/io/anuke/mindustry/game/SpawnGroup.java rename to core/src/mindustry/game/SpawnGroup.java index 50443f153e..c0a08d2661 100644 --- a/core/src/io/anuke/mindustry/game/SpawnGroup.java +++ b/core/src/mindustry/game/SpawnGroup.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.util.serialization.Json; -import io.anuke.arc.util.serialization.Json.Serializable; -import io.anuke.arc.util.serialization.JsonValue; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.type.BaseUnit; -import io.anuke.mindustry.type.*; +import arc.util.serialization.Json; +import arc.util.serialization.Json.Serializable; +import arc.util.serialization.JsonValue; +import mindustry.content.*; +import mindustry.ctype.ContentType; +import mindustry.entities.type.BaseUnit; +import mindustry.type.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; /** * A spawn group defines spawn information for a specific type of unit, with optional extra information like diff --git a/core/src/io/anuke/mindustry/game/Stats.java b/core/src/mindustry/game/Stats.java similarity index 90% rename from core/src/io/anuke/mindustry/game/Stats.java rename to core/src/mindustry/game/Stats.java index 3c6847712e..1962f8d3ec 100644 --- a/core/src/io/anuke/mindustry/game/Stats.java +++ b/core/src/mindustry/game/Stats.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.annotations.Annotations.Serialize; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.ObjectIntMap; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.type.*; +import mindustry.annotations.Annotations.Serialize; +import arc.struct.Array; +import arc.struct.ObjectIntMap; +import arc.math.Mathf; +import mindustry.type.*; @Serialize public class Stats{ diff --git a/core/src/mindustry/game/Team.java b/core/src/mindustry/game/Team.java new file mode 100644 index 0000000000..0e5d60fadc --- /dev/null +++ b/core/src/mindustry/game/Team.java @@ -0,0 +1,102 @@ +package mindustry.game; + +import arc.*; +import arc.graphics.*; +import arc.math.*; +import arc.struct.*; +import arc.util.*; +import mindustry.game.Teams.*; +import mindustry.graphics.*; +import mindustry.world.blocks.storage.CoreBlock.*; + +import static mindustry.Vars.*; + +public class Team implements Comparable{ + public final byte id; + public final Color color; + public String name; + + /** All 256 registered teams. */ + private static final Team[] all = new Team[256]; + /** The 6 base teams used in the editor. */ + private static final Team[] baseTeams = new Team[6]; + + public final static Team + derelict = new Team(0, "derelict", Color.valueOf("4d4e58")), + sharded = new Team(1, "sharded", Pal.accent.cpy()), + crux = new Team(2, "crux", Color.valueOf("e82d2d")), + green = new Team(3, "green", Color.valueOf("4dd98b")), + purple = new Team(4, "purple", Color.valueOf("9a4bdf")), + blue = new Team(5, "blue", Color.royal.cpy()); + + static{ + Mathf.random.setSeed(8); + //create the whole 256 placeholder teams + for(int i = 6; i < all.length; i++){ + new Team(i, "team#" + i, Color.HSVtoRGB(360f * Mathf.random(), 100f * Mathf.random(0.6f, 1f), 100f * Mathf.random(0.8f, 1f), 1f)); + } + Mathf.random.setSeed(new Rand().nextLong()); + } + + public static Team get(int id){ + return all[Pack.u((byte)id)]; + } + + /** @return the 6 base team colors. */ + public static Team[] base(){ + return baseTeams; + } + + /** @return all the teams - do not use this for lookup! */ + public static Team[] all(){ + return all; + } + + protected Team(int id, String name, Color color){ + this.name = name; + this.color = color; + this.id = (byte)id; + + int us = Pack.u(this.id); + if(us < 6) baseTeams[us] = this; + all[us] = this; + } + + public Array enemies(){ + return state.teams.enemiesOf(this); + } + + public TeamData data(){ + return state.teams.get(this); + } + + public CoreEntity core(){ + return data().core(); + } + + public boolean active(){ + return state.teams.isActive(this); + } + + public boolean isEnemy(Team other){ + return state.teams.areEnemies(this, other); + } + + public Array cores(){ + return state.teams.cores(this); + } + + public String localized(){ + return Core.bundle.get("team." + name + ".name", name); + } + + @Override + public int compareTo(Team team){ + return Integer.compare(id, team.id); + } + + @Override + public String toString(){ + return name; + } +} diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java new file mode 100644 index 0000000000..e4fa1f1ef3 --- /dev/null +++ b/core/src/mindustry/game/Teams.java @@ -0,0 +1,183 @@ +package mindustry.game; + +import arc.func.*; +import arc.math.geom.*; +import arc.struct.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.entities.type.*; +import mindustry.world.blocks.storage.CoreBlock.*; + +import static mindustry.Vars.*; + +/** Class for various team-based utilities. */ +public class Teams{ + /** Maps team IDs to team data. */ + private TeamData[] map = new TeamData[256]; + /** Active teams. */ + private Array active = new Array<>(); + + public @Nullable CoreEntity closestEnemyCore(float x, float y, Team team){ + for(TeamData data : active){ + if(areEnemies(team, data.team)){ + CoreEntity tile = Geometry.findClosest(x, y, data.cores); + if(tile != null){ + return tile; + } + } + } + return null; + } + + public @Nullable CoreEntity closestCore(float x, float y, Team team){ + return Geometry.findClosest(x, y, get(team).cores); + } + + public Array enemiesOf(Team team){ + return get(team).enemies; + } + + public boolean eachEnemyCore(Team team, Boolf ret){ + for(TeamData data : active){ + if(areEnemies(team, data.team)){ + for(CoreEntity tile : data.cores){ + if(ret.get(tile)){ + return true; + } + } + } + } + return false; + } + + public void eachEnemyCore(Team team, Cons ret){ + for(TeamData data : active){ + if(areEnemies(team, data.team)){ + for(TileEntity tile : data.cores){ + ret.get(tile); + } + } + } + } + + /** Returns team data by type. */ + public TeamData get(Team team){ + if(map[Pack.u(team.id)] == null){ + map[Pack.u(team.id)] = new TeamData(team); + } + return map[Pack.u(team.id)]; + } + + public Array playerCores(){ + return get(state.rules.defaultTeam).cores; + } + + /** Do not modify! */ + public Array cores(Team team){ + return get(team).cores; + } + + /** Returns whether a team is active, e.g. whether it has any cores remaining. */ + public boolean isActive(Team team){ + //the enemy wave team is always active + return get(team).active(); + } + + /** Returns whether {@param other} is an enemy of {@param #team}. */ + public boolean areEnemies(Team team, Team other){ + //todo what about derelict? + return team != other; + } + + public boolean canInteract(Team team, Team other){ + return team == other || other == Team.derelict; + } + + /** Do not modify. */ + public Array getActive(){ + return active; + } + + public void registerCore(CoreEntity core){ + TeamData data = get(core.getTeam()); + //add core if not present + if(!data.cores.contains(core)){ + data.cores.add(core); + } + + //register in active list if needed + if(data.active() && !active.contains(data)){ + active.add(data); + updateEnemies(); + indexer.updateTeamIndex(data.team); + } + } + + public void unregisterCore(CoreEntity entity){ + TeamData data = get(entity.getTeam()); + //remove core + data.cores.remove(entity); + //unregister in active list + if(!data.active()){ + active.remove(data); + updateEnemies(); + } + } + + private void updateEnemies(){ + if(!active.contains(get(state.rules.waveTeam))){ + active.add(get(state.rules.waveTeam)); + } + + for(TeamData data : active){ + data.enemies.clear(); + for(TeamData other : active){ + if(areEnemies(data.team, other.team)){ + data.enemies.add(other.team); + } + } + } + } + + public class TeamData{ + public final Array cores = new Array<>(); + public final Array enemies = new Array<>(); + public final Team team; + public Queue brokenBlocks = new Queue<>(); + + public TeamData(Team team){ + this.team = team; + } + + public boolean active(){ + return (team == state.rules.waveTeam && state.rules.waves) || cores.size > 0; + } + + public boolean hasCore(){ + return cores.size > 0; + } + + public boolean noCores(){ + return cores.isEmpty(); + } + + public CoreEntity core(){ + return cores.first(); + } + } + + /** Represents a block made by this team that was destroyed somewhere on the map. + * This does not include deconstructed blocks.*/ + public static class BrokenBlock{ + public final short x, y, rotation, block; + public final int config; + + public BrokenBlock(short x, short y, short rotation, short block, int config){ + this.x = x; + this.y = y; + this.rotation = rotation; + this.block = block; + this.config = config; + } + } +} diff --git a/core/src/io/anuke/mindustry/game/Tutorial.java b/core/src/mindustry/game/Tutorial.java similarity index 87% rename from core/src/io/anuke/mindustry/game/Tutorial.java rename to core/src/mindustry/game/Tutorial.java index 99d45d3c2f..4b344bc945 100644 --- a/core/src/io/anuke/mindustry/game/Tutorial.java +++ b/core/src/mindustry/game/Tutorial.java @@ -1,21 +1,22 @@ -package io.anuke.mindustry.game; +package mindustry.game; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Handles tutorial state. */ public class Tutorial{ @@ -161,11 +162,11 @@ public class Tutorial{ }, withdraw(() -> event("withdraw")){ void begin(){ - state.teams.get(defaultTeam).cores.first().entity.items.add(Items.copper, 10); + state.teams.playerCores().first().items.add(Items.copper, 10); } }, deposit(() -> event("deposit")), - waves(() -> state.wave > 2 && state.enemies() <= 0 && !spawner.isSpawning()){ + waves(() -> state.wave > 2 && state.enemies <= 0 && !spawner.isSpawning()){ void begin(){ state.rules.waveTimer = true; logic.runWave(); @@ -239,18 +240,18 @@ public class Tutorial{ //utility static void placeBlocks(){ - Tile core = state.teams.get(defaultTeam).cores.first(); + TileEntity core = state.teams.playerCores().first(); for(int i = 0; i < blocksToBreak; i++){ - world.removeBlock(world.ltile(core.x + blockOffset, core.y + i)); - world.tile(core.x + blockOffset, core.y + i).setBlock(Blocks.scrapWall, defaultTeam); + world.ltile(core.tile.x + blockOffset, core.tile.y + i).remove(); + world.tile(core.tile.x + blockOffset, core.tile.y + i).setBlock(Blocks.scrapWall, state.rules.defaultTeam); } } static boolean blocksBroken(){ - Tile core = state.teams.get(defaultTeam).cores.first(); + TileEntity core = state.teams.playerCores().first(); for(int i = 0; i < blocksToBreak; i++){ - if(world.tile(core.x + blockOffset, core.y + i).block() == Blocks.scrapWall){ + if(world.tile(core.tile.x + blockOffset, core.tile.y + i).block() == Blocks.scrapWall){ return false; } } @@ -270,7 +271,7 @@ public class Tutorial{ } static int item(Item item){ - return state.teams.get(defaultTeam).cores.isEmpty() ? 0 : state.teams.get(defaultTeam).cores.first().entity.items.get(item); + return state.rules.defaultTeam.data().noCores() ? 0 : state.rules.defaultTeam.core().items.get(item); } static boolean toggled(String name){ diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java similarity index 94% rename from core/src/io/anuke/mindustry/graphics/BlockRenderer.java rename to core/src/mindustry/graphics/BlockRenderer.java index 8912745633..41274e0349 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -1,22 +1,22 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Texture.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.glutils.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Teams.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.Texture.*; +import arc.graphics.g2d.*; +import arc.graphics.gl.*; +import arc.math.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.game.EventType.*; +import mindustry.game.Teams.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.*; -import static io.anuke.arc.Core.camera; -import static io.anuke.mindustry.Vars.*; +import static arc.Core.camera; +import static mindustry.Vars.*; public class BlockRenderer implements Disposable{ private final static int initialRequests = 32 * 32; diff --git a/core/src/io/anuke/mindustry/graphics/Bloom.java b/core/src/mindustry/graphics/Bloom.java similarity index 76% rename from core/src/io/anuke/mindustry/graphics/Bloom.java rename to core/src/mindustry/graphics/Bloom.java index 91be9c210e..1b7b8f89f9 100644 --- a/core/src/io/anuke/mindustry/graphics/Bloom.java +++ b/core/src/mindustry/graphics/Bloom.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Pixmap.Format; -import io.anuke.arc.graphics.VertexAttributes.Usage; -import io.anuke.arc.graphics.glutils.FrameBuffer; -import io.anuke.arc.graphics.glutils.Shader; +import arc.Core; +import arc.graphics.*; +import arc.graphics.Pixmap.Format; +import arc.graphics.VertexAttributes.Usage; +import arc.graphics.gl.FrameBuffer; +import arc.graphics.gl.Shader; /** * Bloomlib allow easy but efficient way to add bloom effect as post process @@ -14,7 +14,6 @@ import io.anuke.arc.graphics.glutils.Shader; * @author kalle_h */ public class Bloom{ - /** * To use implement bloom more like a glow. Texture alpha channel can be * used as mask which part are glowing and which are not. see more info at: @@ -61,10 +60,8 @@ public class Bloom{ */ public void resume(){ bloomShader.begin(); - { - bloomShader.setUniformi("u_texture0", 0); - bloomShader.setUniformi("u_texture1", 1); - } + bloomShader.setUniformi("u_texture0", 0); + bloomShader.setUniformi("u_texture1", 1); bloomShader.end(); setSize(w, h); @@ -83,13 +80,11 @@ public class Bloom{ * blending = false 32bits = true */ public Bloom(){ - initialize(Core.graphics.getWidth() / 4, Core.graphics.getHeight() / 4, - null, false, false, true); + initialize(Core.graphics.getWidth() / 4, Core.graphics.getHeight() / 4, null, false, false, true); } public Bloom(boolean useBlending){ - initialize(Core.graphics.getWidth() / 4, Core.graphics.getHeight() / 4, - null, false, useBlending, true); + initialize(Core.graphics.getWidth() / 4, Core.graphics.getHeight() / 4, null, false, useBlending, true); } /** @@ -105,8 +100,7 @@ public class Bloom{ * and only do blooming on certain objects param use32bitFBO does * fbo use higher precision than 16bits. */ - public Bloom(int FBO_W, int FBO_H, boolean hasDepth, boolean useBlending, - boolean use32bitFBO){ + public Bloom(int FBO_W, int FBO_H, boolean hasDepth, boolean useBlending, boolean use32bitFBO){ initialize(FBO_W, FBO_H, null, hasDepth, useBlending, use32bitFBO); } @@ -129,18 +123,14 @@ public class Bloom{ * and only do blooming on certain objects param use32bitFBO does * fbo use higher precision than 16bits. */ - public Bloom(int FBO_W, int FBO_H, FrameBuffer sceneIsCapturedHere, - boolean useBlending, boolean use32bitFBO){ - - initialize(FBO_W, FBO_H, sceneIsCapturedHere, false, useBlending, - use32bitFBO); + public Bloom(int FBO_W, int FBO_H, FrameBuffer sceneIsCapturedHere, boolean useBlending, boolean use32bitFBO){ + initialize(FBO_W, FBO_H, sceneIsCapturedHere, false, useBlending, use32bitFBO); disposeFBO = false; } - private void initialize(int FBO_W, int FBO_H, FrameBuffer fbo, - boolean hasDepth, boolean useBlending, boolean use32bitFBO){ + private void initialize(int FBO_W, int FBO_H, FrameBuffer fbo, boolean hasDepth, boolean useBlending, boolean use32bitFBO){ blending = useBlending; - Format format = null; + Format format; if(use32bitFBO){ if(useBlending){ @@ -157,8 +147,7 @@ public class Bloom{ } } if(fbo == null){ - frameBuffer = new FrameBuffer(format, Core.graphics.getWidth(), - Core.graphics.getHeight(), hasDepth); + frameBuffer = new FrameBuffer(format, Core.graphics.getWidth(), Core.graphics.getHeight(), hasDepth); }else{ frameBuffer = fbo; } @@ -190,10 +179,8 @@ public class Bloom{ setThreshold(0.5f); bloomShader.begin(); - { - bloomShader.setUniformi("u_texture0", 0); - bloomShader.setUniformi("u_texture1", 1); - } + bloomShader.setUniformi("u_texture0", 0); + bloomShader.setUniformi("u_texture1", 1); bloomShader.end(); } @@ -219,8 +206,8 @@ public class Bloom{ if(!capturing){ capturing = true; frameBuffer.begin(); - Core.gl.glClearColor(r, g, b, a); - Core.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + Gl.clearColor(r, g, b, a); + Gl.clear(Gl.colorBufferBit); } } @@ -252,23 +239,22 @@ public class Bloom{ frameBuffer.end(); } - Core.gl.glDisable(GL20.GL_BLEND); - Core.gl.glDisable(GL20.GL_DEPTH_TEST); - Core.gl.glDepthMask(false); + Gl.disable(Gl.blend); + Gl.disable(Gl.depthTest); + Gl.depthMask(false); gaussianBlur(); if(blending){ - Core.gl.glEnable(GL20.GL_BLEND); - Core.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); + Gl.enable(Gl.blend); + Gl.blendFunc(Gl.srcAlpha, Gl.oneMinusSrcAlpha); } pingPongTex1.bind(1); original.bind(0); + bloomShader.begin(); - { - fullScreenQuad.render(bloomShader, GL20.GL_TRIANGLE_FAN); - } + fullScreenQuad.render(bloomShader, Gl.triangleFan); bloomShader.end(); } @@ -279,15 +265,9 @@ public class Bloom{ original.bind(0); pingPongBuffer1.begin(); - { - tresholdShader.begin(); - { - // tresholdShader.setUniformi("u_texture0", 0); - fullScreenQuad.render(tresholdShader, GL20.GL_TRIANGLE_FAN, 0, - 4); - } - tresholdShader.end(); - } + tresholdShader.begin(); + fullScreenQuad.render(tresholdShader, Gl.triangleFan, 0, 4); + tresholdShader.end(); pingPongBuffer1.end(); for(int i = 0; i < blurPasses; i++){ @@ -296,30 +276,19 @@ public class Bloom{ // horizontal pingPongBuffer2.begin(); - { - blurShader.begin(); - { - blurShader.setUniformf("dir", 1f, 0f); - fullScreenQuad.render(blurShader, GL20.GL_TRIANGLE_FAN, 0, - 4); - } - blurShader.end(); - } + blurShader.begin(); + blurShader.setUniformf("dir", 1f, 0f); + fullScreenQuad.render(blurShader, Gl.triangleFan, 0, 4); + blurShader.end(); pingPongBuffer2.end(); pingPongTex2.bind(0); // vertical pingPongBuffer1.begin(); - { - blurShader.begin(); - { - blurShader.setUniformf("dir", 0f, 1f); - - fullScreenQuad.render(blurShader, GL20.GL_TRIANGLE_FAN, 0, - 4); - } - blurShader.end(); - } + blurShader.begin(); + blurShader.setUniformf("dir", 0f, 1f); + fullScreenQuad.render(blurShader, Gl.triangleFan, 0, 4); + blurShader.end(); pingPongBuffer1.end(); } } @@ -334,9 +303,7 @@ public class Bloom{ public void setBloomIntesity(float intensity){ bloomIntensity = intensity; bloomShader.begin(); - { - bloomShader.setUniformf("BloomIntensity", intensity); - } + bloomShader.setUniformf("BloomIntensity", intensity); bloomShader.end(); } @@ -350,9 +317,7 @@ public class Bloom{ public void setOriginalIntesity(float intensity){ originalIntensity = intensity; bloomShader.begin(); - { - bloomShader.setUniformf("OriginalIntensity", intensity); - } + bloomShader.setUniformf("OriginalIntensity", intensity); bloomShader.end(); } @@ -364,10 +329,7 @@ public class Bloom{ public void setThreshold(float threshold){ this.threshold = threshold; tresholdShader.begin(); - { - tresholdShader.setUniformf("threshold", threshold, - 1f / (1 - threshold)); - } + tresholdShader.setUniformf("threshold", threshold, 1f / (1 - threshold)); tresholdShader.end(); } @@ -384,8 +346,7 @@ public class Bloom{ */ public void dispose(){ try{ - if(disposeFBO) - frameBuffer.dispose(); + if(disposeFBO) frameBuffer.dispose(); fullScreenQuad.dispose(); @@ -395,16 +356,17 @@ public class Bloom{ blurShader.dispose(); bloomShader.dispose(); tresholdShader.dispose(); - }catch(Exception ignored){ + }catch(Throwable ignored){ } } private static Mesh createFullScreenQuad(){ float[] verts = {-1, -1, 0, 0, 1, -1, 1, 0, 1, 1, 1, 1, -1, 1, 0, 1}; - Mesh tmpMesh = new Mesh(true, 4, 0, new VertexAttribute( - Usage.Position, 2, "a_position"), new VertexAttribute( - Usage.TextureCoordinates, 2, "a_texCoord0")); + Mesh tmpMesh = new Mesh(true, 4, 0, + new VertexAttribute(Usage.position, 2, "a_position"), + new VertexAttribute(Usage.textureCoordinates, 2, "a_texCoord0") + ); tmpMesh.setVertices(verts); return tmpMesh; diff --git a/core/src/io/anuke/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java similarity index 81% rename from core/src/io/anuke/mindustry/graphics/CacheLayer.java rename to core/src/mindustry/graphics/CacheLayer.java index 6b5c66683b..b91ca5b110 100644 --- a/core/src/io/anuke/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.glutils.Shader; +import arc.Core; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.gl.Shader; -import static io.anuke.arc.Core.camera; -import static io.anuke.mindustry.Vars.renderer; +import static arc.Core.camera; +import static mindustry.Vars.renderer; public enum CacheLayer{ water{ diff --git a/core/src/io/anuke/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java similarity index 92% rename from core/src/io/anuke/mindustry/graphics/Drawf.java rename to core/src/mindustry/graphics/Drawf.java index 036db1eca0..2fd9b48087 100644 --- a/core/src/io/anuke/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; -import static io.anuke.mindustry.Vars.renderer; +import static mindustry.Vars.renderer; public class Drawf{ diff --git a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java b/core/src/mindustry/graphics/FloorRenderer.java similarity index 90% rename from core/src/io/anuke/mindustry/graphics/FloorRenderer.java rename to core/src/mindustry/graphics/FloorRenderer.java index 58d022f579..6033b4ff03 100644 --- a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java +++ b/core/src/mindustry/graphics/FloorRenderer.java @@ -1,22 +1,19 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.Core; -import io.anuke.arc.Events; -import io.anuke.arc.collection.*; -import io.anuke.arc.collection.IntSet.IntSetIterator; -import io.anuke.arc.graphics.Camera; -import io.anuke.arc.graphics.GL20; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.*; -import io.anuke.mindustry.game.EventType.WorldLoadEvent; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.Floor; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.struct.*; +import arc.struct.IntSet.*; +import arc.util.*; +import mindustry.game.EventType.*; +import mindustry.world.*; +import mindustry.world.blocks.*; -import java.util.Arrays; +import java.util.*; -import static io.anuke.mindustry.Vars.tilesize; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.*; public class FloorRenderer implements Disposable{ private final static int chunksize = 64; @@ -104,7 +101,7 @@ public class FloorRenderer implements Disposable{ cbatch.setProjection(Core.camera.projection()); cbatch.beginDraw(); - Core.gl.glEnable(GL20.GL_BLEND); + Gl.enable(Gl.blend); } public void endDraw(){ diff --git a/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java b/core/src/mindustry/graphics/IndexedRenderer.java similarity index 80% rename from core/src/io/anuke/mindustry/graphics/IndexedRenderer.java rename to core/src/mindustry/graphics/IndexedRenderer.java index fe7a39b51d..cb42b6fe0b 100644 --- a/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java +++ b/core/src/mindustry/graphics/IndexedRenderer.java @@ -1,15 +1,11 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.VertexAttributes.Usage; -import io.anuke.arc.graphics.g2d.BatchShader; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.graphics.glutils.Shader; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.Matrix3; -import io.anuke.arc.util.Disposable; -import io.anuke.arc.util.Strings; +import arc.graphics.*; +import arc.graphics.VertexAttributes.*; +import arc.graphics.g2d.*; +import arc.graphics.gl.*; +import arc.math.*; +import arc.util.*; //TODO this class is a trainwreck, remove it public class IndexedRenderer implements Disposable{ @@ -17,18 +13,18 @@ public class IndexedRenderer implements Disposable{ private Shader program = new Shader( Strings.join("\n", - "attribute vec4 " + Shader.POSITION_ATTRIBUTE + ";", - "attribute vec4 " + Shader.COLOR_ATTRIBUTE + ";", - "attribute vec2 " + Shader.TEXCOORD_ATTRIBUTE + "0;", + "attribute vec4 " + Shader.positionAttribute + ";", + "attribute vec4 " + Shader.colorAttribute + ";", + "attribute vec2 " + Shader.texcoordAttribute + "0;", "uniform mat4 u_projTrans;", "varying vec4 v_color;", "varying vec2 v_texCoords;", "", "void main(){", - " v_color = " + Shader.COLOR_ATTRIBUTE + ";", + " v_color = " + Shader.colorAttribute + ";", " v_color.a = v_color.a * (255.0/254.0);", - " v_texCoords = " + Shader.TEXCOORD_ATTRIBUTE + "0;", - " gl_Position = u_projTrans * " + Shader.POSITION_ATTRIBUTE + ";", + " v_texCoords = " + Shader.texcoordAttribute + "0;", + " gl_Position = u_projTrans * " + Shader.positionAttribute + ";", "}"), Strings.join("\n", "#ifdef GL_ES", @@ -50,9 +46,9 @@ public class IndexedRenderer implements Disposable{ private float[] tmpVerts = new float[vsize * 6]; private float[] vertices; - private Matrix3 projMatrix = new Matrix3(); - private Matrix3 transMatrix = new Matrix3(); - private Matrix3 combined = new Matrix3(); + private Mat projMatrix = new Mat(); + private Mat transMatrix = new Mat(); + private Mat combined = new Mat(); private float color = Color.white.toFloatBits(); public IndexedRenderer(int sprites){ @@ -60,7 +56,7 @@ public class IndexedRenderer implements Disposable{ } public void render(Texture texture){ - Core.gl.glEnable(GL20.GL_BLEND); + Gl.enable(Gl.blend); updateMatrix(); @@ -71,7 +67,7 @@ public class IndexedRenderer implements Disposable{ program.setUniformMatrix4("u_projTrans", BatchShader.copyTransform(combined)); program.setUniformi("u_texture", 0); - mesh.render(program, GL20.GL_TRIANGLES, 0, vertices.length / vsize); + mesh.render(program, Gl.triangles, 0, vertices.length / vsize); program.end(); } @@ -214,11 +210,11 @@ public class IndexedRenderer implements Disposable{ mesh.updateVertices(index * vsize * 6, vertices); } - public Matrix3 getTransformMatrix(){ + public Mat getTransformMatrix(){ return transMatrix; } - public void setProjectionMatrix(Matrix3 matrix){ + public void setProjectionMatrix(Mat matrix){ projMatrix = matrix; } @@ -226,9 +222,9 @@ public class IndexedRenderer implements Disposable{ if(mesh != null) mesh.dispose(); mesh = new Mesh(true, 6 * sprites, 0, - new VertexAttribute(Usage.Position, 2, "a_position"), - new VertexAttribute(Usage.ColorPacked, 4, "a_color"), - new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoord0")); + new VertexAttribute(Usage.position, 2, "a_position"), + new VertexAttribute(Usage.colorPacked, 4, "a_color"), + new VertexAttribute(Usage.textureCoordinates, 2, "a_texCoord0")); vertices = new float[6 * sprites * vsize]; mesh.setVertices(vertices); } diff --git a/core/src/io/anuke/mindustry/graphics/Layer.java b/core/src/mindustry/graphics/Layer.java similarity index 89% rename from core/src/io/anuke/mindustry/graphics/Layer.java rename to core/src/mindustry/graphics/Layer.java index 1ba9c76ec6..f731452aa8 100644 --- a/core/src/io/anuke/mindustry/graphics/Layer.java +++ b/core/src/mindustry/graphics/Layer.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; public enum Layer{ /** Base block layer. */ diff --git a/core/src/io/anuke/mindustry/graphics/LightRenderer.java b/core/src/mindustry/graphics/LightRenderer.java similarity index 92% rename from core/src/io/anuke/mindustry/graphics/LightRenderer.java rename to core/src/mindustry/graphics/LightRenderer.java index 19ab2ff016..0c0f94e02c 100644 --- a/core/src/io/anuke/mindustry/graphics/LightRenderer.java +++ b/core/src/mindustry/graphics/LightRenderer.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.glutils.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.graphics.gl.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; -import static io.anuke.mindustry.Vars.state; +import static mindustry.Vars.state; /** Renders overlay lights. Client only. */ public class LightRenderer{ @@ -63,7 +63,7 @@ public class LightRenderer{ float v2 = lmid.getV(); - Vector2 v1 = Tmp.v1.trnsExact(rot + 90f, stroke); + Vec2 v1 = Tmp.v1.trnsExact(rot + 90f, stroke); float lx1 = x - v1.x, ly1 = y - v1.y, lx2 = x + v1.x, ly2 = y + v1.y, lx3 = x2 + v1.x, ly3 = y2 + v1.y, @@ -100,7 +100,7 @@ public class LightRenderer{ Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); - Vector2 v3 = Tmp.v2.trnsExact(rot, stroke); + Vec2 v3 = Tmp.v2.trnsExact(rot, stroke); u = ledge.getU(); v = ledge.getV2(); diff --git a/core/src/io/anuke/mindustry/graphics/MenuRenderer.java b/core/src/mindustry/graphics/MenuRenderer.java similarity index 92% rename from core/src/io/anuke/mindustry/graphics/MenuRenderer.java rename to core/src/mindustry/graphics/MenuRenderer.java index 89078c92e9..099604bd6b 100644 --- a/core/src/io/anuke/mindustry/graphics/MenuRenderer.java +++ b/core/src/mindustry/graphics/MenuRenderer.java @@ -1,26 +1,26 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.func.Floatc2; -import io.anuke.arc.graphics.Camera; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.glutils.FrameBuffer; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.layout.Scl; -import io.anuke.arc.util.*; -import io.anuke.arc.util.noise.RidgedPerlin; -import io.anuke.arc.util.noise.Simplex; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.content.UnitTypes; -import io.anuke.mindustry.type.UnitType; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.Floor; -import io.anuke.mindustry.world.blocks.OreBlock; +import arc.Core; +import arc.struct.Array; +import arc.func.Floatc2; +import arc.graphics.Camera; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.graphics.gl.FrameBuffer; +import arc.math.*; +import arc.scene.ui.layout.Scl; +import arc.util.*; +import arc.util.noise.RidgedPerlin; +import arc.util.noise.Simplex; +import mindustry.content.Blocks; +import mindustry.content.UnitTypes; +import mindustry.type.UnitType; +import mindustry.ui.Cicon; +import mindustry.world.*; +import mindustry.world.blocks.Floor; +import mindustry.world.blocks.OreBlock; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MenuRenderer implements Disposable{ private static final float darkness = 0.3f; @@ -28,7 +28,7 @@ public class MenuRenderer implements Disposable{ private int cacheFloor, cacheWall; private Camera camera = new Camera(); - private Matrix3 mat = new Matrix3(); + private Mat mat = new Mat(); private FrameBuffer shadows; private CacheBatch batch; private float time = 0f; diff --git a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java similarity index 79% rename from core/src/io/anuke/mindustry/graphics/MinimapRenderer.java rename to core/src/mindustry/graphics/MinimapRenderer.java index 568884d609..c34bb246ec 100644 --- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -1,23 +1,24 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Pixmap.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.Pixmap.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import arc.util.pooling.*; +import mindustry.entities.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.io.*; +import mindustry.ui.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MinimapRenderer implements Disposable{ private static final float baseSize = 16f; @@ -25,7 +26,7 @@ public class MinimapRenderer implements Disposable{ private Pixmap pixmap; private Texture texture; private TextureRegion region; - private Rectangle rect = new Rectangle(); + private Rect rect = new Rect(); private float zoom = 4; public MinimapRenderer(){ @@ -42,7 +43,7 @@ public class MinimapRenderer implements Disposable{ return pixmap; } - public Texture getTexture(){ + public @Nullable Texture getTexture(){ return texture; } @@ -70,8 +71,13 @@ public class MinimapRenderer implements Disposable{ region = new TextureRegion(texture); } - public void drawEntities(float x, float y, float w, float h, boolean withLabels){ - updateUnitArray(); + public void drawEntities(float x, float y, float w, float h, float scaling, boolean withLabels){ + if(!withLabels){ + updateUnitArray(); + }else{ + units.clear(); + Units.all(units::add); + } float sz = baseSize * zoom; float dx = (Core.camera.position.x / tilesize); @@ -82,8 +88,14 @@ public class MinimapRenderer implements Disposable{ rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize); for(Unit unit : units){ - float rx = (unit.x - rect.x) / rect.width * w; - float ry = (unit.y - rect.y) / rect.width * h; + if(unit.isDead()) continue; + float rx = !withLabels ? (unit.x - rect.x) / rect.width * w : unit.x / (world.width() * tilesize) * w; + float ry = !withLabels ? (unit.y - rect.y) / rect.width * h : unit.y / (world.height() * tilesize) * h; + + Draw.mixcol(unit.getTeam().color, 1f); + float scale = Scl.scl(1f) / 2f * scaling * 32f; + Draw.rect(unit.getIconRegion(), x + rx, y + ry, scale, scale, unit.rotation - 90); + Draw.reset(); if(withLabels && unit instanceof Player){ Player pl = (Player) unit; @@ -92,19 +104,16 @@ public class MinimapRenderer implements Disposable{ drawLabel(x + rx, y + ry, pl.name, unit.getTeam().color); } } - - Draw.color(unit.getTeam().color); - Fill.rect(x + rx, y + ry, Scl.scl(baseSize / 2f), Scl.scl(baseSize / 2f)); } - Draw.color(); + Draw.reset(); } public void drawEntities(float x, float y, float w, float h){ - drawEntities(x, y, w, h, true); + drawEntities(x, y, w, h, 1f, true); } - public TextureRegion getRegion(){ + public @Nullable TextureRegion getRegion(){ if(texture == null) return null; float sz = Mathf.clamp(baseSize * zoom, baseSize, Math.min(world.width(), world.height())); diff --git a/core/src/io/anuke/mindustry/graphics/MultiPacker.java b/core/src/mindustry/graphics/MultiPacker.java similarity index 89% rename from core/src/io/anuke/mindustry/graphics/MultiPacker.java rename to core/src/mindustry/graphics/MultiPacker.java index 578aa677ba..a2a7d476fe 100644 --- a/core/src/io/anuke/mindustry/graphics/MultiPacker.java +++ b/core/src/mindustry/graphics/MultiPacker.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Pixmap.*; -import io.anuke.arc.graphics.Texture.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.util.*; +import arc.graphics.*; +import arc.graphics.Pixmap.*; +import arc.graphics.Texture.*; +import arc.graphics.g2d.*; +import arc.util.*; public class MultiPacker implements Disposable{ private PixmapPacker[] packers = new PixmapPacker[PageType.all.length]; diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java similarity index 76% rename from core/src/io/anuke/mindustry/graphics/OverlayRenderer.java rename to core/src/mindustry/graphics/OverlayRenderer.java index d33d310b88..6cb4348c23 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -1,29 +1,28 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.type.Category; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.units.MechPad; -import io.anuke.mindustry.world.meta.BlockFlag; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.type.*; +import mindustry.input.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.units.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class OverlayRenderer{ private static final float indicatorLength = 14f; private static final float spawnerMargin = tilesize*11f; - private static final Rectangle rect = new Rectangle(); + private static final Rect rect = new Rect(); private float buildFadeTime; public void drawBottom(){ @@ -65,7 +64,7 @@ public class OverlayRenderer{ for(Tile mechpad : indexer.getAllied(player.getTeam(), BlockFlag.mechPad)){ if(!(mechpad.block() instanceof MechPad)) continue; if(!rect.setSize(Core.camera.width * 0.9f, Core.camera.height * 0.9f) - .setCenter(Core.camera.position.x, Core.camera.position.y).contains(mechpad.x, mechpad.y)){ + .setCenter(Core.camera.position.x, Core.camera.position.y).contains(mechpad.drawx(), mechpad.drawy())){ Tmp.v1.set(mechpad.drawx(), mechpad.drawy()).sub(Core.camera.position.x, Core.camera.position.y).setLength(indicatorLength); @@ -95,17 +94,15 @@ public class OverlayRenderer{ Lines.stroke(buildFadeTime * 2f); if(buildFadeTime > 0.005f){ - for(Team enemy : state.teams.enemiesOf(player.getTeam())){ - for(Tile core : state.teams.get(enemy).cores){ - float dst = Mathf.dst(player.x, player.y, core.drawx(), core.drawy()); - if(dst < state.rules.enemyCoreBuildRadius * 1.5f){ - Draw.color(Color.darkGray); - Lines.circle(core.drawx(), core.drawy() - 2, state.rules.enemyCoreBuildRadius); - Draw.color(Pal.accent, enemy.color, 0.5f + Mathf.absin(Time.time(), 10f, 0.5f)); - Lines.circle(core.drawx(), core.drawy(), state.rules.enemyCoreBuildRadius); - } + state.teams.eachEnemyCore(player.getTeam(), core -> { + float dst = core.dst(player); + if(dst < state.rules.enemyCoreBuildRadius * 2.2f){ + Draw.color(Color.darkGray); + Lines.circle(core.x, core.y - 2, state.rules.enemyCoreBuildRadius); + Draw.color(Pal.accent, core.getTeam().color, 0.5f + Mathf.absin(Time.time(), 10f, 0.5f)); + Lines.circle(core.x, core.y, state.rules.enemyCoreBuildRadius); } - } + }); } Lines.stroke(2f); @@ -122,7 +119,7 @@ public class OverlayRenderer{ //draw selected block if(input.block == null && !Core.scene.hasMouse()){ - Vector2 vec = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); + Vec2 vec = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); Tile tile = world.ltileWorld(vec.x, vec.y); if(tile != null && tile.block() != Blocks.air && tile.getTeam() == player.getTeam()){ @@ -139,7 +136,7 @@ public class OverlayRenderer{ //draw selection overlay when dropping item if(input.isDroppingItem()){ - Vector2 v = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); + Vec2 v = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); float size = 8; Draw.rect(player.item().item.icon(Cicon.medium), v.x, v.y, size, size); Draw.color(Pal.accent); diff --git a/core/src/io/anuke/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java similarity index 97% rename from core/src/io/anuke/mindustry/graphics/Pal.java rename to core/src/mindustry/graphics/Pal.java index 2c46e726f7..fe6a0b6d24 100644 --- a/core/src/io/anuke/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.graphics.Color; +import arc.graphics.Color; public class Pal{ public static final Color diff --git a/core/src/io/anuke/mindustry/graphics/Pixelator.java b/core/src/mindustry/graphics/Pixelator.java similarity index 80% rename from core/src/io/anuke/mindustry/graphics/Pixelator.java rename to core/src/mindustry/graphics/Pixelator.java index 587ce3077a..f746ca69e3 100644 --- a/core/src/io/anuke/mindustry/graphics/Pixelator.java +++ b/core/src/mindustry/graphics/Pixelator.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Blending; -import io.anuke.arc.graphics.Texture.TextureFilter; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.glutils.FrameBuffer; -import io.anuke.arc.util.Disposable; -import io.anuke.mindustry.entities.type.Player; +import arc.Core; +import arc.graphics.Blending; +import arc.graphics.Texture.TextureFilter; +import arc.graphics.g2d.Draw; +import arc.graphics.gl.FrameBuffer; +import arc.util.Disposable; +import mindustry.entities.type.Player; -import static io.anuke.arc.Core.camera; -import static io.anuke.arc.Core.graphics; -import static io.anuke.mindustry.Vars.playerGroup; -import static io.anuke.mindustry.Vars.renderer; +import static arc.Core.camera; +import static arc.Core.graphics; +import static mindustry.Vars.playerGroup; +import static mindustry.Vars.renderer; public class Pixelator implements Disposable{ private FrameBuffer buffer = new FrameBuffer(2, 2); diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java similarity index 94% rename from core/src/io/anuke/mindustry/graphics/Shaders.java rename to core/src/mindustry/graphics/Shaders.java index 008d7da637..7c37935352 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.graphics; +package mindustry.graphics; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.graphics.glutils.Shader; -import io.anuke.arc.scene.ui.layout.Scl; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.Time; +import arc.Core; +import arc.graphics.Color; +import arc.graphics.g2d.TextureRegion; +import arc.graphics.gl.Shader; +import arc.scene.ui.layout.Scl; +import arc.util.ArcAnnotate.*; +import arc.util.Time; public class Shaders{ public static Shadow shadow; diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/mindustry/input/Binding.java similarity index 90% rename from core/src/io/anuke/mindustry/input/Binding.java rename to core/src/mindustry/input/Binding.java index 9134506735..664c30a2cb 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/mindustry/input/Binding.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.input; +package mindustry.input; -import io.anuke.arc.Application.ApplicationType; -import io.anuke.arc.Core; -import io.anuke.arc.KeyBinds.*; -import io.anuke.arc.input.InputDevice.DeviceType; -import io.anuke.arc.input.KeyCode; +import arc.Application.ApplicationType; +import arc.Core; +import arc.KeyBinds.*; +import arc.input.InputDevice.DeviceType; +import arc.input.KeyCode; public enum Binding implements KeyBind{ move_x(new Axis(KeyCode.A, KeyCode.D), "general"), diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java similarity index 89% rename from core/src/io/anuke/mindustry/input/DesktopInput.java rename to core/src/mindustry/input/DesktopInput.java index cf7b3de6d5..8838dee9c9 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -1,28 +1,29 @@ -package io.anuke.mindustry.input; +package mindustry.input; -import io.anuke.arc.*; -import io.anuke.arc.Graphics.*; -import io.anuke.arc.Graphics.Cursor.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.Graphics.*; +import arc.Graphics.Cursor.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.*; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.*; +import mindustry.core.GameState.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.*; -import static io.anuke.arc.Core.scene; -import static io.anuke.mindustry.Vars.*; -import static io.anuke.mindustry.input.PlaceMode.*; +import static arc.Core.scene; +import static mindustry.Vars.*; +import static mindustry.input.PlaceMode.*; public class DesktopInput extends InputHandler{ /** Current cursor type. */ @@ -135,22 +136,29 @@ public class DesktopInput extends InputHandler{ ui.listfrag.toggle(); } + if(((player.getClosestCore() == null && player.isDead()) || state.isPaused()) && !ui.chatfrag.shown()){ + //move camera around + float camSpeed = !Core.input.keyDown(Binding.dash) ? 3f : 8f; + Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(Time.delta() * camSpeed)); + + if(Core.input.keyDown(Binding.mouse_move)){ + Core.camera.position.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2f) * 0.005f, -1, 1) * camSpeed; + Core.camera.position.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2f) * 0.005f, -1, 1) * camSpeed; + } + } + if(Core.input.keyRelease(Binding.select)){ player.isShooting = false; } - if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && (scene.getKeyboardFocus() == ui.minimap || !scene.hasDialog()) && !Core.scene.hasKeyboard() && !(scene.getKeyboardFocus() instanceof TextField)){ - if(!ui.minimap.isShown()){ - ui.minimap.show(); - }else{ - ui.minimap.hide(); - } + if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && !scene.hasDialog() && !(scene.getKeyboardFocus() instanceof TextField)){ + ui.minimapfrag.toggle(); } if(state.is(State.menu) || Core.scene.hasDialog()) return; //zoom camera - if(!Core.scene.hasScroll() && Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){ + if((!Core.scene.hasScroll() || Core.input.keyDown(Binding.diagonal_placement)) && !ui.chatfrag.shown() && Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } @@ -300,7 +308,7 @@ public class DesktopInput extends InputHandler{ } } - if(Core.input.keyTap(Binding.clear_building)){ + if(Core.input.keyTap(Binding.clear_building) || isPlacing()){ lastSchematic = null; selectRequests.clear(); } @@ -397,7 +405,7 @@ public class DesktopInput extends InputHandler{ } if(mode == placing && block != null){ - if(!overrideLineRotation && !Core.input.keyDown(Binding.diagonal_placement) && (selectX != cursorX || selectY != cursorY) && ((int) Core.input.axisTap(Binding.rotate) != 0)){ + if(!overrideLineRotation && !Core.input.keyDown(Binding.diagonal_placement) && (selectX != cursorX || selectY != cursorY) && ((int)Core.input.axisTap(Binding.rotate) != 0)){ rotation = ((int)((Angles.angle(selectX, selectY, cursorX, cursorY) + 45) / 90f)) % 4; overrideLineRotation = true; } diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java similarity index 93% rename from core/src/io/anuke/mindustry/input/InputHandler.java rename to core/src/mindustry/input/InputHandler.java index c2ff9db807..e56244928e 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -1,50 +1,50 @@ -package io.anuke.mindustry.input; +package mindustry.input; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; -import io.anuke.arc.input.GestureDetector.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Teams.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.Placement.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.fragments.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.BuildBlock.*; -import io.anuke.mindustry.world.blocks.power.PowerNode; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.input.GestureDetector.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.event.*; +import arc.scene.ui.layout.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.effect.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.game.Teams.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.input.Placement.*; +import mindustry.net.*; +import mindustry.type.*; +import mindustry.ui.fragments.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.power.PowerNode; import java.util.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public abstract class InputHandler implements InputProcessor, GestureListener{ /** Used for dropping items. */ final static float playerSelectRange = mobile ? 17f : 11f; /** Maximum line length. */ final static int maxLength = 100; - final static Vector2 stackTrns = new Vector2(); - final static Rectangle r1 = new Rectangle(), r2 = new Rectangle(); + final static Vec2 stackTrns = new Vec2(); + final static Rect r1 = new Rect(), r2 = new Rect(); /** Distance on the back from where items originate. */ final static float backTrns = 3f; @@ -92,7 +92,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ @Remote(targets = Loc.both, forward = true, called = Loc.server) public static void transferInventory(Player player, Tile tile){ - if(player == null || player.timer == null || !player.timer.get(Player.timerTransfer, 40)) return; + if(player == null || player.timer == null) return; if(net.server() && (player.item().amount <= 0 || player.isTransferring|| !Units.canInteract(player, tile))){ throw new ValidateException(player, "Player cannot transfer an item."); } @@ -120,7 +120,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ ItemTransfer.create(item, player.x + Angles.trnsx(player.rotation + 180f, backTrns), player.y + Angles.trnsy(player.rotation + 180f, backTrns), - new Vector2(tile.drawx() + stackTrns.x, tile.drawy() + stackTrns.y), () -> { + new Vec2(tile.drawx() + stackTrns.x, tile.drawy() + stackTrns.y), () -> { if(tile.block() != block || tile.entity == null || tile.entity.items == null) return; tile.block().handleStack(item, removed, tile, player); @@ -402,7 +402,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } - for(BrokenBlock req : state.teams.get(player.getTeam()).brokenBlocks){ + for(BrokenBlock req : player.getTeam().data().brokenBlocks){ Block block = content.block(req.block); if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){ drawSelected(req.x, req.y, content.block(req.block), Pal.remove); @@ -639,7 +639,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } int tileX(float cursorX){ - Vector2 vec = Core.input.mouseWorld(cursorX, 0); + Vec2 vec = Core.input.mouseWorld(cursorX, 0); if(selectedBlock()){ vec.sub(block.offset(), block.offset()); } @@ -647,7 +647,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } int tileY(float cursorY){ - Vector2 vec = Core.input.mouseWorld(0, cursorY); + Vec2 vec = Core.input.mouseWorld(0, cursorY); if(selectedBlock()){ vec.sub(block.offset(), block.offset()); } @@ -725,7 +725,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public void tryDropItems(Tile tile, float x, float y){ - if(!droppingItem || player.item().amount <= 0 || canTapPlayer(x, y) || state.isPaused() || !player.timer.check(Player.timerTransfer, 40)){ + if(!droppingItem || player.item().amount <= 0 || canTapPlayer(x, y) || state.isPaused() ){ droppingItem = false; return; } diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java similarity index 95% rename from core/src/io/anuke/mindustry/input/MobileInput.java rename to core/src/mindustry/input/MobileInput.java index b057156719..3b8e881085 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -1,33 +1,33 @@ -package io.anuke.mindustry.input; +package mindustry.input; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.GestureDetector.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.ui.ImageButton.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.input.GestureDetector.*; +import arc.input.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.ui.ImageButton.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.core.GameState.*; +import mindustry.entities.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; -import static io.anuke.mindustry.input.PlaceMode.*; +import static mindustry.Vars.*; +import static mindustry.input.PlaceMode.*; public class MobileInput extends InputHandler implements GestureListener{ /** Maximum speed the player can pan. */ @@ -36,7 +36,7 @@ public class MobileInput extends InputHandler implements GestureListener{ private final float edgePan = Scl.scl(60f); //gesture data - private Vector2 vector = new Vector2(); + private Vec2 vector = new Vec2(); private float lastZoom = -1; /** Position where the player started dragging a line. */ @@ -77,7 +77,7 @@ public class MobileInput extends InputHandler implements GestureListener{ }else{ Tile tile = world.ltileWorld(x, y); - if(tile != null && tile.synthetic() && state.teams.areEnemies(player.getTeam(), tile.getTeam())){ + if(tile != null && tile.synthetic() && player.getTeam().isEnemy(tile.getTeam())){ TileEntity entity = tile.entity; player.setMineTile(null); player.target = entity; @@ -439,10 +439,12 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public boolean touchDown(int screenX, int screenY, int pointer, KeyCode button){ - if(state.is(State.menu) || player.isDead()) return false; + if(state.is(State.menu)) return false; down = true; + if(player.isDead()) return false; + //get tile on cursor Tile cursor = tileAt(screenX, screenY); diff --git a/core/src/io/anuke/mindustry/input/PlaceMode.java b/core/src/mindustry/input/PlaceMode.java similarity index 67% rename from core/src/io/anuke/mindustry/input/PlaceMode.java rename to core/src/mindustry/input/PlaceMode.java index cb287caed6..1c2d0d6ce2 100644 --- a/core/src/io/anuke/mindustry/input/PlaceMode.java +++ b/core/src/mindustry/input/PlaceMode.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.input; +package mindustry.input; public enum PlaceMode{ none, breaking, placing, schematicSelect diff --git a/core/src/io/anuke/mindustry/input/Placement.java b/core/src/mindustry/input/Placement.java similarity index 97% rename from core/src/io/anuke/mindustry/input/Placement.java rename to core/src/mindustry/input/Placement.java index 35b078b8fe..49d3e9a030 100644 --- a/core/src/io/anuke/mindustry/input/Placement.java +++ b/core/src/mindustry/input/Placement.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.input; +package mindustry.input; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.struct.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.pooling.*; +import mindustry.world.*; import java.util.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Placement{ private static final NormalizeResult result = new NormalizeResult(); diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java similarity index 83% rename from core/src/io/anuke/mindustry/io/JsonIO.java rename to core/src/mindustry/io/JsonIO.java index 5d91106ea2..ef37dd9d65 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.io; +package mindustry.io; -import io.anuke.arc.util.serialization.*; -import io.anuke.arc.util.serialization.Json.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.util.serialization.*; +import arc.util.serialization.Json.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; +import mindustry.game.*; +import mindustry.type.*; +import mindustry.world.*; import java.io.*; @@ -20,7 +20,7 @@ public class JsonIO{ @Override public void writeValue(Object value, Class knownType, Class elementType){ - if(value instanceof io.anuke.mindustry.ctype.MappableContent){ + if(value instanceof MappableContent){ try{ getWriter().value(((MappableContent)value).name); }catch(IOException e){ @@ -53,11 +53,11 @@ public class JsonIO{ } public static T read(Class type, String string){ - return json.fromJson(type, string); + return json.fromJson(type, string.replace("io.anuke.", "")); } public static T read(Class type, T base, String string){ - return jsonBase.fromBaseJson(type, base, string); + return jsonBase.fromBaseJson(type, base, string.replace("io.anuke.", "")); } public static String print(String in){ @@ -95,6 +95,18 @@ public class JsonIO{ } }); + json.setSerializer(Team.class, new Serializer(){ + @Override + public void write(Json json, Team object, Class knownType){ + json.writeValue(object.id); + } + + @Override + public Team read(Json json, JsonValue jsonData, Class type){ + return Team.get(jsonData.asInt()); + } + }); + json.setSerializer(Block.class, new Serializer(){ @Override public void write(Json json, Block object, Class knownType){ diff --git a/core/src/io/anuke/mindustry/io/MapIO.java b/core/src/mindustry/io/MapIO.java similarity index 80% rename from core/src/io/anuke/mindustry/io/MapIO.java rename to core/src/mindustry/io/MapIO.java index bf309505bd..85c5cc9cb7 100644 --- a/core/src/io/anuke/mindustry/io/MapIO.java +++ b/core/src/mindustry/io/MapIO.java @@ -1,21 +1,22 @@ -package io.anuke.mindustry.io; +package mindustry.io; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Pixmap.*; -import io.anuke.arc.util.io.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.storage.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.graphics.Pixmap.*; +import arc.util.io.*; +import mindustry.content.*; +import mindustry.core.*; +import mindustry.game.*; +import mindustry.maps.*; +import mindustry.world.*; +import mindustry.world.LegacyColorMapper.*; +import mindustry.world.blocks.storage.*; import java.io.*; import java.util.zip.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Reads and writes map files. */ //TODO does this class even need to exist??? move to Maps? @@ -91,7 +92,7 @@ public class MapIO{ public void setTeam(Team team){ super.setTeam(team); if(block instanceof CoreBlock){ - map.teams.add(team.ordinal()); + map.teams.add(team.id); } } }; @@ -145,11 +146,33 @@ public class MapIO{ public static int colorFor(Block floor, Block wall, Block ore, Team team){ if(wall.synthetic()){ - return team.intColor; + return team.color.rgba(); } return Color.rgba8888(wall.solid ? wall.color : ore == Blocks.air ? floor.color : ore.color); } + /** Reads a pixmap in the 3.5 pixmap format. */ + public static void readPixmap(Pixmap pixmap, Tile[][] tiles){ + for(int x = 0; x < pixmap.getWidth(); x++){ + for(int y = 0; y < pixmap.getHeight(); y++){ + int color = pixmap.getPixel(x, pixmap.getHeight() - 1 - y); + LegacyBlock block = LegacyColorMapper.get(color); + Tile tile = tiles[x][y]; + + tile.setFloor(block.floor); + tile.setBlock(block.wall); + if(block.ore != null) tile.setOverlay(block.ore); + + //place core + if(color == Color.rgba8888(Color.green)){ + //actual core parts + tile.setBlock(Blocks.coreShard); + tile.setTeam(Team.sharded); + } + } + } + } + interface TileProvider{ Tile get(int x, int y); } diff --git a/core/src/io/anuke/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java similarity index 93% rename from core/src/io/anuke/mindustry/io/SaveFileReader.java rename to core/src/mindustry/io/SaveFileReader.java index 8384aca50e..c324e78fdb 100644 --- a/core/src/io/anuke/mindustry/io/SaveFileReader.java +++ b/core/src/mindustry/io/SaveFileReader.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.io; +package mindustry.io; -import io.anuke.arc.collection.ObjectMap; -import io.anuke.arc.collection.ObjectMap.Entry; -import io.anuke.arc.collection.StringMap; -import io.anuke.arc.util.io.CounterInputStream; -import io.anuke.arc.util.io.ReusableByteOutStream; -import io.anuke.mindustry.world.WorldContext; +import arc.struct.ObjectMap; +import arc.struct.ObjectMap.Entry; +import arc.struct.StringMap; +import arc.util.io.CounterInputStream; +import arc.util.io.ReusableByteOutStream; +import mindustry.world.WorldContext; import java.io.*; diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/mindustry/io/SaveIO.java similarity index 93% rename from core/src/io/anuke/mindustry/io/SaveIO.java rename to core/src/mindustry/io/SaveIO.java index 6aa76d8ba9..62abedef77 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/mindustry/io/SaveIO.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.io; +package mindustry.io; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.Fi; -import io.anuke.arc.util.io.CounterInputStream; -import io.anuke.arc.util.io.FastDeflaterOutputStream; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.io.versions.*; -import io.anuke.mindustry.world.WorldContext; +import arc.struct.*; +import arc.files.Fi; +import arc.util.io.CounterInputStream; +import arc.util.io.FastDeflaterOutputStream; +import mindustry.Vars; +import mindustry.io.versions.*; +import mindustry.world.WorldContext; import java.io.*; import java.util.Arrays; import java.util.zip.InflaterInputStream; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class SaveIO{ /** Format header. This is the string 'MSAV' in ASCII. */ diff --git a/core/src/io/anuke/mindustry/io/SaveMeta.java b/core/src/mindustry/io/SaveMeta.java similarity index 80% rename from core/src/io/anuke/mindustry/io/SaveMeta.java rename to core/src/mindustry/io/SaveMeta.java index 4759b955ab..04ce7e4af2 100644 --- a/core/src/io/anuke/mindustry/io/SaveMeta.java +++ b/core/src/mindustry/io/SaveMeta.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.io; +package mindustry.io; -import io.anuke.arc.collection.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.maps.*; +import arc.struct.*; +import mindustry.game.*; +import mindustry.maps.*; -import static io.anuke.mindustry.Vars.maps; +import static mindustry.Vars.maps; public class SaveMeta{ public int version; diff --git a/core/src/io/anuke/mindustry/io/SavePreviewLoader.java b/core/src/mindustry/io/SavePreviewLoader.java similarity index 74% rename from core/src/io/anuke/mindustry/io/SavePreviewLoader.java rename to core/src/mindustry/io/SavePreviewLoader.java index f7038875bc..bf01424a11 100644 --- a/core/src/io/anuke/mindustry/io/SavePreviewLoader.java +++ b/core/src/mindustry/io/SavePreviewLoader.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.io; +package mindustry.io; -import io.anuke.arc.assets.*; -import io.anuke.arc.assets.loaders.*; -import io.anuke.arc.assets.loaders.resolvers.*; -import io.anuke.arc.files.*; +import arc.assets.*; +import arc.assets.loaders.*; +import arc.assets.loaders.resolvers.*; +import arc.files.*; public class SavePreviewLoader extends TextureLoader{ diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java similarity index 93% rename from core/src/io/anuke/mindustry/io/SaveVersion.java rename to core/src/mindustry/io/SaveVersion.java index cab3c55250..06c75bc878 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -1,23 +1,23 @@ -package io.anuke.mindustry.io; +package mindustry.io; -import io.anuke.arc.collection.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.io.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Teams.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.struct.*; +import arc.util.*; +import arc.util.io.*; +import mindustry.content.*; +import mindustry.core.*; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; +import mindustry.entities.*; +import mindustry.entities.traits.*; +import mindustry.game.*; +import mindustry.game.Teams.*; +import mindustry.maps.*; +import mindustry.type.*; +import mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public abstract class SaveVersion extends SaveFileReader{ public int version; @@ -217,7 +217,7 @@ public abstract class SaveVersion extends SaveFileReader{ Array data = state.teams.getActive(); stream.writeInt(data.size); for(TeamData team : data){ - stream.writeInt(team.team.ordinal()); + stream.writeInt((int)team.team.id); stream.writeInt(team.brokenBlocks.size); for(BrokenBlock block : team.brokenBlocks){ stream.writeShort(block.x); @@ -258,8 +258,8 @@ public abstract class SaveVersion extends SaveFileReader{ public void readEntities(DataInput stream) throws IOException{ int teamc = stream.readInt(); for(int i = 0; i < teamc; i++){ - Team team = Team.all[stream.readInt()]; - TeamData data = state.teams.get(team); + Team team = Team.get(stream.readInt()); + TeamData data = team.data(); int blocks = stream.readInt(); for(int j = 0; j < blocks; j++){ data.brokenBlocks.addLast(new BrokenBlock(stream.readShort(), stream.readShort(), stream.readShort(), content.block(stream.readShort()).id, stream.readInt())); diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java similarity index 90% rename from core/src/io/anuke/mindustry/io/TypeIO.java rename to core/src/mindustry/io/TypeIO.java index be5161659b..5095ce396a 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -1,28 +1,28 @@ -package io.anuke.mindustry.io; +package mindustry.io; -import io.anuke.annotations.Annotations.ReadClass; -import io.anuke.annotations.Annotations.WriteClass; -import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; -import io.anuke.mindustry.entities.traits.ShooterTrait; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.net.Administration.TraceInfo; -import io.anuke.mindustry.net.Packets.AdminAction; -import io.anuke.mindustry.net.Packets.KickReason; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import mindustry.annotations.Annotations.ReadClass; +import mindustry.annotations.Annotations.WriteClass; +import arc.graphics.Color; +import mindustry.ctype.ContentType; +import mindustry.entities.Effects; +import mindustry.entities.Effects.Effect; +import mindustry.entities.type.Bullet; +import mindustry.entities.bullet.BulletType; +import mindustry.entities.traits.BuilderTrait.BuildRequest; +import mindustry.entities.traits.ShooterTrait; +import mindustry.entities.type.*; +import mindustry.entities.units.*; +import mindustry.game.*; +import mindustry.net.Administration.TraceInfo; +import mindustry.net.Packets.AdminAction; +import mindustry.net.Packets.KickReason; +import mindustry.type.*; +import mindustry.world.*; import java.io.*; import java.nio.ByteBuffer; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Class for specifying read/write methods for code generation. */ @SuppressWarnings("unused") @@ -87,7 +87,7 @@ public class TypeIO{ @WriteClass(BaseUnit.class) public static void writeBaseUnit(ByteBuffer buffer, BaseUnit unit){ - buffer.put((byte)unit.getTeam().ordinal()); + buffer.put((byte) (int)unit.getTeam().id); buffer.putInt(unit.getID()); } @@ -95,7 +95,7 @@ public class TypeIO{ public static BaseUnit readBaseUnit(ByteBuffer buffer){ byte tid = buffer.get(); int id = buffer.getInt(); - return unitGroups[tid].getByID(id); + return unitGroup.getByID(id); } @WriteClass(Tile.class) @@ -194,12 +194,12 @@ public class TypeIO{ @WriteClass(Team.class) public static void writeTeam(ByteBuffer buffer, Team reason){ - buffer.put((byte)reason.ordinal()); + buffer.put((byte) (int)reason.id); } @ReadClass(Team.class) public static Team readTeam(ByteBuffer buffer){ - return Team.all[buffer.get()]; + return Team.get(buffer.get()); } @WriteClass(UnitCommand.class) diff --git a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java b/core/src/mindustry/io/versions/LegacyTypeTable.java similarity index 90% rename from core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java rename to core/src/mindustry/io/versions/LegacyTypeTable.java index 6e04863262..2aeb8c8d66 100644 --- a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java +++ b/core/src/mindustry/io/versions/LegacyTypeTable.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.io.versions; +package mindustry.io.versions; -import io.anuke.arc.func.Prov; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.entities.type.base.*; +import arc.func.Prov; +import mindustry.entities.type.Bullet; +import mindustry.entities.effect.*; +import mindustry.entities.type.Player; +import mindustry.entities.type.base.*; /* Latest data: [build 81] diff --git a/core/src/io/anuke/mindustry/io/versions/Save1.java b/core/src/mindustry/io/versions/Save1.java similarity index 86% rename from core/src/io/anuke/mindustry/io/versions/Save1.java rename to core/src/mindustry/io/versions/Save1.java index 471c2c2f3f..446fe8e80b 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save1.java +++ b/core/src/mindustry/io/versions/Save1.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.io.versions; +package mindustry.io.versions; -import io.anuke.arc.func.*; -import io.anuke.mindustry.entities.traits.*; +import arc.func.*; +import mindustry.entities.traits.*; import java.io.*; diff --git a/core/src/io/anuke/mindustry/io/versions/Save2.java b/core/src/mindustry/io/versions/Save2.java similarity index 75% rename from core/src/io/anuke/mindustry/io/versions/Save2.java rename to core/src/mindustry/io/versions/Save2.java index bcf0fb8366..497289ed71 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save2.java +++ b/core/src/mindustry/io/versions/Save2.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.io.versions; +package mindustry.io.versions; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.type.TypeID; +import mindustry.ctype.ContentType; +import mindustry.entities.traits.*; +import mindustry.io.*; +import mindustry.type.TypeID; import java.io.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class Save2 extends SaveVersion{ diff --git a/core/src/io/anuke/mindustry/io/versions/Save3.java b/core/src/mindustry/io/versions/Save3.java similarity index 55% rename from core/src/io/anuke/mindustry/io/versions/Save3.java rename to core/src/mindustry/io/versions/Save3.java index c418a1bf46..74a9d7a2c4 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save3.java +++ b/core/src/mindustry/io/versions/Save3.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.io.versions; +package mindustry.io.versions; -import io.anuke.mindustry.io.*; +import mindustry.io.*; public class Save3 extends SaveVersion{ public Save3(){ diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/mindustry/maps/Map.java similarity index 92% rename from core/src/io/anuke/mindustry/maps/Map.java rename to core/src/mindustry/maps/Map.java index 6fef24a8c4..90bb4f2f87 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/mindustry/maps/Map.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.maps; +package mindustry.maps; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.maps.filters.*; -import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.type.*; +import arc.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.io.*; +import mindustry.maps.filters.*; +import mindustry.mod.Mods.*; +import mindustry.type.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Map implements Comparable, Publishable{ /** Whether this is a custom map. */ diff --git a/core/src/io/anuke/mindustry/maps/MapException.java b/core/src/mindustry/maps/MapException.java similarity index 84% rename from core/src/io/anuke/mindustry/maps/MapException.java rename to core/src/mindustry/maps/MapException.java index 7bc1c76805..c97b274432 100644 --- a/core/src/io/anuke/mindustry/maps/MapException.java +++ b/core/src/mindustry/maps/MapException.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.maps; +package mindustry.maps; public class MapException extends RuntimeException{ public final Map map; diff --git a/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java b/core/src/mindustry/maps/MapPreviewLoader.java similarity index 80% rename from core/src/io/anuke/mindustry/maps/MapPreviewLoader.java rename to core/src/mindustry/maps/MapPreviewLoader.java index a6f218cb7a..3572846ea7 100644 --- a/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java +++ b/core/src/mindustry/maps/MapPreviewLoader.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.maps; +package mindustry.maps; -import io.anuke.arc.assets.*; -import io.anuke.arc.assets.loaders.*; -import io.anuke.arc.assets.loaders.resolvers.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.ctype.Content; +import arc.assets.*; +import arc.assets.loaders.*; +import arc.assets.loaders.resolvers.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.util.*; +import mindustry.*; +import mindustry.ctype.Content; public class MapPreviewLoader extends TextureLoader{ diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java similarity index 93% rename from core/src/io/anuke/mindustry/maps/Maps.java rename to core/src/mindustry/maps/Maps.java index 60cc313659..2f4cbc3214 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/mindustry/maps/Maps.java @@ -1,32 +1,32 @@ -package io.anuke.mindustry.maps; +package mindustry.maps; -import io.anuke.arc.*; -import io.anuke.arc.assets.*; -import io.anuke.arc.assets.loaders.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.collection.IntSet.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.async.*; -import io.anuke.arc.util.io.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.maps.MapPreviewLoader.*; -import io.anuke.mindustry.maps.filters.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.storage.*; +import arc.*; +import arc.assets.*; +import arc.assets.loaders.*; +import arc.struct.*; +import arc.struct.IntSet.*; +import arc.files.*; +import arc.func.*; +import arc.graphics.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import arc.util.async.*; +import arc.util.io.*; +import arc.util.serialization.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.ctype.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.io.*; +import mindustry.maps.MapPreviewLoader.*; +import mindustry.maps.filters.*; +import mindustry.world.*; +import mindustry.world.blocks.storage.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Maps{ /** List of all built-in maps. Filenames only. */ @@ -89,6 +89,7 @@ public class Maps{ for(Map map : maps){ try{ map.texture = map.previewFile().exists() ? new Texture(map.previewFile()) : new Texture(MapIO.generatePreview(map)); + readCache(map); }catch(Exception e){ e.printStackTrace(); } @@ -96,7 +97,7 @@ public class Maps{ }); if(Core.assets != null){ - ((CustomLoader)Core.assets.getLoader(Content.class)).loaded = this::createAllPreviews; + ((CustomLoader) Core.assets.getLoader(Content.class)).loaded = this::createAllPreviews; } } @@ -328,7 +329,7 @@ public class Maps{ return filters; }else{ try{ - return JsonIO.read(Array.class, str.replace("mindustrz", "mindustry")); + return JsonIO.read(Array.class, str); }catch(Exception e){ e.printStackTrace(); return readFilters(""); diff --git a/core/src/io/anuke/mindustry/maps/filters/BlendFilter.java b/core/src/mindustry/maps/filters/BlendFilter.java similarity index 82% rename from core/src/io/anuke/mindustry/maps/filters/BlendFilter.java rename to core/src/mindustry/maps/filters/BlendFilter.java index f1f16e7800..a60ab71fa9 100644 --- a/core/src/io/anuke/mindustry/maps/filters/BlendFilter.java +++ b/core/src/mindustry/maps/filters/BlendFilter.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.arc.math.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.maps.filters.FilterOption.*; -import io.anuke.mindustry.world.*; +import arc.math.*; +import mindustry.content.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; -import static io.anuke.mindustry.maps.filters.FilterOption.*; +import static mindustry.maps.filters.FilterOption.*; public class BlendFilter extends GenerateFilter{ float radius = 2f; diff --git a/core/src/io/anuke/mindustry/maps/filters/ClearFilter.java b/core/src/mindustry/maps/filters/ClearFilter.java similarity index 65% rename from core/src/io/anuke/mindustry/maps/filters/ClearFilter.java rename to core/src/mindustry/maps/filters/ClearFilter.java index 418f99bebc..c35cdee8e2 100644 --- a/core/src/io/anuke/mindustry/maps/filters/ClearFilter.java +++ b/core/src/mindustry/maps/filters/ClearFilter.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.world.*; +import mindustry.content.*; +import mindustry.world.*; -import static io.anuke.mindustry.maps.filters.FilterOption.*; +import static mindustry.maps.filters.FilterOption.*; public class ClearFilter extends GenerateFilter{ protected Block block = Blocks.air; diff --git a/core/src/io/anuke/mindustry/maps/filters/DistortFilter.java b/core/src/mindustry/maps/filters/DistortFilter.java similarity index 79% rename from core/src/io/anuke/mindustry/maps/filters/DistortFilter.java rename to core/src/mindustry/maps/filters/DistortFilter.java index 7c9cdf1c5f..6757af9cc2 100644 --- a/core/src/io/anuke/mindustry/maps/filters/DistortFilter.java +++ b/core/src/mindustry/maps/filters/DistortFilter.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.mindustry.maps.filters.FilterOption.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; +import mindustry.world.blocks.*; public class DistortFilter extends GenerateFilter{ float scl = 40, mag = 5; diff --git a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java b/core/src/mindustry/maps/filters/FilterOption.java similarity index 76% rename from core/src/io/anuke/mindustry/maps/filters/FilterOption.java rename to core/src/mindustry/maps/filters/FilterOption.java index df75282eb2..596c5d0b2d 100644 --- a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java +++ b/core/src/mindustry/maps/filters/FilterOption.java @@ -1,27 +1,27 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.arc.*; -import io.anuke.arc.func.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.ui.dialogs.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.*; +import arc.func.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.ui.Cicon; +import mindustry.ui.dialogs.*; +import mindustry.world.*; +import mindustry.world.blocks.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public abstract class FilterOption{ - public static final Boolf floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); - public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); - public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); - public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); - public static final Boolf wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); - public static final Boolf oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); + public static final Boolf floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); + public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); + public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); + public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); + public static final Boolf wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); + public static final Boolf oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); public static final Boolf anyOptional = b -> floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air; public abstract void build(Table table); @@ -76,8 +76,8 @@ public abstract class FilterOption{ @Override public void build(Table table){ - table.addButton(b -> b.addImage(supplier.get().icon(io.anuke.mindustry.ui.Cicon.small)).update(i -> ((TextureRegionDrawable)i.getDrawable()) - .setRegion(supplier.get() == Blocks.air ? Core.atlas.find("icon-none") : supplier.get().icon(io.anuke.mindustry.ui.Cicon.small))).size(8 * 3), () -> { + table.addButton(b -> b.addImage(supplier.get().icon(mindustry.ui.Cicon.small)).update(i -> ((TextureRegionDrawable)i.getDrawable()) + .setRegion(supplier.get() == Blocks.air ? Core.atlas.find("icon-none") : supplier.get().icon(mindustry.ui.Cicon.small))).size(8 * 3), () -> { FloatingDialog dialog = new FloatingDialog(""); dialog.setFillParent(false); int i = 0; diff --git a/core/src/io/anuke/mindustry/maps/filters/GenerateFilter.java b/core/src/mindustry/maps/filters/GenerateFilter.java similarity index 91% rename from core/src/io/anuke/mindustry/maps/filters/GenerateFilter.java rename to core/src/mindustry/maps/filters/GenerateFilter.java index e3f1c2ccf4..f24672b8d0 100644 --- a/core/src/io/anuke/mindustry/maps/filters/GenerateFilter.java +++ b/core/src/mindustry/maps/filters/GenerateFilter.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.arc.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.noise.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.*; +import arc.math.*; +import arc.scene.ui.*; +import arc.util.*; +import arc.util.noise.*; +import mindustry.content.*; +import mindustry.world.*; +import mindustry.world.blocks.*; public abstract class GenerateFilter{ protected transient float o = (float)(Math.random() * 10000000.0); diff --git a/core/src/io/anuke/mindustry/maps/filters/MedianFilter.java b/core/src/mindustry/maps/filters/MedianFilter.java similarity index 83% rename from core/src/io/anuke/mindustry/maps/filters/MedianFilter.java rename to core/src/mindustry/maps/filters/MedianFilter.java index 9cc4606d20..1d169b998b 100644 --- a/core/src/io/anuke/mindustry/maps/filters/MedianFilter.java +++ b/core/src/mindustry/maps/filters/MedianFilter.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.mindustry.maps.filters.FilterOption.*; -import io.anuke.mindustry.world.*; +import arc.struct.*; +import arc.math.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class MedianFilter extends GenerateFilter{ float radius = 2; diff --git a/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java b/core/src/mindustry/maps/filters/MirrorFilter.java similarity index 76% rename from core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java rename to core/src/mindustry/maps/filters/MirrorFilter.java index 673d825cc0..b9bf2a70d8 100644 --- a/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java +++ b/core/src/mindustry/maps/filters/MirrorFilter.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.maps.filters.FilterOption.*; -import io.anuke.mindustry.world.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.math.geom.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.graphics.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; public class MirrorFilter extends GenerateFilter{ - private final Vector2 v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2(); + private final Vec2 v1 = new Vec2(), v2 = new Vec2(), v3 = new Vec2(); int angle = 45; @@ -44,12 +44,12 @@ public class MirrorFilter extends GenerateFilter{ public void draw(Image image){ super.draw(image); - Vector2 vsize = Scaling.fit.apply(image.getDrawable().getMinWidth(), image.getDrawable().getMinHeight(), image.getWidth(), image.getHeight()); + Vec2 vsize = Scaling.fit.apply(image.getDrawable().getMinWidth(), image.getDrawable().getMinHeight(), image.getWidth(), image.getHeight()); float imageWidth = Math.max(vsize.x, vsize.y); float imageHeight = Math.max(vsize.y, vsize.x); float size = Math.max(image.getWidth() *2, image.getHeight()*2); - Cons clamper = v -> + Cons clamper = v -> v.clamp( image.getX() + image.getWidth()/2f - imageWidth/2f, image.getX() + image.getWidth()/2f + imageWidth/2f, @@ -64,7 +64,7 @@ public class MirrorFilter extends GenerateFilter{ Draw.reset(); } - void mirror(Vector2 p, float x0, float y0, float x1, float y1){ + void mirror(Vec2 p, float x0, float y0, float x1, float y1){ //special case: uneven map mirrored at 45 degree angle if(in.width != in.height && angle % 90 != 0){ p.x = (p.x - in.width/2f) * -1 + in.width/2f; @@ -80,7 +80,7 @@ public class MirrorFilter extends GenerateFilter{ } } - boolean left(Vector2 a, Vector2 b, Vector2 c){ + boolean left(Vec2 a, Vec2 b, Vec2 c){ return ((b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x)) > 0; } } diff --git a/core/src/io/anuke/mindustry/maps/filters/NoiseFilter.java b/core/src/mindustry/maps/filters/NoiseFilter.java similarity index 69% rename from core/src/io/anuke/mindustry/maps/filters/NoiseFilter.java rename to core/src/mindustry/maps/filters/NoiseFilter.java index 25aaeae3b1..e532de69a8 100644 --- a/core/src/io/anuke/mindustry/maps/filters/NoiseFilter.java +++ b/core/src/mindustry/maps/filters/NoiseFilter.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.maps.filters.FilterOption.BlockOption; -import io.anuke.mindustry.maps.filters.FilterOption.SliderOption; -import io.anuke.mindustry.world.Block; +import mindustry.content.Blocks; +import mindustry.maps.filters.FilterOption.BlockOption; +import mindustry.maps.filters.FilterOption.SliderOption; +import mindustry.world.Block; -import static io.anuke.mindustry.maps.filters.FilterOption.floorsOnly; -import static io.anuke.mindustry.maps.filters.FilterOption.wallsOnly; +import static mindustry.maps.filters.FilterOption.floorsOnly; +import static mindustry.maps.filters.FilterOption.wallsOnly; public class NoiseFilter extends GenerateFilter{ float scl = 40, threshold = 0.5f, octaves = 3f, falloff = 0.5f; diff --git a/core/src/io/anuke/mindustry/maps/filters/OreFilter.java b/core/src/mindustry/maps/filters/OreFilter.java similarity index 71% rename from core/src/io/anuke/mindustry/maps/filters/OreFilter.java rename to core/src/mindustry/maps/filters/OreFilter.java index d1ebce2f7d..eeca4c04b8 100644 --- a/core/src/io/anuke/mindustry/maps/filters/OreFilter.java +++ b/core/src/mindustry/maps/filters/OreFilter.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.maps.filters.FilterOption.SliderOption; -import io.anuke.mindustry.world.Block; +import mindustry.content.Blocks; +import mindustry.maps.filters.FilterOption.SliderOption; +import mindustry.world.Block; -import static io.anuke.mindustry.maps.filters.FilterOption.BlockOption; -import static io.anuke.mindustry.maps.filters.FilterOption.oresOnly; +import static mindustry.maps.filters.FilterOption.BlockOption; +import static mindustry.maps.filters.FilterOption.oresOnly; public class OreFilter extends GenerateFilter{ public float scl = 23, threshold = 0.81f, octaves = 2f, falloff = 0.3f; diff --git a/core/src/io/anuke/mindustry/maps/filters/OreMedianFilter.java b/core/src/mindustry/maps/filters/OreMedianFilter.java similarity index 86% rename from core/src/io/anuke/mindustry/maps/filters/OreMedianFilter.java rename to core/src/mindustry/maps/filters/OreMedianFilter.java index 8080b49699..843909ba7b 100644 --- a/core/src/io/anuke/mindustry/maps/filters/OreMedianFilter.java +++ b/core/src/mindustry/maps/filters/OreMedianFilter.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.maps.filters.FilterOption.*; -import io.anuke.mindustry.world.*; +import arc.struct.*; +import arc.math.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; public class OreMedianFilter extends GenerateFilter{ public float radius = 2; diff --git a/core/src/io/anuke/mindustry/maps/filters/RiverNoiseFilter.java b/core/src/mindustry/maps/filters/RiverNoiseFilter.java similarity index 72% rename from core/src/io/anuke/mindustry/maps/filters/RiverNoiseFilter.java rename to core/src/mindustry/maps/filters/RiverNoiseFilter.java index 1af7165157..1257bcf8b3 100644 --- a/core/src/io/anuke/mindustry/maps/filters/RiverNoiseFilter.java +++ b/core/src/mindustry/maps/filters/RiverNoiseFilter.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.maps.filters.FilterOption.BlockOption; -import io.anuke.mindustry.maps.filters.FilterOption.SliderOption; -import io.anuke.mindustry.world.Block; +import mindustry.content.Blocks; +import mindustry.maps.filters.FilterOption.BlockOption; +import mindustry.maps.filters.FilterOption.SliderOption; +import mindustry.world.Block; -import static io.anuke.mindustry.maps.filters.FilterOption.floorsOnly; -import static io.anuke.mindustry.maps.filters.FilterOption.wallsOnly; +import static mindustry.maps.filters.FilterOption.floorsOnly; +import static mindustry.maps.filters.FilterOption.wallsOnly; public class RiverNoiseFilter extends GenerateFilter{ float scl = 40, threshold = 0f, threshold2 = 0.1f; diff --git a/core/src/io/anuke/mindustry/maps/filters/ScatterFilter.java b/core/src/mindustry/maps/filters/ScatterFilter.java similarity index 76% rename from core/src/io/anuke/mindustry/maps/filters/ScatterFilter.java rename to core/src/mindustry/maps/filters/ScatterFilter.java index 3c00823075..7573c0a06a 100644 --- a/core/src/io/anuke/mindustry/maps/filters/ScatterFilter.java +++ b/core/src/mindustry/maps/filters/ScatterFilter.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.maps.filters.FilterOption.BlockOption; -import io.anuke.mindustry.maps.filters.FilterOption.SliderOption; -import io.anuke.mindustry.world.Block; +import mindustry.content.Blocks; +import mindustry.maps.filters.FilterOption.BlockOption; +import mindustry.maps.filters.FilterOption.SliderOption; +import mindustry.world.Block; -import static io.anuke.mindustry.maps.filters.FilterOption.*; +import static mindustry.maps.filters.FilterOption.*; public class ScatterFilter extends GenerateFilter{ protected float chance = 0.014f; diff --git a/core/src/io/anuke/mindustry/maps/filters/TerrainFilter.java b/core/src/mindustry/maps/filters/TerrainFilter.java similarity index 74% rename from core/src/io/anuke/mindustry/maps/filters/TerrainFilter.java rename to core/src/mindustry/maps/filters/TerrainFilter.java index 6082616494..d8ad659f8a 100644 --- a/core/src/io/anuke/mindustry/maps/filters/TerrainFilter.java +++ b/core/src/mindustry/maps/filters/TerrainFilter.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.maps.filters; +package mindustry.maps.filters; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.maps.filters.FilterOption.BlockOption; -import io.anuke.mindustry.maps.filters.FilterOption.SliderOption; -import io.anuke.mindustry.world.Block; +import arc.math.Mathf; +import mindustry.content.Blocks; +import mindustry.maps.filters.FilterOption.BlockOption; +import mindustry.maps.filters.FilterOption.SliderOption; +import mindustry.world.Block; -import static io.anuke.mindustry.maps.filters.FilterOption.floorsOnly; -import static io.anuke.mindustry.maps.filters.FilterOption.wallsOnly; +import static mindustry.maps.filters.FilterOption.floorsOnly; +import static mindustry.maps.filters.FilterOption.wallsOnly; public class TerrainFilter extends GenerateFilter{ float scl = 40, threshold = 0.9f, octaves = 3f, falloff = 0.5f, magnitude = 1f, circleScl = 2.1f; diff --git a/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java b/core/src/mindustry/maps/generators/BasicGenerator.java similarity index 95% rename from core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java rename to core/src/mindustry/maps/generators/BasicGenerator.java index 40911d31f6..b75c50a01a 100644 --- a/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/mindustry/maps/generators/BasicGenerator.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.maps.generators; +package mindustry.maps.generators; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.Intc2; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Geometry; -import io.anuke.arc.math.geom.Point2; -import io.anuke.arc.util.Structs; -import io.anuke.arc.util.noise.Simplex; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.Floor; +import arc.struct.*; +import arc.func.Intc2; +import arc.math.Mathf; +import arc.math.geom.Geometry; +import arc.math.geom.Point2; +import arc.util.Structs; +import arc.util.noise.Simplex; +import mindustry.content.Blocks; +import mindustry.world.*; +import mindustry.world.blocks.Floor; import java.util.PriorityQueue; diff --git a/core/src/io/anuke/mindustry/maps/generators/Generator.java b/core/src/mindustry/maps/generators/Generator.java similarity index 76% rename from core/src/io/anuke/mindustry/maps/generators/Generator.java rename to core/src/mindustry/maps/generators/Generator.java index 0b64a067de..b2a09e94c0 100644 --- a/core/src/io/anuke/mindustry/maps/generators/Generator.java +++ b/core/src/mindustry/maps/generators/Generator.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.maps.generators; +package mindustry.maps.generators; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.world.*; +import mindustry.game.*; +import mindustry.world.*; public abstract class Generator{ public int width, height; diff --git a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java b/core/src/mindustry/maps/generators/MapGenerator.java similarity index 90% rename from core/src/io/anuke/mindustry/maps/generators/MapGenerator.java rename to core/src/mindustry/maps/generators/MapGenerator.java index 0f819e8d16..69c11bdc7b 100644 --- a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java +++ b/core/src/mindustry/maps/generators/MapGenerator.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.maps.generators; +package mindustry.maps.generators; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.storage.*; +import arc.struct.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.game.*; +import mindustry.io.*; +import mindustry.maps.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.storage.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MapGenerator extends Generator{ private Map map; @@ -74,7 +74,7 @@ public class MapGenerator extends Generator{ for(int x = 0; x < width; x++){ for(int y = 0; y < height; y++){ - if(tiles[x][y].block() instanceof CoreBlock && tiles[x][y].getTeam() == defaultTeam){ + if(tiles[x][y].block() instanceof CoreBlock && tiles[x][y].getTeam() == state.rules.defaultTeam){ players.add(new Point2(x, y)); tiles[x][y].setBlock(Blocks.air); } diff --git a/core/src/io/anuke/mindustry/maps/generators/RandomGenerator.java b/core/src/mindustry/maps/generators/RandomGenerator.java similarity index 77% rename from core/src/io/anuke/mindustry/maps/generators/RandomGenerator.java rename to core/src/mindustry/maps/generators/RandomGenerator.java index 23591e86df..039d923172 100644 --- a/core/src/io/anuke/mindustry/maps/generators/RandomGenerator.java +++ b/core/src/mindustry/maps/generators/RandomGenerator.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.maps.generators; +package mindustry.maps.generators; -import io.anuke.arc.collection.StringMap; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import arc.struct.StringMap; +import mindustry.content.Blocks; +import mindustry.maps.Map; +import mindustry.world.Block; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.world; public abstract class RandomGenerator extends Generator{ protected Block floor; diff --git a/core/src/io/anuke/mindustry/maps/zonegen/DesertWastesGenerator.java b/core/src/mindustry/maps/zonegen/DesertWastesGenerator.java similarity index 86% rename from core/src/io/anuke/mindustry/maps/zonegen/DesertWastesGenerator.java rename to core/src/mindustry/maps/zonegen/DesertWastesGenerator.java index a82b121c31..cf7e435825 100644 --- a/core/src/io/anuke/mindustry/maps/zonegen/DesertWastesGenerator.java +++ b/core/src/mindustry/maps/zonegen/DesertWastesGenerator.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.maps.zonegen; +package mindustry.maps.zonegen; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.maps.generators.BasicGenerator; -import io.anuke.mindustry.world.Tile; +import arc.math.Mathf; +import mindustry.content.Blocks; +import mindustry.maps.generators.BasicGenerator; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.schematics; +import static mindustry.Vars.schematics; public class DesertWastesGenerator extends BasicGenerator{ diff --git a/core/src/io/anuke/mindustry/maps/zonegen/OvergrowthGenerator.java b/core/src/mindustry/maps/zonegen/OvergrowthGenerator.java similarity index 86% rename from core/src/io/anuke/mindustry/maps/zonegen/OvergrowthGenerator.java rename to core/src/mindustry/maps/zonegen/OvergrowthGenerator.java index 527eab7d0d..e2aa0e96ca 100644 --- a/core/src/io/anuke/mindustry/maps/zonegen/OvergrowthGenerator.java +++ b/core/src/mindustry/maps/zonegen/OvergrowthGenerator.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.maps.zonegen; +package mindustry.maps.zonegen; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.maps.generators.BasicGenerator; -import io.anuke.mindustry.world.Tile; +import arc.math.Mathf; +import mindustry.content.Blocks; +import mindustry.maps.generators.BasicGenerator; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.schematics; +import static mindustry.Vars.schematics; public class OvergrowthGenerator extends BasicGenerator{ diff --git a/core/src/mindustry/mod/ClassAccess.java b/core/src/mindustry/mod/ClassAccess.java new file mode 100644 index 0000000000..7046227686 --- /dev/null +++ b/core/src/mindustry/mod/ClassAccess.java @@ -0,0 +1,7 @@ +package mindustry.mod; + +import arc.struct.*; +//obviously autogenerated, do not touch +public class ClassAccess{ + public static final ObjectSet allowedClassNames = ObjectSet.with("arc.Core", "arc.func.Boolc", "arc.func.Boolf", "arc.func.Boolf2", "arc.func.Boolp", "arc.func.Cons", "arc.func.Cons2", "arc.func.Floatc", "arc.func.Floatc2", "arc.func.Floatc4", "arc.func.Floatf", "arc.func.Floatp", "arc.func.Func", "arc.func.Func2", "arc.func.Func3", "arc.func.Intc", "arc.func.Intc2", "arc.func.Intc4", "arc.func.Intf", "arc.func.Intp", "arc.func.Prov", "arc.graphics.Color", "arc.graphics.Pixmap", "arc.graphics.Texture", "arc.graphics.TextureData", "arc.graphics.g2d.Draw", "arc.graphics.g2d.Fill", "arc.graphics.g2d.Lines", "arc.graphics.g2d.TextureAtlas", "arc.graphics.g2d.TextureAtlas$AtlasRegion", "arc.graphics.g2d.TextureRegion", "arc.math.Affine2", "arc.math.Angles", "arc.math.Angles", "arc.math.Angles$ParticleConsumer", "arc.math.CumulativeDistribution", "arc.math.CumulativeDistribution$CumulativeValue", "arc.math.DelaunayTriangulator", "arc.math.EarClippingTriangulator", "arc.math.Extrapolator", "arc.math.FloatCounter", "arc.math.Interpolation", "arc.math.Interpolation$Bounce", "arc.math.Interpolation$BounceIn", "arc.math.Interpolation$BounceOut", "arc.math.Interpolation$Elastic", "arc.math.Interpolation$ElasticIn", "arc.math.Interpolation$ElasticOut", "arc.math.Interpolation$Exp", "arc.math.Interpolation$ExpIn", "arc.math.Interpolation$ExpOut", "arc.math.Interpolation$Pow", "arc.math.Interpolation$PowIn", "arc.math.Interpolation$PowOut", "arc.math.Interpolation$Swing", "arc.math.Interpolation$SwingIn", "arc.math.Interpolation$SwingOut", "arc.math.Mathf", "arc.math.Mathf", "arc.math.Matrix3", "arc.math.WindowedMean", "arc.math.geom.BSpline", "arc.math.geom.Bezier", "arc.math.geom.Bresenham2", "arc.math.geom.CatmullRomSpline", "arc.math.geom.Circle", "arc.math.geom.ConvexHull", "arc.math.geom.Ellipse", "arc.math.geom.FixedPosition", "arc.math.geom.Geometry", "arc.math.geom.Geometry$Raycaster", "arc.math.geom.Geometry$SolidChecker", "arc.math.geom.Intersector", "arc.math.geom.Intersector$MinimumTranslationVector", "arc.math.geom.Path", "arc.math.geom.Point2", "arc.math.geom.Point3", "arc.math.geom.Polygon", "arc.math.geom.Polyline", "arc.math.geom.Position", "arc.math.geom.QuadTree", "arc.math.geom.QuadTree$QuadTreeObject", "arc.math.geom.Rect", "arc.math.geom.Shape2D", "arc.math.geom.Spring1D", "arc.math.geom.Spring2D", "arc.math.geom.Vec2", "arc.math.geom.Vec3", "arc.math.geom.Vector", "arc.scene.Action", "arc.scene.Element", "arc.scene.Group", "arc.scene.Scene", "arc.scene.actions.Actions", "arc.scene.actions.AddAction", "arc.scene.actions.AddListenerAction", "arc.scene.actions.AfterAction", "arc.scene.actions.AlphaAction", "arc.scene.actions.ColorAction", "arc.scene.actions.DelayAction", "arc.scene.actions.DelegateAction", "arc.scene.actions.FloatAction", "arc.scene.actions.IntAction", "arc.scene.actions.LayoutAction", "arc.scene.actions.MoveByAction", "arc.scene.actions.MoveToAction", "arc.scene.actions.OriginAction", "arc.scene.actions.ParallelAction", "arc.scene.actions.RelativeTemporalAction", "arc.scene.actions.RemoveAction", "arc.scene.actions.RemoveActorAction", "arc.scene.actions.RemoveListenerAction", "arc.scene.actions.RepeatAction", "arc.scene.actions.RotateByAction", "arc.scene.actions.RotateToAction", "arc.scene.actions.RunnableAction", "arc.scene.actions.ScaleByAction", "arc.scene.actions.ScaleToAction", "arc.scene.actions.SequenceAction", "arc.scene.actions.SizeByAction", "arc.scene.actions.SizeToAction", "arc.scene.actions.TemporalAction", "arc.scene.actions.TimeScaleAction", "arc.scene.actions.TouchableAction", "arc.scene.actions.TranslateByAction", "arc.scene.actions.VisibleAction", "arc.scene.event.ChangeListener", "arc.scene.event.ChangeListener$ChangeEvent", "arc.scene.event.ClickListener", "arc.scene.event.DragListener", "arc.scene.event.DragScrollListener", "arc.scene.event.ElementGestureListener", "arc.scene.event.EventListener", "arc.scene.event.FocusListener", "arc.scene.event.FocusListener$FocusEvent", "arc.scene.event.FocusListener$FocusEvent$Type", "arc.scene.event.HandCursorListener", "arc.scene.event.IbeamCursorListener", "arc.scene.event.InputEvent", "arc.scene.event.InputEvent$Type", "arc.scene.event.InputListener", "arc.scene.event.SceneEvent", "arc.scene.event.Touchable", "arc.scene.event.VisibilityEvent", "arc.scene.event.VisibilityListener", "arc.scene.style.BaseDrawable", "arc.scene.style.Drawable", "arc.scene.style.NinePatchDrawable", "arc.scene.style.ScaledNinePatchDrawable", "arc.scene.style.Style", "arc.scene.style.TextureRegionDrawable", "arc.scene.style.TiledDrawable", "arc.scene.style.TransformDrawable", "arc.scene.ui.Button", "arc.scene.ui.Button$ButtonStyle", "arc.scene.ui.ButtonGroup", "arc.scene.ui.CheckBox", "arc.scene.ui.CheckBox$CheckBoxStyle", "arc.scene.ui.ColorImage", "arc.scene.ui.Dialog", "arc.scene.ui.Dialog$DialogStyle", "arc.scene.ui.Image", "arc.scene.ui.ImageButton", "arc.scene.ui.ImageButton$ImageButtonStyle", "arc.scene.ui.KeybindDialog", "arc.scene.ui.KeybindDialog$KeybindDialogStyle", "arc.scene.ui.Label", "arc.scene.ui.Label$LabelStyle", "arc.scene.ui.ProgressBar", "arc.scene.ui.ProgressBar$ProgressBarStyle", "arc.scene.ui.ScrollPane", "arc.scene.ui.ScrollPane$ScrollPaneStyle", "arc.scene.ui.SettingsDialog", "arc.scene.ui.SettingsDialog$SettingsTable", "arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "arc.scene.ui.SettingsDialog$SettingsTable$Setting", "arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "arc.scene.ui.SettingsDialog$StringProcessor", "arc.scene.ui.Slider", "arc.scene.ui.Slider$SliderStyle", "arc.scene.ui.TextArea", "arc.scene.ui.TextArea$TextAreaListener", "arc.scene.ui.TextButton", "arc.scene.ui.TextButton$TextButtonStyle", "arc.scene.ui.TextField", "arc.scene.ui.TextField$DefaultOnscreenKeyboard", "arc.scene.ui.TextField$OnscreenKeyboard", "arc.scene.ui.TextField$TextFieldClickListener", "arc.scene.ui.TextField$TextFieldFilter", "arc.scene.ui.TextField$TextFieldListener", "arc.scene.ui.TextField$TextFieldStyle", "arc.scene.ui.TextField$TextFieldValidator", "arc.scene.ui.Tooltip", "arc.scene.ui.Tooltip$Tooltips", "arc.scene.ui.Touchpad", "arc.scene.ui.Touchpad$TouchpadStyle", "arc.scene.ui.TreeElement", "arc.scene.ui.TreeElement$Node", "arc.scene.ui.TreeElement$TreeStyle", "arc.scene.ui.layout.Cell", "arc.scene.ui.layout.Collapser", "arc.scene.ui.layout.HorizontalGroup", "arc.scene.ui.layout.Scl", "arc.scene.ui.layout.Stack", "arc.scene.ui.layout.Table", "arc.scene.ui.layout.Table$DrawRect", "arc.scene.ui.layout.VerticalGroup", "arc.scene.ui.layout.WidgetGroup", "arc.scene.utils.ArraySelection", "arc.scene.utils.Cullable", "arc.scene.utils.Disableable", "arc.scene.utils.DragAndDrop", "arc.scene.utils.DragAndDrop$Payload", "arc.scene.utils.DragAndDrop$Source", "arc.scene.utils.DragAndDrop$Target", "arc.scene.utils.Elements", "arc.scene.utils.Layout", "arc.scene.utils.Selection", "arc.struct.Array", "arc.struct.Array$ArrayIterable", "arc.struct.ArrayMap", "arc.struct.ArrayMap$Entries", "arc.struct.ArrayMap$Keys", "arc.struct.ArrayMap$Values", "arc.struct.AtomicQueue", "arc.struct.BinaryHeap", "arc.struct.BinaryHeap$Node", "arc.struct.Bits", "arc.struct.BooleanArray", "arc.struct.ByteArray", "arc.struct.CharArray", "arc.struct.ComparableTimSort", "arc.struct.DelayedRemovalArray", "arc.struct.EnumSet", "arc.struct.EnumSet$EnumSetIterator", "arc.struct.FloatArray", "arc.struct.GridBits", "arc.struct.GridMap", "arc.struct.IdentityMap", "arc.struct.IdentityMap$Entries", "arc.struct.IdentityMap$Entry", "arc.struct.IdentityMap$Keys", "arc.struct.IdentityMap$Values", "arc.struct.IntArray", "arc.struct.IntFloatMap", "arc.struct.IntFloatMap$Entries", "arc.struct.IntFloatMap$Entry", "arc.struct.IntFloatMap$Keys", "arc.struct.IntFloatMap$Values", "arc.struct.IntIntMap", "arc.struct.IntIntMap$Entries", "arc.struct.IntIntMap$Entry", "arc.struct.IntIntMap$Keys", "arc.struct.IntIntMap$Values", "arc.struct.IntMap", "arc.struct.IntMap$Entries", "arc.struct.IntMap$Entry", "arc.struct.IntMap$Keys", "arc.struct.IntMap$Values", "arc.struct.IntQueue", "arc.struct.IntSet", "arc.struct.IntSet$IntSetIterator", "arc.struct.LongArray", "arc.struct.LongMap", "arc.struct.LongMap$Entries", "arc.struct.LongMap$Entry", "arc.struct.LongMap$Keys", "arc.struct.LongMap$Values", "arc.struct.LongQueue", "arc.struct.ObjectFloatMap", "arc.struct.ObjectFloatMap$Entries", "arc.struct.ObjectFloatMap$Entry", "arc.struct.ObjectFloatMap$Keys", "arc.struct.ObjectFloatMap$Values", "arc.struct.ObjectIntMap", "arc.struct.ObjectIntMap$Entries", "arc.struct.ObjectIntMap$Entry", "arc.struct.ObjectIntMap$Keys", "arc.struct.ObjectIntMap$Values", "arc.struct.ObjectMap", "arc.struct.ObjectMap$Entries", "arc.struct.ObjectMap$Entry", "arc.struct.ObjectMap$Keys", "arc.struct.ObjectMap$Values", "arc.struct.ObjectSet", "arc.struct.ObjectSet$ObjectSetIterator", "arc.struct.OrderedMap", "arc.struct.OrderedMap$OrderedMapEntries", "arc.struct.OrderedMap$OrderedMapKeys", "arc.struct.OrderedMap$OrderedMapValues", "arc.struct.OrderedSet", "arc.struct.OrderedSet$OrderedSetIterator", "arc.struct.PooledLinkedList", "arc.struct.PooledLinkedList$Item", "arc.struct.Queue", "arc.struct.Queue$QueueIterable", "arc.struct.ShortArray", "arc.struct.SnapshotArray", "arc.struct.Sort", "arc.struct.SortedIntList", "arc.struct.SortedIntList$Iterator", "arc.struct.SortedIntList$Node", "arc.struct.StringMap", "arc.struct.TimSort", "arc.util.I18NBundle", "arc.util.Interval", "arc.util.Time", "java.io.DataInput", "java.io.DataInputStream", "java.io.DataOutput", "java.io.DataOutputStream", "java.io.PrintStream", "java.lang.Boolean", "java.lang.Byte", "java.lang.Character", "java.lang.Double", "java.lang.Float", "java.lang.Integer", "java.lang.Long", "java.lang.Object", "java.lang.Runnable", "java.lang.Short", "java.lang.String", "java.lang.System", "mindustry.Vars", "mindustry.ai.BlockIndexer", "mindustry.ai.Pathfinder", "mindustry.ai.Pathfinder$PathData", "mindustry.ai.Pathfinder$PathTarget", "mindustry.ai.Pathfinder$PathTileStruct", "mindustry.ai.WaveSpawner", "mindustry.content.Blocks", "mindustry.content.Bullets", "mindustry.content.Fx", "mindustry.content.Items", "mindustry.content.Liquids", "mindustry.content.Loadouts", "mindustry.content.Mechs", "mindustry.content.StatusEffects", "mindustry.content.TechTree", "mindustry.content.TechTree$TechNode", "mindustry.content.TypeIDs", "mindustry.content.UnitTypes", "mindustry.content.Zones", "mindustry.core.ContentLoader", "mindustry.core.Control", "mindustry.core.FileTree", "mindustry.core.GameState", "mindustry.core.GameState$State", "mindustry.core.Logic", "mindustry.core.NetServer$TeamAssigner", "mindustry.core.Platform", "mindustry.core.Renderer", "mindustry.core.UI", "mindustry.core.Version", "mindustry.core.World", "mindustry.core.World$Raycaster", "mindustry.ctype.Content", "mindustry.ctype.Content$ModContentInfo", "mindustry.ctype.ContentList", "mindustry.ctype.ContentType", "mindustry.ctype.MappableContent", "mindustry.ctype.UnlockableContent", "mindustry.editor.DrawOperation", "mindustry.editor.DrawOperation$OpType", "mindustry.editor.DrawOperation$TileOpStruct", "mindustry.editor.EditorTile", "mindustry.editor.EditorTool", "mindustry.editor.MapEditor", "mindustry.editor.MapEditor$Context", "mindustry.editor.MapEditorDialog", "mindustry.editor.MapGenerateDialog", "mindustry.editor.MapInfoDialog", "mindustry.editor.MapLoadDialog", "mindustry.editor.MapRenderer", "mindustry.editor.MapResizeDialog", "mindustry.editor.MapSaveDialog", "mindustry.editor.MapView", "mindustry.editor.OperationStack", "mindustry.editor.WaveInfoDialog", "mindustry.entities.Damage", "mindustry.entities.Damage$PropCellStruct", "mindustry.entities.Effects", "mindustry.entities.Effects$Effect", "mindustry.entities.Effects$EffectContainer", "mindustry.entities.Effects$EffectProvider", "mindustry.entities.Effects$EffectRenderer", "mindustry.entities.Effects$ScreenshakeProvider", "mindustry.entities.Entities", "mindustry.entities.EntityCollisions", "mindustry.entities.EntityGroup", "mindustry.entities.Predict", "mindustry.entities.TargetPriority", "mindustry.entities.Units", "mindustry.entities.bullet.ArtilleryBulletType", "mindustry.entities.bullet.BasicBulletType", "mindustry.entities.bullet.BombBulletType", "mindustry.entities.bullet.BulletType", "mindustry.entities.bullet.FlakBulletType", "mindustry.entities.bullet.HealBulletType", "mindustry.entities.bullet.LiquidBulletType", "mindustry.entities.bullet.MassDriverBolt", "mindustry.entities.bullet.MissileBulletType", "mindustry.entities.effect.Decal", "mindustry.entities.effect.Fire", "mindustry.entities.effect.GroundEffectEntity", "mindustry.entities.effect.GroundEffectEntity$GroundEffect", "mindustry.entities.effect.ItemTransfer", "mindustry.entities.effect.Lightning", "mindustry.entities.effect.Puddle", "mindustry.entities.effect.RubbleDecal", "mindustry.entities.effect.ScorchDecal", "mindustry.entities.traits.AbsorbTrait", "mindustry.entities.traits.BelowLiquidTrait", "mindustry.entities.traits.BuilderMinerTrait", "mindustry.entities.traits.BuilderTrait", "mindustry.entities.traits.BuilderTrait$BuildDataStatic", "mindustry.entities.traits.BuilderTrait$BuildRequest", "mindustry.entities.traits.DamageTrait", "mindustry.entities.traits.DrawTrait", "mindustry.entities.traits.Entity", "mindustry.entities.traits.HealthTrait", "mindustry.entities.traits.KillerTrait", "mindustry.entities.traits.MinerTrait", "mindustry.entities.traits.MoveTrait", "mindustry.entities.traits.SaveTrait", "mindustry.entities.traits.Saveable", "mindustry.entities.traits.ScaleTrait", "mindustry.entities.traits.ShooterTrait", "mindustry.entities.traits.SolidTrait", "mindustry.entities.traits.SpawnerTrait", "mindustry.entities.traits.SyncTrait", "mindustry.entities.traits.TargetTrait", "mindustry.entities.traits.TeamTrait", "mindustry.entities.traits.TimeTrait", "mindustry.entities.traits.TypeTrait", "mindustry.entities.traits.VelocityTrait", "mindustry.entities.type.BaseEntity", "mindustry.entities.type.BaseUnit", "mindustry.entities.type.Bullet", "mindustry.entities.type.DestructibleEntity", "mindustry.entities.type.EffectEntity", "mindustry.entities.type.Player", "mindustry.entities.type.SolidEntity", "mindustry.entities.type.TileEntity", "mindustry.entities.type.TimedEntity", "mindustry.entities.type.Unit", "mindustry.entities.type.base.BaseDrone", "mindustry.entities.type.base.BuilderDrone", "mindustry.entities.type.base.FlyingUnit", "mindustry.entities.type.base.GroundUnit", "mindustry.entities.type.base.HoverUnit", "mindustry.entities.type.base.MinerDrone", "mindustry.entities.type.base.RepairDrone", "mindustry.entities.units.StateMachine", "mindustry.entities.units.Statuses", "mindustry.entities.units.Statuses$StatusEntry", "mindustry.entities.units.UnitCommand", "mindustry.entities.units.UnitDrops", "mindustry.entities.units.UnitState", "mindustry.game.DefaultWaves", "mindustry.game.Difficulty", "mindustry.game.EventType", "mindustry.game.EventType$BlockBuildBeginEvent", "mindustry.game.EventType$BlockBuildEndEvent", "mindustry.game.EventType$BlockDestroyEvent", "mindustry.game.EventType$BlockInfoEvent", "mindustry.game.EventType$BuildSelectEvent", "mindustry.game.EventType$ClientLoadEvent", "mindustry.game.EventType$CommandIssueEvent", "mindustry.game.EventType$ContentReloadEvent", "mindustry.game.EventType$CoreItemDeliverEvent", "mindustry.game.EventType$DepositEvent", "mindustry.game.EventType$DisposeEvent", "mindustry.game.EventType$GameOverEvent", "mindustry.game.EventType$LaunchEvent", "mindustry.game.EventType$LaunchItemEvent", "mindustry.game.EventType$LineConfirmEvent", "mindustry.game.EventType$LoseEvent", "mindustry.game.EventType$MapMakeEvent", "mindustry.game.EventType$MapPublishEvent", "mindustry.game.EventType$MechChangeEvent", "mindustry.game.EventType$PlayEvent", "mindustry.game.EventType$PlayerBanEvent", "mindustry.game.EventType$PlayerChatEvent", "mindustry.game.EventType$PlayerConnect", "mindustry.game.EventType$PlayerIpBanEvent", "mindustry.game.EventType$PlayerIpUnbanEvent", "mindustry.game.EventType$PlayerJoin", "mindustry.game.EventType$PlayerLeave", "mindustry.game.EventType$PlayerUnbanEvent", "mindustry.game.EventType$ResearchEvent", "mindustry.game.EventType$ResetEvent", "mindustry.game.EventType$ResizeEvent", "mindustry.game.EventType$ServerLoadEvent", "mindustry.game.EventType$StateChangeEvent", "mindustry.game.EventType$TapConfigEvent", "mindustry.game.EventType$TapEvent", "mindustry.game.EventType$TileChangeEvent", "mindustry.game.EventType$Trigger", "mindustry.game.EventType$TurretAmmoDeliverEvent", "mindustry.game.EventType$UnitCreateEvent", "mindustry.game.EventType$UnitDestroyEvent", "mindustry.game.EventType$UnlockEvent", "mindustry.game.EventType$WaveEvent", "mindustry.game.EventType$WinEvent", "mindustry.game.EventType$WithdrawEvent", "mindustry.game.EventType$WorldLoadEvent", "mindustry.game.EventType$ZoneConfigureCompleteEvent", "mindustry.game.EventType$ZoneRequireCompleteEvent", "mindustry.game.Gamemode", "mindustry.game.GlobalData", "mindustry.game.LoopControl", "mindustry.game.MusicControl", "mindustry.game.Objective", "mindustry.game.Objectives", "mindustry.game.Objectives$Launched", "mindustry.game.Objectives$Unlock", "mindustry.game.Objectives$Wave", "mindustry.game.Objectives$ZoneObjective", "mindustry.game.Objectives$ZoneWave", "mindustry.game.Rules", "mindustry.game.Saves", "mindustry.game.Saves$SaveSlot", "mindustry.game.Schematic", "mindustry.game.Schematic$Stile", "mindustry.game.Schematics", "mindustry.game.SoundLoop", "mindustry.game.SpawnGroup", "mindustry.game.Stats", "mindustry.game.Stats$Rank", "mindustry.game.Stats$RankResult", "mindustry.game.Team", "mindustry.game.Teams", "mindustry.game.Teams$BrokenBlock", "mindustry.game.Teams$TeamData", "mindustry.game.Tutorial", "mindustry.game.Tutorial$TutorialStage", "mindustry.gen.BufferItem", "mindustry.gen.Call", "mindustry.gen.Call", "mindustry.gen.Icon", "mindustry.gen.Icon", "mindustry.gen.MethodHash", "mindustry.gen.Musics", "mindustry.gen.Musics", "mindustry.gen.PathTile", "mindustry.gen.PropCell", "mindustry.gen.RemoteReadClient", "mindustry.gen.RemoteReadServer", "mindustry.gen.Serialization", "mindustry.gen.Sounds", "mindustry.gen.Sounds", "mindustry.gen.Tex", "mindustry.gen.Tex", "mindustry.gen.TileOp", "mindustry.graphics.BlockRenderer", "mindustry.graphics.Bloom", "mindustry.graphics.CacheLayer", "mindustry.graphics.Drawf", "mindustry.graphics.FloorRenderer", "mindustry.graphics.IndexedRenderer", "mindustry.graphics.Layer", "mindustry.graphics.LightRenderer", "mindustry.graphics.MenuRenderer", "mindustry.graphics.MinimapRenderer", "mindustry.graphics.MultiPacker", "mindustry.graphics.MultiPacker$PageType", "mindustry.graphics.OverlayRenderer", "mindustry.graphics.Pal", "mindustry.graphics.Pixelator", "mindustry.graphics.Shaders", "mindustry.input.Binding", "mindustry.input.DesktopInput", "mindustry.input.InputHandler", "mindustry.input.InputHandler$PlaceLine", "mindustry.input.MobileInput", "mindustry.input.PlaceMode", "mindustry.input.Placement", "mindustry.input.Placement$DistanceHeuristic", "mindustry.input.Placement$NormalizeDrawResult", "mindustry.input.Placement$NormalizeResult", "mindustry.input.Placement$TileHueristic", "mindustry.maps.Map", "mindustry.maps.Maps", "mindustry.maps.Maps$MapProvider", "mindustry.maps.Maps$ShuffleMode", "mindustry.maps.Maps$ShuffleMode", "mindustry.maps.filters.BlendFilter", "mindustry.maps.filters.ClearFilter", "mindustry.maps.filters.DistortFilter", "mindustry.maps.filters.FilterOption", "mindustry.maps.filters.FilterOption$BlockOption", "mindustry.maps.filters.FilterOption$SliderOption", "mindustry.maps.filters.GenerateFilter", "mindustry.maps.filters.GenerateFilter$GenerateInput", "mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "mindustry.maps.filters.MedianFilter", "mindustry.maps.filters.MirrorFilter", "mindustry.maps.filters.NoiseFilter", "mindustry.maps.filters.OreFilter", "mindustry.maps.filters.OreMedianFilter", "mindustry.maps.filters.RiverNoiseFilter", "mindustry.maps.filters.ScatterFilter", "mindustry.maps.filters.TerrainFilter", "mindustry.maps.generators.BasicGenerator", "mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "mindustry.maps.generators.BasicGenerator$TileHueristic", "mindustry.maps.generators.Generator", "mindustry.maps.generators.MapGenerator", "mindustry.maps.generators.MapGenerator$Decoration", "mindustry.maps.generators.RandomGenerator", "mindustry.maps.zonegen.DesertWastesGenerator", "mindustry.maps.zonegen.OvergrowthGenerator", "mindustry.type.Category", "mindustry.type.ErrorContent", "mindustry.type.Item", "mindustry.type.ItemStack", "mindustry.type.ItemType", "mindustry.type.Liquid", "mindustry.type.LiquidStack", "mindustry.type.Mech", "mindustry.type.Publishable", "mindustry.type.StatusEffect", "mindustry.type.StatusEffect$TransitionHandler", "mindustry.type.TypeID", "mindustry.type.UnitType", "mindustry.type.Weapon", "mindustry.type.WeatherEvent", "mindustry.type.Zone", "mindustry.ui.Bar", "mindustry.ui.BorderImage", "mindustry.ui.Cicon", "mindustry.ui.ContentDisplay", "mindustry.ui.Fonts", "mindustry.ui.GridImage", "mindustry.ui.IconSize", "mindustry.ui.IntFormat", "mindustry.ui.ItemDisplay", "mindustry.ui.ItemImage", "mindustry.ui.ItemsDisplay", "mindustry.ui.Links", "mindustry.ui.Links$LinkEntry", "mindustry.ui.LiquidDisplay", "mindustry.ui.Minimap", "mindustry.ui.MobileButton", "mindustry.ui.MultiReqImage", "mindustry.ui.ReqImage", "mindustry.ui.Styles", "mindustry.ui.dialogs.AboutDialog", "mindustry.ui.dialogs.AdminsDialog", "mindustry.ui.dialogs.BansDialog", "mindustry.ui.dialogs.ColorPicker", "mindustry.ui.dialogs.ContentInfoDialog", "mindustry.ui.dialogs.ControlsDialog", "mindustry.ui.dialogs.CustomGameDialog", "mindustry.ui.dialogs.CustomRulesDialog", "mindustry.ui.dialogs.DatabaseDialog", "mindustry.ui.dialogs.DeployDialog", "mindustry.ui.dialogs.DeployDialog$View", "mindustry.ui.dialogs.DeployDialog$ZoneNode", "mindustry.ui.dialogs.DiscordDialog", "mindustry.ui.dialogs.FileChooser", "mindustry.ui.dialogs.FileChooser$FileHistory", "mindustry.ui.dialogs.FloatingDialog", "mindustry.ui.dialogs.GameOverDialog", "mindustry.ui.dialogs.HostDialog", "mindustry.ui.dialogs.JoinDialog", "mindustry.ui.dialogs.JoinDialog$Server", "mindustry.ui.dialogs.LanguageDialog", "mindustry.ui.dialogs.LoadDialog", "mindustry.ui.dialogs.LoadoutDialog", "mindustry.ui.dialogs.MapPlayDialog", "mindustry.ui.dialogs.MapsDialog", "mindustry.ui.dialogs.MinimapDialog", "mindustry.ui.dialogs.ModsDialog", "mindustry.ui.dialogs.PaletteDialog", "mindustry.ui.dialogs.PausedDialog", "mindustry.ui.dialogs.SaveDialog", "mindustry.ui.dialogs.SchematicsDialog", "mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "mindustry.ui.dialogs.SettingsMenuDialog", "mindustry.ui.dialogs.TechTreeDialog", "mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "mindustry.ui.dialogs.TechTreeDialog$View", "mindustry.ui.dialogs.TraceDialog", "mindustry.ui.dialogs.ZoneInfoDialog", "mindustry.ui.fragments.BlockConfigFragment", "mindustry.ui.fragments.BlockInventoryFragment", "mindustry.ui.fragments.ChatFragment", "mindustry.ui.fragments.FadeInFragment", "mindustry.ui.fragments.Fragment", "mindustry.ui.fragments.HudFragment", "mindustry.ui.fragments.LoadingFragment", "mindustry.ui.fragments.MenuFragment", "mindustry.ui.fragments.MinimapFragment", "mindustry.ui.fragments.OverlayFragment", "mindustry.ui.fragments.PlacementFragment", "mindustry.ui.fragments.PlayerListFragment", "mindustry.ui.fragments.ScriptConsoleFragment", "mindustry.ui.layout.BranchTreeLayout", "mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "mindustry.ui.layout.BranchTreeLayout$TreeLocation", "mindustry.ui.layout.RadialTreeLayout", "mindustry.ui.layout.TreeLayout", "mindustry.ui.layout.TreeLayout$TreeNode", "mindustry.world.Block", "mindustry.world.BlockStorage", "mindustry.world.Build", "mindustry.world.CachedTile", "mindustry.world.DirectionalItemBuffer", "mindustry.world.DirectionalItemBuffer$BufferItemStruct", "mindustry.world.Edges", "mindustry.world.ItemBuffer", "mindustry.world.LegacyColorMapper", "mindustry.world.LegacyColorMapper$LegacyBlock", "mindustry.world.Pos", "mindustry.world.StaticTree", "mindustry.world.Tile", "mindustry.world.WorldContext", "mindustry.world.blocks.Attributes", "mindustry.world.blocks.Autotiler", "mindustry.world.blocks.Autotiler$AutotilerHolder", "mindustry.world.blocks.BlockPart", "mindustry.world.blocks.BuildBlock", "mindustry.world.blocks.BuildBlock$BuildEntity", "mindustry.world.blocks.DoubleOverlayFloor", "mindustry.world.blocks.Floor", "mindustry.world.blocks.ItemSelection", "mindustry.world.blocks.LiquidBlock", "mindustry.world.blocks.OreBlock", "mindustry.world.blocks.OverlayFloor", "mindustry.world.blocks.PowerBlock", "mindustry.world.blocks.RespawnBlock", "mindustry.world.blocks.Rock", "mindustry.world.blocks.StaticWall", "mindustry.world.blocks.TreeBlock", "mindustry.world.blocks.defense.DeflectorWall", "mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "mindustry.world.blocks.defense.Door", "mindustry.world.blocks.defense.Door$DoorEntity", "mindustry.world.blocks.defense.ForceProjector", "mindustry.world.blocks.defense.ForceProjector$ForceEntity", "mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "mindustry.world.blocks.defense.MendProjector", "mindustry.world.blocks.defense.MendProjector$MendEntity", "mindustry.world.blocks.defense.OverdriveProjector", "mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "mindustry.world.blocks.defense.ShockMine", "mindustry.world.blocks.defense.SurgeWall", "mindustry.world.blocks.defense.Wall", "mindustry.world.blocks.defense.turrets.ArtilleryTurret", "mindustry.world.blocks.defense.turrets.BurstTurret", "mindustry.world.blocks.defense.turrets.ChargeTurret", "mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "mindustry.world.blocks.defense.turrets.CooledTurret", "mindustry.world.blocks.defense.turrets.DoubleTurret", "mindustry.world.blocks.defense.turrets.ItemTurret", "mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "mindustry.world.blocks.defense.turrets.LaserTurret", "mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "mindustry.world.blocks.defense.turrets.LiquidTurret", "mindustry.world.blocks.defense.turrets.PowerTurret", "mindustry.world.blocks.defense.turrets.Turret", "mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "mindustry.world.blocks.distribution.ArmoredConveyor", "mindustry.world.blocks.distribution.BufferedItemBridge", "mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "mindustry.world.blocks.distribution.Conveyor", "mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "mindustry.world.blocks.distribution.Conveyor$ItemPos", "mindustry.world.blocks.distribution.ExtendingItemBridge", "mindustry.world.blocks.distribution.ItemBridge", "mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "mindustry.world.blocks.distribution.Junction", "mindustry.world.blocks.distribution.Junction$JunctionEntity", "mindustry.world.blocks.distribution.MassDriver", "mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "mindustry.world.blocks.distribution.MassDriver$DriverState", "mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "mindustry.world.blocks.distribution.OverflowGate", "mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "mindustry.world.blocks.distribution.Router", "mindustry.world.blocks.distribution.Router$RouterEntity", "mindustry.world.blocks.distribution.Sorter", "mindustry.world.blocks.distribution.Sorter$SorterEntity", "mindustry.world.blocks.liquid.ArmoredConduit", "mindustry.world.blocks.liquid.Conduit", "mindustry.world.blocks.liquid.Conduit$ConduitEntity", "mindustry.world.blocks.liquid.LiquidBridge", "mindustry.world.blocks.liquid.LiquidExtendingBridge", "mindustry.world.blocks.liquid.LiquidJunction", "mindustry.world.blocks.liquid.LiquidOverflowGate", "mindustry.world.blocks.liquid.LiquidRouter", "mindustry.world.blocks.liquid.LiquidTank", "mindustry.world.blocks.logic.LogicBlock", "mindustry.world.blocks.logic.MessageBlock", "mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "mindustry.world.blocks.power.Battery", "mindustry.world.blocks.power.BurnerGenerator", "mindustry.world.blocks.power.ConditionalConsumePower", "mindustry.world.blocks.power.DecayGenerator", "mindustry.world.blocks.power.ImpactReactor", "mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "mindustry.world.blocks.power.ItemLiquidGenerator", "mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "mindustry.world.blocks.power.LightBlock", "mindustry.world.blocks.power.LightBlock$LightEntity", "mindustry.world.blocks.power.NuclearReactor", "mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "mindustry.world.blocks.power.PowerDiode", "mindustry.world.blocks.power.PowerDistributor", "mindustry.world.blocks.power.PowerGenerator", "mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "mindustry.world.blocks.power.PowerGraph", "mindustry.world.blocks.power.PowerNode", "mindustry.world.blocks.power.SingleTypeGenerator", "mindustry.world.blocks.power.SolarGenerator", "mindustry.world.blocks.power.ThermalGenerator", "mindustry.world.blocks.production.Cultivator", "mindustry.world.blocks.production.Cultivator$CultivatorEntity", "mindustry.world.blocks.production.Drill", "mindustry.world.blocks.production.Drill$DrillEntity", "mindustry.world.blocks.production.Fracker", "mindustry.world.blocks.production.Fracker$FrackerEntity", "mindustry.world.blocks.production.GenericCrafter", "mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "mindustry.world.blocks.production.GenericSmelter", "mindustry.world.blocks.production.Incinerator", "mindustry.world.blocks.production.Incinerator$IncineratorEntity", "mindustry.world.blocks.production.LiquidConverter", "mindustry.world.blocks.production.Pump", "mindustry.world.blocks.production.Separator", "mindustry.world.blocks.production.SolidPump", "mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "mindustry.world.blocks.sandbox.ItemSource", "mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "mindustry.world.blocks.sandbox.ItemVoid", "mindustry.world.blocks.sandbox.LiquidSource", "mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "mindustry.world.blocks.sandbox.PowerSource", "mindustry.world.blocks.sandbox.PowerVoid", "mindustry.world.blocks.storage.CoreBlock", "mindustry.world.blocks.storage.CoreBlock$CoreEntity", "mindustry.world.blocks.storage.LaunchPad", "mindustry.world.blocks.storage.StorageBlock", "mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "mindustry.world.blocks.storage.Unloader", "mindustry.world.blocks.storage.Unloader$UnloaderEntity", "mindustry.world.blocks.storage.Vault", "mindustry.world.blocks.units.CommandCenter", "mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "mindustry.world.blocks.units.MechPad", "mindustry.world.blocks.units.MechPad$MechFactoryEntity", "mindustry.world.blocks.units.RallyPoint", "mindustry.world.blocks.units.RepairPoint", "mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "mindustry.world.blocks.units.UnitFactory", "mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "mindustry.world.consumers.Consume", "mindustry.world.consumers.ConsumeItemFilter", "mindustry.world.consumers.ConsumeItems", "mindustry.world.consumers.ConsumeLiquid", "mindustry.world.consumers.ConsumeLiquidBase", "mindustry.world.consumers.ConsumeLiquidFilter", "mindustry.world.consumers.ConsumePower", "mindustry.world.consumers.ConsumeType", "mindustry.world.consumers.Consumers", "mindustry.world.meta.Attribute", "mindustry.world.meta.BlockBars", "mindustry.world.meta.BlockFlag", "mindustry.world.meta.BlockGroup", "mindustry.world.meta.BlockStat", "mindustry.world.meta.BlockStats", "mindustry.world.meta.BuildVisibility", "mindustry.world.meta.PowerType", "mindustry.world.meta.Producers", "mindustry.world.meta.StatCategory", "mindustry.world.meta.StatUnit", "mindustry.world.meta.StatValue", "mindustry.world.meta.values.AmmoListValue", "mindustry.world.meta.values.BooleanValue", "mindustry.world.meta.values.BoosterListValue", "mindustry.world.meta.values.ItemFilterValue", "mindustry.world.meta.values.ItemListValue", "mindustry.world.meta.values.LiquidFilterValue", "mindustry.world.meta.values.LiquidValue", "mindustry.world.meta.values.NumberValue", "mindustry.world.meta.values.StringValue", "mindustry.world.modules.BlockModule", "mindustry.world.modules.ConsumeModule", "mindustry.world.modules.ItemModule", "mindustry.world.modules.ItemModule$ItemCalculator", "mindustry.world.modules.ItemModule$ItemConsumer", "mindustry.world.modules.LiquidModule", "mindustry.world.modules.LiquidModule$LiquidCalculator", "mindustry.world.modules.LiquidModule$LiquidConsumer", "mindustry.world.modules.PowerModule", "mindustry.world.producers.Produce", "mindustry.world.producers.ProduceItem"); +} \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java similarity index 90% rename from core/src/io/anuke/mindustry/mod/ContentParser.java rename to core/src/mindustry/mod/ContentParser.java index 826fada015..aa6048d833 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -1,34 +1,34 @@ -package io.anuke.mindustry.mod; +package mindustry.mod; -import io.anuke.arc.*; -import io.anuke.arc.assets.*; -import io.anuke.arc.audio.*; -import io.anuke.arc.audio.mock.*; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.arc.util.serialization.Json.*; -import io.anuke.arc.util.serialization.Jval.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.content.TechTree.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Objectives.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.assets.*; +import arc.audio.*; +import arc.audio.mock.*; +import arc.struct.Array; +import arc.struct.*; +import arc.files.*; +import arc.func.*; +import arc.graphics.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import arc.util.serialization.*; +import arc.util.serialization.Json.*; +import arc.util.serialization.Jval.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.content.TechTree.*; +import mindustry.ctype.*; +import mindustry.entities.Effects.*; +import mindustry.entities.bullet.*; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.game.Objectives.*; +import mindustry.gen.*; +import mindustry.mod.Mods.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; import java.lang.reflect.*; @@ -51,7 +51,6 @@ public class ContentParser{ ); private ObjectMap, FieldParser> classParsers = new ObjectMap, FieldParser>(){{ put(Effect.class, (type, data) -> field(Fx.class, data)); - put(StatusEffect.class, (type, data) -> field(StatusEffects.class, data)); put(Schematic.class, (type, data) -> { Object result = fieldOpt(Loadouts.class, data); if(result != null){ @@ -79,7 +78,7 @@ public class ContentParser{ if(data.isString()){ return field(Bullets.class, data); } - Class bc = data.has("type") ? resolve(data.getString("type"), "io.anuke.mindustry.entities.bullet") : BasicBulletType.class; + Class bc = data.has("type") ? resolve(data.getString("type"), "mindustry.entities.bullet") : BasicBulletType.class; data.remove("type"); BulletType result = make(bc); readFields(result, data); @@ -98,7 +97,7 @@ public class ContentParser{ return sound; }); put(Objective.class, (type, data) -> { - Class oc = data.has("type") ? resolve(data.getString("type"), "io.anuke.mindustry.game.Objectives") : ZoneWave.class; + Class oc = data.has("type") ? resolve(data.getString("type"), "mindustry.game.Objectives") : ZoneWave.class; data.remove("type"); Objective obj = make(oc); readFields(obj, data); @@ -188,18 +187,18 @@ public class ContentParser{ try{ type = resolve(getType(value), - "io.anuke.mindustry.world", - "io.anuke.mindustry.world.blocks", - "io.anuke.mindustry.world.blocks.defense", - "io.anuke.mindustry.world.blocks.defense.turrets", - "io.anuke.mindustry.world.blocks.distribution", - "io.anuke.mindustry.world.blocks.liquid", - "io.anuke.mindustry.world.blocks.logic", - "io.anuke.mindustry.world.blocks.power", - "io.anuke.mindustry.world.blocks.production", - "io.anuke.mindustry.world.blocks.sandbox", - "io.anuke.mindustry.world.blocks.storage", - "io.anuke.mindustry.world.blocks.units" + "mindustry.world", + "mindustry.world.blocks", + "mindustry.world.blocks.defense", + "mindustry.world.blocks.defense.turrets", + "mindustry.world.blocks.distribution", + "mindustry.world.blocks.liquid", + "mindustry.world.blocks.logic", + "mindustry.world.blocks.power", + "mindustry.world.blocks.production", + "mindustry.world.blocks.sandbox", + "mindustry.world.blocks.storage", + "mindustry.world.blocks.units" ); }catch(IllegalArgumentException e){ type = Block.class; @@ -281,7 +280,7 @@ public class ContentParser{ UnitType unit; if(locate(ContentType.unit, name) == null){ - Class type = resolve(legacyUnitMap.get(Strings.capitalize(getType(value)), getType(value)), "io.anuke.mindustry.entities.type.base"); + Class type = resolve(legacyUnitMap.get(Strings.capitalize(getType(value)), getType(value)), "mindustry.entities.type.base"); unit = new UnitType(mod + "-" + name, supply(type)); }else{ unit = locate(ContentType.unit, name); @@ -334,8 +333,8 @@ public class ContentParser{ } private void readBundle(ContentType type, String name, JsonValue value){ - UnlockableContent cont = Vars.content.getByName(type, name) instanceof UnlockableContent ? - Vars.content.getByName(type, name) : null; + UnlockableContent cont = locate(type, name) instanceof UnlockableContent ? + locate(type, name) : null; String entryName = cont == null ? type + "." + currentMod.name + "-" + name + "." : type + "." + cont.name + "."; I18NBundle bundle = Core.bundle; @@ -461,7 +460,7 @@ public class ContentParser{ builder.append("[accent][[").append(e.getClass().getSimpleName().replace("Exception", "")) .append("][] ") .append(e.getMessage() != null ? - e.getMessage().replace("io.anuke.mindustry.", "").replace("io.anuke.arc.", "") : "").append("\n"); + e.getMessage().replace("mindustry.", "").replace("arc.", "") : "").append("\n"); } } return builder.toString(); diff --git a/core/src/io/anuke/mindustry/mod/Mod.java b/core/src/mindustry/mod/Mod.java similarity index 84% rename from core/src/io/anuke/mindustry/mod/Mod.java rename to core/src/mindustry/mod/Mod.java index 5bab31b341..5b4c31b7a0 100644 --- a/core/src/io/anuke/mindustry/mod/Mod.java +++ b/core/src/mindustry/mod/Mod.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.mod; +package mindustry.mod; -import io.anuke.arc.files.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; +import arc.files.*; +import arc.util.*; +import mindustry.*; public class Mod{ /** @return the config file for this plugin, as the file 'mods/[plugin-name]/config.json'.*/ diff --git a/core/src/mindustry/mod/ModListing.java b/core/src/mindustry/mod/ModListing.java new file mode 100644 index 0000000000..d0c1d80094 --- /dev/null +++ b/core/src/mindustry/mod/ModListing.java @@ -0,0 +1,19 @@ +package mindustry.mod; + +/** Mod listing as a data class. */ +public class ModListing{ + public String repo, name, author, lastUpdated, description; + public int stars; + + @Override + public String toString(){ + return "ModListing{" + + "repo='" + repo + '\'' + + ", name='" + name + '\'' + + ", author='" + author + '\'' + + ", lastUpdated='" + lastUpdated + '\'' + + ", description='" + description + '\'' + + ", stars=" + stars + + '}'; + } +} diff --git a/core/src/io/anuke/mindustry/mod/ModLoadingSound.java b/core/src/mindustry/mod/ModLoadingSound.java similarity index 93% rename from core/src/io/anuke/mindustry/mod/ModLoadingSound.java rename to core/src/mindustry/mod/ModLoadingSound.java index 43d30f4617..558b29ce28 100644 --- a/core/src/io/anuke/mindustry/mod/ModLoadingSound.java +++ b/core/src/mindustry/mod/ModLoadingSound.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.mod; +package mindustry.mod; -import io.anuke.arc.audio.*; -import io.anuke.arc.audio.mock.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.ArcAnnotate.*; +import arc.audio.*; +import arc.audio.mock.*; +import arc.math.geom.*; +import arc.util.ArcAnnotate.*; public class ModLoadingSound implements Sound{ public @NonNull Sound sound = new MockSound(); diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java similarity index 93% rename from core/src/io/anuke/mindustry/mod/Mods.java rename to core/src/mindustry/mod/Mods.java index 26a7b51955..ef4af6a8ec 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -1,35 +1,34 @@ -package io.anuke.mindustry.mod; +package mindustry.mod; -import io.anuke.arc.*; -import io.anuke.arc.assets.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Texture.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.g2d.TextureAtlas.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.io.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.arc.util.serialization.Jval.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.graphics.MultiPacker.*; -import io.anuke.mindustry.plugin.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.assets.*; +import arc.files.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.Texture.*; +import arc.graphics.g2d.*; +import arc.graphics.g2d.TextureAtlas.*; +import arc.scene.ui.*; +import arc.struct.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import arc.util.io.*; +import arc.util.serialization.*; +import arc.util.serialization.Jval.*; +import mindustry.core.*; +import mindustry.ctype.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.graphics.MultiPacker.*; +import mindustry.plugin.*; +import mindustry.type.*; +import mindustry.ui.*; import java.io.*; import java.net.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Mods implements Loadable{ private Json json = new Json(); @@ -86,6 +85,7 @@ public class Mods implements Loadable{ try{ mods.add(loadMod(dest)); requiresReload = true; + sortMods(); }catch(IOException e){ dest.delete(); throw e; @@ -143,6 +143,17 @@ public class Mods implements Loadable{ @Override public void loadSync(){ + for(LoadedMod mod : mods){ + //try to load icon for each mod that can have one + if(mod.root.child("icon.png").exists()){ + try{ + mod.iconTexture = new Texture(mod.root.child("icon.png")); + }catch(Throwable t){ + Log.err("Failed to load icon for mod '" + mod.name + "'.", t); + } + } + } + if(packer == null) return; Time.mark(); @@ -409,7 +420,9 @@ public class Mods implements Loadable{ //TODO make it less epic Core.atlas = new TextureAtlas(Core.files.internal("sprites/sprites.atlas")); + mods.each(LoadedMod::dispose); mods.clear(); + Core.bundle = I18NBundle.createBundle(Core.files.internal("bundles/bundle"), Core.bundle.getLocale()); load(); Sounds.dispose(); Sounds.load(); @@ -499,10 +512,8 @@ public class Mods implements Loadable{ for(ContentType type : ContentType.all){ Fi folder = contentRoot.child(type.name().toLowerCase() + "s"); if(folder.exists()){ - for(Fi file : folder.list()){ - if(file.extension().equals("json") || file.extension().equals("hjson")){ - runs.add(new LoadRun(type, file, mod)); - } + for(Fi file : folder.findAll(f -> f.extension().equals("json") || f.extension().equals("hjson"))){ + runs.add(new LoadRun(type, file, mod)); } } } @@ -643,7 +654,7 @@ public class Mods implements Loadable{ } /** Represents a plugin that has been loaded from a jar file.*/ - public static class LoadedMod implements Publishable{ + public static class LoadedMod implements Publishable, Disposable{ /** The location of this mod's zip file/folder on the disk. */ public final Fi file; /** The root zip file; points to the contents of this mod. In the case of folders, this is the same as the mod's file. */ @@ -664,6 +675,8 @@ public class Mods implements Loadable{ public ObjectSet erroredContent = new ObjectSet<>(); /** Current state of this mod. */ public ModState state = ModState.enabled; + /** Icon texture. Should be disposed. */ + public @Nullable Texture iconTexture; public LoadedMod(Fi file, Fi root, Mod main, ModMeta meta){ this.root = root; @@ -701,6 +714,13 @@ public class Mods implements Loadable{ return Version.build >= Strings.parseInt(meta.minGameVersion, 0); } + @Override + public void dispose(){ + if(iconTexture != null){ + iconTexture.dispose(); + } + } + @Override public String getSteamID(){ return Core.settings.getString(name + "-steamid", null); diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java similarity index 87% rename from core/src/io/anuke/mindustry/mod/Scripts.java rename to core/src/mindustry/mod/Scripts.java index d53673f4bf..5ac96fbb0a 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.mod; +package mindustry.mod; -import io.anuke.arc.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.Log.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.mod.Mods.*; +import arc.*; +import arc.files.*; +import arc.util.*; +import arc.util.Log.*; +import mindustry.*; +import mindustry.mod.Mods.*; import org.mozilla.javascript.*; public class Scripts implements Disposable{ @@ -20,8 +20,9 @@ public class Scripts implements Disposable{ context = Vars.platform.getScriptContext(); context.setClassShutter(type -> (ClassAccess.allowedClassNames.contains(type) || type.startsWith("$Proxy") || type.startsWith("adapter") || type.contains("PrintStream") || - type.startsWith("io.anuke.mindustry")) && !type.equals("io.anuke.mindustry.mod.ClassAccess")); - + type.startsWith("mindustry")) && !type.equals("mindustry.mod.ClassAccess")); + context.getWrapFactory().setJavaPrimitiveWrap(false); + scope = new ImporterTopLevel(context); wrapper = Core.files.internal("scripts/wrapper.js").readString(); diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java new file mode 100644 index 0000000000..aa36705c39 --- /dev/null +++ b/core/src/mindustry/net/Administration.java @@ -0,0 +1,560 @@ +package mindustry.net; + +import arc.*; +import arc.func.*; +import arc.struct.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import arc.util.pooling.*; +import arc.util.pooling.Pool.*; +import mindustry.*; +import mindustry.annotations.Annotations.*; +import mindustry.entities.type.*; +import mindustry.type.*; +import mindustry.world.*; + +import static mindustry.Vars.headless; +import static mindustry.game.EventType.*; + +public class Administration{ + /** All player info. Maps UUIDs to info. This persists throughout restarts. */ + private ObjectMap playerInfo = new ObjectMap<>(); + private Array bannedIPs = new Array<>(); + private Array whitelist = new Array<>(); + private Array chatFilters = new Array<>(); + private Array actionFilters = new Array<>(); + private Array subnetBans = new Array<>(); + + public Administration(){ + load(); + + //anti-spam + addChatFilter((player, message) -> { + long resetTime = Config.messageRateLimit.num() * 1000; + if(Config.antiSpam.bool() && !player.isLocal && !player.isAdmin){ + //prevent people from spamming messages quickly + if(resetTime > 0 && Time.timeSinceMillis(player.getInfo().lastMessageTime) < resetTime){ + //supress message + player.sendMessage("[scarlet]You may only send messages every " + Config.messageRateLimit.num() + " seconds."); + player.getInfo().messageInfractions ++; + //kick player for spamming and prevent connection if they've done this several times + if(player.getInfo().messageInfractions >= Config.messageSpamKick.num() && Config.messageSpamKick.num() != 0){ + player.con.kick("You have been kicked for spamming.", 1000 * 60 * 2); + } + player.getInfo().lastSentMessage = message; + return null; + }else{ + player.getInfo().messageInfractions = 0; + } + + //prevent players from sending the same message twice in the span of 50 seconds + if(message.equals(player.getInfo().lastSentMessage) && Time.timeSinceMillis(player.getInfo().lastMessageTime) < 1000 * 50){ + player.sendMessage("[scarlet]You may not send the same message twice."); + return null; + } + + player.getInfo().lastSentMessage = message; + player.getInfo().lastMessageTime = Time.millis(); + } + + return message; + }); + } + + public Array getSubnetBans(){ + return subnetBans; + } + + public void removeSubnetBan(String ip){ + subnetBans.remove(ip); + save(); + } + + public void addSubnetBan(String ip){ + subnetBans.add(ip); + save(); + } + + public boolean isSubnetBanned(String ip){ + return subnetBans.contains(ip::startsWith); + } + + /** Adds a chat filter. This will transform the chat messages of every player. + * This functionality can be used to implement things like swear filters and special commands. + * Note that commands (starting with /) are not filtered.*/ + public void addChatFilter(ChatFilter filter){ + chatFilters.add(filter); + } + + /** Filters out a chat message. */ + public @Nullable String filterMessage(Player player, String message){ + String current = message; + for(ChatFilter f : chatFilters){ + current = f.filter(player, message); + if(current == null) return null; + } + return current; + } + + /** Add a filter to actions, preventing things such as breaking or configuring blocks. */ + public void addActionFilter(ActionFilter filter){ + actionFilters.add(filter); + } + + /** @return whether this action is allowed by the action filters. */ + public boolean allowAction(Player player, ActionType type, Tile tile, Cons setter){ + PlayerAction act = Pools.obtain(PlayerAction.class, PlayerAction::new); + setter.get(act.set(player, type, tile)); + for(ActionFilter filter : actionFilters){ + if(!filter.allow(act)){ + Pools.free(act); + return false; + } + } + Pools.free(act); + return true; + } + + public int getPlayerLimit(){ + return Core.settings.getInt("playerlimit", 0); + } + + public void setPlayerLimit(int limit){ + Core.settings.putSave("playerlimit", limit); + } + + public boolean getStrict(){ + return Config.strict.bool(); + } + + public boolean allowsCustomClients(){ + return Config.allowCustomClients.bool(); + } + + /** Call when a player joins to update their information here. */ + public void updatePlayerJoined(String id, String ip, String name){ + PlayerInfo info = getCreateInfo(id); + info.lastName = name; + info.lastIP = ip; + info.timesJoined++; + if(!info.names.contains(name, false)) info.names.add(name); + if(!info.ips.contains(ip, false)) info.ips.add(ip); + } + + public boolean banPlayer(String uuid){ + return banPlayerID(uuid) || banPlayerIP(getInfo(uuid).lastIP); + } + + /** + * Bans a player by IP; returns whether this player was already banned. + * If there are players who at any point had this IP, they will be UUID banned as well. + */ + public boolean banPlayerIP(String ip){ + if(bannedIPs.contains(ip, false)) + return false; + + for(PlayerInfo info : playerInfo.values()){ + if(info.ips.contains(ip, false)){ + info.banned = true; + } + } + + bannedIPs.add(ip); + save(); + Events.fire(new PlayerIpBanEvent(ip)); + return true; + } + + /** Bans a player by UUID; returns whether this player was already banned. */ + public boolean banPlayerID(String id){ + if(playerInfo.containsKey(id) && playerInfo.get(id).banned) + return false; + + getCreateInfo(id).banned = true; + + save(); + Events.fire(new PlayerBanEvent(Vars.playerGroup.find(p -> id.equals(p.uuid)))); + return true; + } + + /** + * Unbans a player by IP; returns whether this player was banned in the first place. + * This method also unbans any player that was banned and had this IP. + */ + public boolean unbanPlayerIP(String ip){ + boolean found = bannedIPs.contains(ip, false); + + for(PlayerInfo info : playerInfo.values()){ + if(info.ips.contains(ip, false)){ + info.banned = false; + found = true; + } + } + + bannedIPs.removeValue(ip, false); + + if(found){ + save(); + Events.fire(new PlayerIpUnbanEvent(ip)); + } + return found; + } + + /** + * Unbans a player by ID; returns whether this player was banned in the first place. + * This also unbans all IPs the player used. + */ + public boolean unbanPlayerID(String id){ + PlayerInfo info = getCreateInfo(id); + + if(!info.banned) + return false; + + info.banned = false; + bannedIPs.removeAll(info.ips, false); + save(); + Events.fire(new PlayerUnbanEvent(Vars.playerGroup.find(p -> id.equals(p.uuid)))); + return true; + } + + /** + * Returns list of all players with admin status + */ + public Array getAdmins(){ + Array result = new Array<>(); + for(PlayerInfo info : playerInfo.values()){ + if(info.admin){ + result.add(info); + } + } + return result; + } + + /** + * Returns list of all players with admin status + */ + public Array getBanned(){ + Array result = new Array<>(); + for(PlayerInfo info : playerInfo.values()){ + if(info.banned){ + result.add(info); + } + } + return result; + } + + /** + * Returns all banned IPs. This does not include the IPs of ID-banned players. + */ + public Array getBannedIPs(){ + return bannedIPs; + } + + /** + * Makes a player an admin. Returns whether this player was already an admin. + */ + public boolean adminPlayer(String id, String usid){ + PlayerInfo info = getCreateInfo(id); + + if(info.admin && info.adminUsid != null && info.adminUsid.equals(usid)) + return false; + + info.adminUsid = usid; + info.admin = true; + save(); + + return true; + } + + /** + * Makes a player no longer an admin. Returns whether this player was an admin in the first place. + */ + public boolean unAdminPlayer(String id){ + PlayerInfo info = getCreateInfo(id); + + if(!info.admin) + return false; + + info.admin = false; + save(); + + return true; + } + + public boolean isWhitelistEnabled(){ + return Config.whitelist.bool(); + } + + public boolean isWhitelisted(String id, String usid){ + return !isWhitelistEnabled() || whitelist.contains(usid + id); + } + + public boolean whitelist(String id){ + PlayerInfo info = getCreateInfo(id); + if(whitelist.contains(info.adminUsid + id)) return false; + whitelist.add(info.adminUsid + id); + save(); + return true; + } + + public boolean unwhitelist(String id){ + PlayerInfo info = getCreateInfo(id); + if(whitelist.contains(info.adminUsid + id)){ + whitelist.remove(info.adminUsid + id); + save(); + return true; + } + return false; + } + + public boolean isIPBanned(String ip){ + return bannedIPs.contains(ip, false) || (findByIP(ip) != null && findByIP(ip).banned); + } + + public boolean isIDBanned(String uuid){ + return getCreateInfo(uuid).banned; + } + + public boolean isAdmin(String id, String usid){ + PlayerInfo info = getCreateInfo(id); + return info.admin && usid.equals(info.adminUsid); + } + + /** Finds player info by IP, UUID and name. */ + public ObjectSet findByName(String name){ + ObjectSet result = new ObjectSet<>(); + + for(PlayerInfo info : playerInfo.values()){ + if(info.lastName.toLowerCase().equals(name.toLowerCase()) || (info.names.contains(name, false)) + || info.ips.contains(name, false) || info.id.equals(name)){ + result.add(info); + } + } + + return result; + } + + public Array findByIPs(String ip){ + Array result = new Array<>(); + + for(PlayerInfo info : playerInfo.values()){ + if(info.ips.contains(ip, false)){ + result.add(info); + } + } + + return result; + } + + public PlayerInfo getInfo(String id){ + return getCreateInfo(id); + } + + public PlayerInfo getInfoOptional(String id){ + return playerInfo.get(id); + } + + public PlayerInfo findByIP(String ip){ + for(PlayerInfo info : playerInfo.values()){ + if(info.ips.contains(ip, false)){ + return info; + } + } + return null; + } + + public Array getWhitelisted(){ + return playerInfo.values().toArray().select(p -> isWhitelisted(p.id, p.adminUsid)); + } + + private PlayerInfo getCreateInfo(String id){ + if(playerInfo.containsKey(id)){ + return playerInfo.get(id); + }else{ + PlayerInfo info = new PlayerInfo(id); + playerInfo.put(id, info); + save(); + return info; + } + } + + public void save(){ + Core.settings.putObject("player-info", playerInfo); + Core.settings.putObject("banned-ips", bannedIPs); + Core.settings.putObject("whitelisted", whitelist); + Core.settings.putObject("subnet-bans", subnetBans); + Core.settings.save(); + } + + @SuppressWarnings("unchecked") + private void load(){ + playerInfo = Core.settings.getObject("player-info", ObjectMap.class, ObjectMap::new); + bannedIPs = Core.settings.getObject("banned-ips", Array.class, Array::new); + whitelist = Core.settings.getObject("whitelisted", Array.class, Array::new); + subnetBans = Core.settings.getObject("subnet-bans", Array.class, Array::new); + } + + /** Server configuration definition. Each config value can be a string, boolean or number. */ + public enum Config{ + name("The server name as displayed on clients.", "Server", "servername"), + port("The port to host on.", Vars.port), + autoUpdate("Whether to auto-update and exit when a new bleeding-edge update arrives.", false), + showConnectMessages("Whether to display connect/disconnect messages.", true), + enableVotekick("Whether votekick is enabled.", true), + startCommands("Commands run at startup. This should be a comma-separated list.", ""), + crashReport("Whether to send crash reports.", false, "crashreport"), + logging("Whether to log everything to files.", true), + strict("Whether strict mode is on - corrects positions and prevents duplicate UUIDs.", true), + antiSpam("Whether spammers are automatically kicked and rate-limited.", true), + messageRateLimit("Message rate limit in seconds. 0 to disable.", 0), + messageSpamKick("How many times a player must send a message before the cooldown to get kicked. 0 to disable.", 3), + socketInput("Allows a local application to control this server through a local TCP socket.", false, "socket", () -> Events.fire(Trigger.socketConfigChanged)), + socketInputPort("The port for socket input.", 6859, () -> Events.fire(Trigger.socketConfigChanged)), + socketInputAddress("The bind address for socket input.", "localhost", () -> Events.fire(Trigger.socketConfigChanged)), + allowCustomClients("Whether custom clients are allowed to connect.", !headless, "allow-custom"), + whitelist("Whether the whitelist is used.", false), + motd("The message displayed to people on connection.", "off"); + + public static final Config[] all = values(); + + public final Object defaultValue; + public final String key, description; + final Runnable changed; + + Config(String description, Object def){ + this(description, def, null, null); + } + + Config(String description, Object def, String key){ + this(description, def, key, null); + } + + Config(String description, Object def, Runnable changed){ + this(description, def, null, changed); + } + + Config(String description, Object def, String key, Runnable changed){ + this.description = description; + this.key = key == null ? name() : key; + this.defaultValue = def; + this.changed = changed == null ? () -> {} : changed; + } + + public boolean isNum(){ + return defaultValue instanceof Integer; + } + + public boolean isBool(){ + return defaultValue instanceof Boolean; + } + + public boolean isString(){ + return defaultValue instanceof String; + } + + public Object get(){ + return Core.settings.get(key, defaultValue); + } + + public boolean bool(){ + return Core.settings.getBool(key, (Boolean)defaultValue); + } + + public int num(){ + return Core.settings.getInt(key, (Integer)defaultValue); + } + + public String string(){ + return Core.settings.getString(key, (String)defaultValue); + } + + public void set(Object value){ + Core.settings.putSave(key, value); + changed.run(); + } + } + + @Serialize + public static class PlayerInfo{ + public String id; + public String lastName = "", lastIP = ""; + public Array ips = new Array<>(); + public Array names = new Array<>(); + public String adminUsid; + public int timesKicked; + public int timesJoined; + public boolean banned, admin; + public long lastKicked; //last kicked time to expiration + + public transient long lastMessageTime, lastSyncTime; + public transient String lastSentMessage; + public transient int messageInfractions; + + PlayerInfo(String id){ + this.id = id; + } + + public PlayerInfo(){ + } + } + + /** Handles chat messages from players and changes their contents. */ + public interface ChatFilter{ + /** @return the filtered message; a null string signals that the message should not be sent. */ + @Nullable String filter(Player player, String message); + } + + /** Allows or disallows player actions. */ + public interface ActionFilter{ + /** @return whether this action should be permitted. if applicable, make sure to send this player a message specify why the action was prohibited. */ + boolean allow(PlayerAction action); + } + + public static class TraceInfo{ + public String ip, uuid; + public boolean modded, mobile; + + public TraceInfo(String ip, String uuid, boolean modded, boolean mobile){ + this.ip = ip; + this.uuid = uuid; + this.modded = modded; + this.mobile = mobile; + } + } + + /** Defines a (potentially dangerous) action that a player has done in the world. + * These objects are pooled; do not cache them! */ + public static class PlayerAction implements Poolable{ + public @NonNull Player player; + public @NonNull ActionType type; + public @NonNull Tile tile; + + /** valid for configure and rotation-type events only. */ + public int config; + + /** valid for item-type events only. */ + public @Nullable Item item; + public int itemAmount; + + public PlayerAction set(Player player, ActionType type, Tile tile){ + this.player = player; + this.type = type; + this.tile = tile; + return this; + } + + @Override + public void reset(){ + item = null; + itemAmount = config = 0; + player = null; + type = null; + tile = null; + } + } + + public enum ActionType{ + breakBlock, placeBlock, rotate, configure, withdrawItem, depositItem + } + +} diff --git a/core/src/io/anuke/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java similarity index 97% rename from core/src/io/anuke/mindustry/net/ArcNetProvider.java rename to core/src/mindustry/net/ArcNetProvider.java index 600b80da9a..19ce42e48e 100644 --- a/core/src/io/anuke/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.net.*; -import io.anuke.arc.net.FrameworkMessage.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.async.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.net.Net.*; -import io.anuke.mindustry.net.Packets.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.net.*; +import arc.net.FrameworkMessage.*; +import arc.util.*; +import arc.util.async.*; +import arc.util.pooling.*; +import mindustry.net.Net.*; +import mindustry.net.Packets.*; import java.io.*; import java.net.*; @@ -17,7 +17,7 @@ import java.nio.*; import java.nio.channels.*; import java.util.concurrent.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ArcNetProvider implements NetProvider{ final Client client; diff --git a/core/src/mindustry/net/BeControl.java b/core/src/mindustry/net/BeControl.java new file mode 100644 index 0000000000..ee084f743a --- /dev/null +++ b/core/src/mindustry/net/BeControl.java @@ -0,0 +1,173 @@ +package mindustry.net; + +import arc.*; +import arc.Net.*; +import arc.files.*; +import arc.func.*; +import arc.util.*; +import arc.util.async.*; +import arc.util.serialization.*; +import mindustry.core.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.net.Administration.*; +import mindustry.net.Packets.*; +import mindustry.ui.*; +import mindustry.ui.dialogs.*; + +import java.io.*; +import java.net.*; + +import static mindustry.Vars.*; + +/** Handles control of bleeding edge builds. */ +public class BeControl{ + private static final int updateInterval = 60 * 2; + + private AsyncExecutor executor = new AsyncExecutor(1); + private boolean checkUpdates = true; + private boolean updateAvailable; + private String updateUrl; + private int updateBuild; + + /** @return whether this is a bleeding edge build. */ + public boolean active(){ + return Version.type.equals("bleeding-edge"); + } + + public BeControl(){ + if(active()){ + Timer.schedule(() -> { + if(checkUpdates && !mobile){ + checkUpdate(t -> {}); + } + }, 1, updateInterval); + } + } + + /** asynchronously checks for updates. */ + public void checkUpdate(Boolc done){ + Core.net.httpGet("https://api.github.com/repos/Anuken/MindustryBuilds/releases/latest", res -> { + if(res.getStatus() == HttpStatus.OK){ + Jval val = Jval.read(res.getResultAsString()); + int newBuild = Strings.parseInt(val.getString("tag_name", "0")); + if(newBuild > Version.build){ + Jval asset = val.get("assets").asArray().find(v -> v.getString("name", "").startsWith(headless ? "Mindustry-BE-Server" : "Mindustry-BE-Desktop")); + String url = asset.getString("browser_download_url", ""); + updateAvailable = true; + updateBuild = newBuild; + updateUrl = url; + showUpdateDialog(); + Core.app.post(() -> done.get(true)); + }else{ + Core.app.post(() -> done.get(false)); + } + }else{ + Core.app.post(() -> done.get(false)); + } + }, error -> { + if(!headless){ + ui.showException(error); + }else{ + error.printStackTrace(); + } + }); + } + + /** @return whether a new update is available */ + public boolean isUpdateAvailable(){ + return updateAvailable; + } + + /** shows the dialog for updating the game on desktop, or a prompt for doing so on the server */ + public void showUpdateDialog(){ + if(!updateAvailable) return; + + if(!headless){ + checkUpdates = false; + ui.showCustomConfirm(Core.bundle.format("be.update", "") + " " + updateBuild, "$be.update.confirm", "$ok", "$be.ignore", () -> { + boolean[] cancel = {false}; + float[] progress = {0}; + int[] length = {0}; + Fi file = bebuildDirectory.child("client-be-" + updateBuild + ".jar"); + + FloatingDialog dialog = new FloatingDialog("$be.updating"); + download(updateUrl, file, i -> length[0] = i, v -> progress[0] = v, () -> cancel[0], () -> { + try{ + Runtime.getRuntime().exec(new String[]{"java", "-DlastBuild=" + Version.build, "-Dberestart", "-jar", file.absolutePath()}); + System.exit(0); + }catch(IOException e){ + ui.showException(e); + } + }, e -> { + dialog.hide(); + ui.showException(e); + }); + + dialog.cont.add(new Bar(() -> length[0] == 0 ? Core.bundle.get("be.updating") : (int)(progress[0] * length[0]) / 1024/ 1024 + "/" + length[0]/1024/1024 + " MB", () -> Pal.accent, () -> progress[0])).width(400f).height(70f); + dialog.buttons.addImageTextButton("$cancel", Icon.cancelSmall, () -> { + cancel[0] = true; + dialog.hide(); + }).size(210f, 64f); + dialog.setFillParent(false); + dialog.show(); + }, () -> checkUpdates = false); + }else{ + Log.info("&lcA new update is available: &lyBleeding Edge build {0}", updateBuild); + if(Config.autoUpdate.bool()){ + Log.info("&lcAuto-downloading next version..."); + + try{ + //download new file from github + Fi source = Fi.get(BeControl.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); + Fi dest = source.sibling("server-be-" + updateBuild + ".jar"); + + download(updateUrl, dest, + len -> Core.app.post(() -> Log.info("&ly| Size: {0} MB.", Strings.fixed((float)len / 1024 / 1024, 2))), + progress -> {}, + () -> false, + () -> Core.app.post(() -> { + netServer.kickAll(KickReason.serverRestarting); + Threads.sleep(32); + + Log.info("&lcVersion downloaded, exiting. Note that if you are not using a auto-restart script, the server will not restart automatically."); + //replace old file with new + dest.copyTo(source); + dest.delete(); + System.exit(2); //this will cause a restart if using the script + }), + Throwable::printStackTrace); + }catch(Exception e){ + e.printStackTrace(); + } + } + checkUpdates = false; + } + } + + private void download(String furl, Fi dest, Intc length, Floatc progressor, Boolp canceled, Runnable done, Cons error){ + executor.submit(() -> { + try{ + HttpURLConnection con = (HttpURLConnection)new URL(furl).openConnection(); + BufferedInputStream in = new BufferedInputStream(con.getInputStream()); + OutputStream out = dest.write(false, 4096); + + byte[] data = new byte[4096]; + long size = con.getContentLength(); + long counter = 0; + length.get((int)size); + int x; + while((x = in.read(data, 0, data.length)) >= 0 && !canceled.get()){ + counter += x; + progressor.get((float)counter / (float)size); + out.write(data, 0, x); + } + out.close(); + in.close(); + if(!canceled.get()) done.run(); + }catch(Throwable e){ + error.get(e); + } + }); + } +} diff --git a/core/src/io/anuke/mindustry/net/CrashSender.java b/core/src/mindustry/net/CrashSender.java similarity index 88% rename from core/src/io/anuke/mindustry/net/CrashSender.java rename to core/src/mindustry/net/CrashSender.java index 184e801326..1b24b2af3a 100644 --- a/core/src/io/anuke/mindustry/net/CrashSender.java +++ b/core/src/mindustry/net/CrashSender.java @@ -1,23 +1,23 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.arc.*; -import io.anuke.arc.Net.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.io.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.arc.util.serialization.JsonValue.*; -import io.anuke.arc.util.serialization.JsonWriter.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.*; +import arc.*; +import arc.Net.*; +import arc.struct.*; +import arc.files.*; +import arc.func.*; +import arc.util.*; +import arc.util.io.*; +import arc.util.serialization.*; +import arc.util.serialization.JsonValue.*; +import arc.util.serialization.JsonWriter.*; +import mindustry.*; +import mindustry.core.*; import java.io.*; import java.text.*; import java.util.*; -import static io.anuke.mindustry.Vars.net; +import static mindustry.Vars.net; public class CrashSender{ @@ -27,7 +27,9 @@ public class CrashSender{ exception.printStackTrace(); //don't create crash logs for custom builds, as it's expected - if(Version.build == -1 || (System.getProperty("user.name").equals("anuke") && "release".equals(Version.modifier))) return; + if(Version.build == -1 || (System.getProperty("user.name").equals("anuke") && "release".equals(Version.modifier))){ + ret(); + } //attempt to load version regardless if(Version.number == 0){ @@ -63,7 +65,7 @@ public class CrashSender{ try{ //check crash report setting if(!Core.settings.getBool("crashreport", true)){ - return; + ret(); } }catch(Throwable ignored){ //if there's no settings init we don't know what the user wants but chances are it's an important crash, so send it anyway @@ -72,14 +74,14 @@ public class CrashSender{ try{ //check any mods - if there are any, don't send reports if(Vars.mods != null && !Vars.mods.list().isEmpty()){ - return; + ret(); } }catch(Throwable ignored){ } //do not send exceptions that occur for versions that can't be parsed if(Version.number == 0){ - return; + ret(); } boolean netActive = false, netServer = false; @@ -130,12 +132,16 @@ public class CrashSender{ while(!sent[0]){ Thread.sleep(30); } - }catch(InterruptedException ignored){ - } + }catch(InterruptedException ignored){} }catch(Throwable death){ death.printStackTrace(); - System.exit(1); } + + ret(); + } + + private static void ret(){ + System.exit(1); } private static void httpPost(String url, String content, Cons success, Cons failure){ diff --git a/core/src/io/anuke/mindustry/net/Host.java b/core/src/mindustry/net/Host.java similarity index 87% rename from core/src/io/anuke/mindustry/net/Host.java rename to core/src/mindustry/net/Host.java index 498e40802e..5c3b010c45 100644 --- a/core/src/io/anuke/mindustry/net/Host.java +++ b/core/src/mindustry/net/Host.java @@ -1,6 +1,7 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.mindustry.game.*; +import mindustry.*; +import mindustry.game.*; public class Host{ public final String name; @@ -11,7 +12,7 @@ public class Host{ public final int version; public final String versionType; public final Gamemode mode; - public int ping; + public int ping, port = Vars.port; public Host(String name, String address, String mapname, int wave, int players, int version, String versionType, Gamemode mode, int playerLimit){ this.name = name; diff --git a/core/src/io/anuke/mindustry/net/Interpolator.java b/core/src/mindustry/net/Interpolator.java similarity index 86% rename from core/src/io/anuke/mindustry/net/Interpolator.java rename to core/src/mindustry/net/Interpolator.java index dbc9b422ca..b2a544dbd6 100644 --- a/core/src/io/anuke/mindustry/net/Interpolator.java +++ b/core/src/mindustry/net/Interpolator.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; public class Interpolator{ //used for movement - public Vector2 target = new Vector2(); - public Vector2 last = new Vector2(); + public Vec2 target = new Vec2(); + public Vec2 last = new Vec2(); public float[] targets = {}; public float[] lasts = {}; public long lastUpdated, updateSpacing; //current state - public Vector2 pos = new Vector2(); + public Vec2 pos = new Vec2(); public float[] values = {}; public void read(float cx, float cy, float x, float y, float... target1ds){ diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/mindustry/net/Net.java similarity index 96% rename from core/src/io/anuke/mindustry/net/Net.java rename to core/src/mindustry/net/Net.java index a11a9c4089..0ad720713d 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.net.Streamable.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import arc.util.pooling.*; +import mindustry.gen.*; +import mindustry.net.Packets.*; +import mindustry.net.Streamable.*; import net.jpountz.lz4.*; import java.io.*; import java.nio.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; @SuppressWarnings("unchecked") public class Net{ diff --git a/core/src/io/anuke/mindustry/net/NetConnection.java b/core/src/mindustry/net/NetConnection.java similarity index 79% rename from core/src/io/anuke/mindustry/net/NetConnection.java rename to core/src/mindustry/net/NetConnection.java index f0d37b2e9f..104ed2d431 100644 --- a/core/src/io/anuke/mindustry/net/NetConnection.java +++ b/core/src/mindustry/net/NetConnection.java @@ -1,22 +1,21 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.Administration.*; -import io.anuke.mindustry.net.Net.*; -import io.anuke.mindustry.net.Packets.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.net.Administration.*; +import mindustry.net.Net.*; +import mindustry.net.Packets.*; import java.io.*; -import static io.anuke.mindustry.Vars.netServer; +import static mindustry.Vars.netServer; public abstract class NetConnection{ public final String address; public boolean mobile, modclient; - public @Nullable - Player player; + public @Nullable Player player; /** ID of last recieved client snapshot. */ public int lastRecievedClientSnapshot = -1; @@ -37,7 +36,7 @@ public abstract class NetConnection{ if(player != null && (reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote) && player.uuid != null){ PlayerInfo info = netServer.admins.getInfo(player.uuid); info.timesKicked++; - info.lastKicked = Math.max(Time.millis(), info.lastKicked); + info.lastKicked = Math.max(Time.millis() + 30 * 1000, info.lastKicked); } Call.onKick(this, reason); @@ -49,12 +48,17 @@ public abstract class NetConnection{ /** Kick with an arbitrary reason. */ public void kick(String reason){ + kick(reason, 30 * 1000); + } + + /** Kick with an arbitrary reason, and a kick duration in milliseconds. */ + public void kick(String reason, int kickDuration){ Log.info("Kicking connection {0}; Reason: {1}", address, reason.replace("\n", " ")); if(player != null && player.uuid != null){ PlayerInfo info = netServer.admins.getInfo(player.uuid); info.timesKicked++; - info.lastKicked = Math.max(Time.millis(), info.lastKicked); + info.lastKicked = Math.max(Time.millis() + kickDuration, info.lastKicked); } Call.onKick(this, reason); diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java similarity index 89% rename from core/src/io/anuke/mindustry/net/NetworkIO.java rename to core/src/mindustry/net/NetworkIO.java index 2e82e83fa1..1c6e1acba2 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.arc.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.maps.Map; +import arc.util.*; +import mindustry.core.*; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.io.*; +import mindustry.maps.Map; +import mindustry.net.Administration.*; import java.io.*; import java.nio.*; import java.util.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class NetworkIO{ @@ -62,7 +62,7 @@ public class NetworkIO{ } public static ByteBuffer writeServerData(){ - String name = (headless ? Core.settings.getString("servername") : player.name); + String name = (headless ? Config.name.string() : player.name); String map = world.getMap() == null ? "None" : world.getMap().name(); ByteBuffer buffer = ByteBuffer.allocate(256); diff --git a/core/src/io/anuke/mindustry/net/Packet.java b/core/src/mindustry/net/Packet.java similarity index 80% rename from core/src/io/anuke/mindustry/net/Packet.java rename to core/src/mindustry/net/Packet.java index f5feb59c94..f1f45d1ad9 100644 --- a/core/src/io/anuke/mindustry/net/Packet.java +++ b/core/src/mindustry/net/Packet.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.arc.util.pooling.Pool.Poolable; +import arc.util.pooling.Pool.Poolable; import java.nio.ByteBuffer; diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/mindustry/net/Packets.java similarity index 95% rename from core/src/io/anuke/mindustry/net/Packets.java rename to core/src/mindustry/net/Packets.java index 6c006a7eba..98a3bad857 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/mindustry/net/Packets.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.io.*; +import arc.*; +import arc.struct.*; +import arc.util.serialization.*; +import mindustry.core.*; +import mindustry.io.*; import java.nio.*; @@ -15,7 +15,8 @@ public class Packets{ public enum KickReason{ kick, clientOutdated, serverOutdated, banned, gameover(true), recentKick, - nameInUse, idInUse, nameEmpty, customClient, serverClose, vote, typeMismatch, whitelist, playerLimit; + nameInUse, idInUse, nameEmpty, customClient, serverClose, vote, typeMismatch, + whitelist, playerLimit, serverRestarting; public final boolean quiet; diff --git a/core/src/io/anuke/mindustry/net/Registrator.java b/core/src/mindustry/net/Registrator.java similarity index 88% rename from core/src/io/anuke/mindustry/net/Registrator.java rename to core/src/mindustry/net/Registrator.java index 73c729dbcb..8e3c48dc51 100644 --- a/core/src/io/anuke/mindustry/net/Registrator.java +++ b/core/src/mindustry/net/Registrator.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.arc.collection.ObjectIntMap; -import io.anuke.arc.func.Prov; -import io.anuke.mindustry.net.Packets.*; +import arc.struct.ObjectIntMap; +import arc.func.Prov; +import mindustry.net.Packets.*; public class Registrator{ private static ClassEntry[] classes = { diff --git a/core/src/io/anuke/mindustry/net/Streamable.java b/core/src/mindustry/net/Streamable.java similarity index 93% rename from core/src/io/anuke/mindustry/net/Streamable.java rename to core/src/mindustry/net/Streamable.java index 01cc829412..18171b6cbf 100644 --- a/core/src/io/anuke/mindustry/net/Streamable.java +++ b/core/src/mindustry/net/Streamable.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.mindustry.net.Packets.StreamBegin; +import mindustry.net.Packets.StreamBegin; import java.io.*; diff --git a/core/src/io/anuke/mindustry/net/ValidateException.java b/core/src/mindustry/net/ValidateException.java similarity index 76% rename from core/src/io/anuke/mindustry/net/ValidateException.java rename to core/src/mindustry/net/ValidateException.java index 08f3f70483..f1291212ab 100644 --- a/core/src/io/anuke/mindustry/net/ValidateException.java +++ b/core/src/mindustry/net/ValidateException.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.net; +package mindustry.net; -import io.anuke.mindustry.entities.type.Player; +import mindustry.entities.type.Player; /** * Thrown when a client sends invalid information. diff --git a/core/src/mindustry/plugin/Plugin.java b/core/src/mindustry/plugin/Plugin.java new file mode 100644 index 0000000000..1f0ab0170c --- /dev/null +++ b/core/src/mindustry/plugin/Plugin.java @@ -0,0 +1,8 @@ +package mindustry.plugin; + +import mindustry.mod.*; + +/** Defines a special type of mod that is always hidden. */ +public abstract class Plugin extends Mod{ + +} diff --git a/core/src/io/anuke/mindustry/type/Category.java b/core/src/mindustry/type/Category.java similarity index 96% rename from core/src/io/anuke/mindustry/type/Category.java rename to core/src/mindustry/type/Category.java index c75451bc64..97f5c9d7a6 100644 --- a/core/src/io/anuke/mindustry/type/Category.java +++ b/core/src/mindustry/type/Category.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.type; +package mindustry.type; public enum Category{ /** Offensive turrets. */ diff --git a/core/src/io/anuke/mindustry/type/ErrorContent.java b/core/src/mindustry/type/ErrorContent.java similarity index 68% rename from core/src/io/anuke/mindustry/type/ErrorContent.java rename to core/src/mindustry/type/ErrorContent.java index 91c52207f8..e41f460a96 100644 --- a/core/src/io/anuke/mindustry/type/ErrorContent.java +++ b/core/src/mindustry/type/ErrorContent.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; /** Represents a blank type of content that has an error. Replaces anything that failed to parse. */ public class ErrorContent extends Content{ diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/mindustry/type/Item.java similarity index 82% rename from core/src/io/anuke/mindustry/type/Item.java rename to core/src/mindustry/type/Item.java index 01cff82cd2..f8719c34cb 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/mindustry/type/Item.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.blocks.*; +import arc.struct.*; +import arc.graphics.*; +import arc.scene.ui.layout.*; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; +import mindustry.ui.*; +import mindustry.world.blocks.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class Item extends UnlockableContent{ public final Color color; diff --git a/core/src/io/anuke/mindustry/type/ItemStack.java b/core/src/mindustry/type/ItemStack.java similarity index 93% rename from core/src/io/anuke/mindustry/type/ItemStack.java rename to core/src/mindustry/type/ItemStack.java index 723a6e4c24..7fc4d113fa 100644 --- a/core/src/io/anuke/mindustry/type/ItemStack.java +++ b/core/src/mindustry/type/ItemStack.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.arc.collection.Array; -import io.anuke.mindustry.content.Items; +import arc.struct.Array; +import mindustry.content.Items; public class ItemStack implements Comparable{ public Item item; diff --git a/core/src/io/anuke/mindustry/type/ItemType.java b/core/src/mindustry/type/ItemType.java similarity index 86% rename from core/src/io/anuke/mindustry/type/ItemType.java rename to core/src/mindustry/type/ItemType.java index 40459f070e..3d943c478a 100644 --- a/core/src/io/anuke/mindustry/type/ItemType.java +++ b/core/src/mindustry/type/ItemType.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.type; +package mindustry.type; public enum ItemType{ /** Not used for anything besides crafting inside blocks. */ diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/mindustry/type/Liquid.java similarity index 86% rename from core/src/io/anuke/mindustry/type/Liquid.java rename to core/src/mindustry/type/Liquid.java index 0b896a389c..8485d0857d 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/mindustry/type/Liquid.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.ui.*; +import arc.graphics.*; +import arc.scene.ui.layout.*; +import arc.util.ArcAnnotate.*; +import mindustry.content.*; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; +import mindustry.ui.*; public class Liquid extends UnlockableContent{ public final @NonNull Color color; diff --git a/core/src/io/anuke/mindustry/type/LiquidStack.java b/core/src/mindustry/type/LiquidStack.java similarity index 92% rename from core/src/io/anuke/mindustry/type/LiquidStack.java rename to core/src/mindustry/type/LiquidStack.java index a861525778..76df881fdf 100644 --- a/core/src/io/anuke/mindustry/type/LiquidStack.java +++ b/core/src/mindustry/type/LiquidStack.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.type; +package mindustry.type; public class LiquidStack{ public Liquid liquid; diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/mindustry/type/Mech.java similarity index 64% rename from core/src/io/anuke/mindustry/type/Mech.java rename to core/src/mindustry/type/Mech.java index 6172827ee8..d9ac986df2 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/mindustry/type/Mech.java @@ -1,15 +1,17 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.ctype.UnlockableContent; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.ui.ContentDisplay; +import arc.Core; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.ui.layout.Table; +import arc.util.ArcAnnotate.*; +import arc.util.Time; +import mindustry.ctype.ContentType; +import mindustry.entities.type.Player; +import mindustry.ctype.UnlockableContent; +import mindustry.graphics.Pal; +import mindustry.ui.ContentDisplay; public class Mech extends UnlockableContent{ public boolean flying; @@ -32,6 +34,13 @@ public class Mech extends UnlockableContent{ public boolean canHeal = false; public float compoundSpeed, compoundSpeedBoost; + /** draw the health and team indicator */ + public boolean drawCell = true; + /** draw the items on its back */ + public boolean drawItems = true; + /** draw the engine light if it's flying/boosting */ + public boolean drawLight = true; + public float weaponOffsetX, weaponOffsetY, engineOffset = 5f, engineSize = 2.5f; public @NonNull Weapon weapon; @@ -52,6 +61,24 @@ public class Mech extends UnlockableContent{ public void draw(Player player){ } + public void drawStats(Player player){ + if(drawCell){ + float health = player.healthf(); + Draw.color(Color.black, player.getTeam().color, health + Mathf.absin(Time.time(), health * 5f, 1f - health)); + Draw.rect(player.getPowerCellRegion(), + player.x + Angles.trnsx(player.rotation, cellTrnsY, 0f), + player.y + Angles.trnsy(player.rotation, cellTrnsY, 0f), + player.rotation - 90); + Draw.reset(); + } + if(drawItems){ + player.drawBackItems(); + } + if(drawLight){ + player.drawLight(); + } + } + public float getExtraArmor(Player player){ return 0f; } diff --git a/core/src/io/anuke/mindustry/type/Publishable.java b/core/src/mindustry/type/Publishable.java similarity index 90% rename from core/src/io/anuke/mindustry/type/Publishable.java rename to core/src/mindustry/type/Publishable.java index 5c6c1aade3..5e99f2b4b5 100644 --- a/core/src/io/anuke/mindustry/type/Publishable.java +++ b/core/src/mindustry/type/Publishable.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.*; +import arc.struct.*; +import arc.files.*; +import arc.util.ArcAnnotate.*; +import mindustry.*; /** Defines a piece of content that can be published on the Workshop. */ public interface Publishable{ diff --git a/core/src/io/anuke/mindustry/type/StatusEffect.java b/core/src/mindustry/type/StatusEffect.java similarity index 86% rename from core/src/io/anuke/mindustry/type/StatusEffect.java rename to core/src/mindustry/type/StatusEffect.java index 34d7a9cb77..1ade3af60f 100644 --- a/core/src/io/anuke/mindustry/type/StatusEffect.java +++ b/core/src/mindustry/type/StatusEffect.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.Statuses.*; +import arc.struct.*; +import arc.graphics.*; +import arc.math.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.type.*; +import mindustry.entities.units.Statuses.*; public class StatusEffect extends MappableContent{ /** Damage dealt by the unit with the effect. */ diff --git a/core/src/io/anuke/mindustry/type/TypeID.java b/core/src/mindustry/type/TypeID.java similarity index 64% rename from core/src/io/anuke/mindustry/type/TypeID.java rename to core/src/mindustry/type/TypeID.java index 5ab6c1f3f5..8630dfa219 100644 --- a/core/src/io/anuke/mindustry/type/TypeID.java +++ b/core/src/mindustry/type/TypeID.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.arc.func.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.traits.*; +import arc.func.*; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; +import mindustry.entities.traits.*; public class TypeID extends MappableContent{ public final Prov constructor; diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java similarity index 79% rename from core/src/io/anuke/mindustry/type/UnitType.java rename to core/src/mindustry/type/UnitType.java index 85a6882e86..af0e8d5746 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.arc.*; -import io.anuke.arc.audio.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.ctype.UnlockableContent; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.audio.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.scene.ui.layout.*; +import arc.util.ArcAnnotate.*; +import mindustry.content.*; +import mindustry.ctype.ContentType; +import mindustry.ctype.UnlockableContent; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.ui.*; public class UnitType extends UnlockableContent{ public @NonNull TypeID typeID; diff --git a/core/src/io/anuke/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java similarity index 90% rename from core/src/io/anuke/mindustry/type/Weapon.java rename to core/src/mindustry/type/Weapon.java index cd467238d9..175abd1d24 100644 --- a/core/src/io/anuke/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -1,23 +1,23 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.audio.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.gen.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.audio.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.bullet.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.entities.type.Bullet; +import mindustry.gen.*; -import static io.anuke.mindustry.Vars.net; +import static mindustry.Vars.net; public class Weapon{ public String name; @@ -55,6 +55,8 @@ public class Weapon{ public float shotDelay = 0; /** whether shooter rotation is ignored when shooting. */ public boolean ignoreRotation = false; + /** if turnCursor is false for a mech, how far away will the weapon target. */ + public float targetDistance = 1f; public Sound shootSound = Sounds.pew; diff --git a/core/src/io/anuke/mindustry/type/WeatherEvent.java b/core/src/mindustry/type/WeatherEvent.java similarity index 72% rename from core/src/io/anuke/mindustry/type/WeatherEvent.java rename to core/src/mindustry/type/WeatherEvent.java index 4f7eba597c..05e75fabdd 100644 --- a/core/src/io/anuke/mindustry/type/WeatherEvent.java +++ b/core/src/mindustry/type/WeatherEvent.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.mindustry.ctype.Content; -import io.anuke.mindustry.ctype.ContentType; +import mindustry.ctype.Content; +import mindustry.ctype.ContentType; //currently unimplemented, see trello for implementation plans public class WeatherEvent extends Content{ diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/mindustry/type/Zone.java similarity index 90% rename from core/src/io/anuke/mindustry/type/Zone.java rename to core/src/mindustry/type/Zone.java index cb047f91b0..d17b359546 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/mindustry/type/Zone.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.type; +package mindustry.type; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.ctype.UnlockableContent; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Objectives.*; -import io.anuke.mindustry.maps.generators.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.scene.ui.layout.*; +import arc.util.ArcAnnotate.*; +import mindustry.content.*; +import mindustry.ctype.ContentType; +import mindustry.ctype.UnlockableContent; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.game.Objectives.*; +import mindustry.maps.generators.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Zone extends UnlockableContent{ public @NonNull Generator generator; diff --git a/core/src/io/anuke/mindustry/ui/Bar.java b/core/src/mindustry/ui/Bar.java similarity index 86% rename from core/src/io/anuke/mindustry/ui/Bar.java rename to core/src/mindustry/ui/Bar.java index cc9e87b84b..8c23ec0ad3 100644 --- a/core/src/io/anuke/mindustry/ui/Bar.java +++ b/core/src/mindustry/ui/Bar.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.gen.*; +import arc.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.style.*; +import arc.util.pooling.*; +import mindustry.gen.*; public class Bar extends Element{ - private static Rectangle scissor = new Rectangle(); + private static Rect scissor = new Rect(); private Floatp fraction; private String name = ""; diff --git a/core/src/io/anuke/mindustry/ui/BorderImage.java b/core/src/mindustry/ui/BorderImage.java similarity index 80% rename from core/src/io/anuke/mindustry/ui/BorderImage.java rename to core/src/mindustry/ui/BorderImage.java index cff7b610b1..df077a0c13 100644 --- a/core/src/io/anuke/mindustry/ui/BorderImage.java +++ b/core/src/mindustry/ui/BorderImage.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.Image; -import io.anuke.arc.scene.ui.layout.Scl; -import io.anuke.mindustry.graphics.Pal; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.scene.ui.Image; +import arc.scene.ui.layout.Scl; +import mindustry.graphics.Pal; public class BorderImage extends Image{ public float thickness = 4f; diff --git a/core/src/io/anuke/mindustry/ui/Cicon.java b/core/src/mindustry/ui/Cicon.java similarity index 93% rename from core/src/io/anuke/mindustry/ui/Cicon.java rename to core/src/mindustry/ui/Cicon.java index 71024fddbf..2fc95294fa 100644 --- a/core/src/io/anuke/mindustry/ui/Cicon.java +++ b/core/src/mindustry/ui/Cicon.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; import java.util.*; diff --git a/core/src/io/anuke/mindustry/ui/ContentDisplay.java b/core/src/mindustry/ui/ContentDisplay.java similarity index 95% rename from core/src/io/anuke/mindustry/ui/ContentDisplay.java rename to core/src/mindustry/ui/ContentDisplay.java index 36f100d6a3..b3e49040e0 100644 --- a/core/src/io/anuke/mindustry/ui/ContentDisplay.java +++ b/core/src/mindustry/ui/ContentDisplay.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.meta.*; public class ContentDisplay{ diff --git a/core/src/io/anuke/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java similarity index 66% rename from core/src/io/anuke/mindustry/ui/Fonts.java rename to core/src/mindustry/ui/Fonts.java index cf30e810aa..5c8699edee 100644 --- a/core/src/io/anuke/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.graphics.g2d.*; +import arc.graphics.g2d.*; public class Fonts{ public static BitmapFont def; diff --git a/core/src/io/anuke/mindustry/ui/GridImage.java b/core/src/mindustry/ui/GridImage.java similarity index 90% rename from core/src/io/anuke/mindustry/ui/GridImage.java rename to core/src/mindustry/ui/GridImage.java index 81916cba40..b561ffc423 100644 --- a/core/src/io/anuke/mindustry/ui/GridImage.java +++ b/core/src/mindustry/ui/GridImage.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.graphics.g2d.Fill; -import io.anuke.arc.scene.Element; +import arc.graphics.g2d.Fill; +import arc.scene.Element; public class GridImage extends Element{ private int imageWidth, imageHeight; diff --git a/core/src/io/anuke/mindustry/ui/IconSize.java b/core/src/mindustry/ui/IconSize.java similarity index 84% rename from core/src/io/anuke/mindustry/ui/IconSize.java rename to core/src/mindustry/ui/IconSize.java index ba3ac5114c..dd3a4b37db 100644 --- a/core/src/io/anuke/mindustry/ui/IconSize.java +++ b/core/src/mindustry/ui/IconSize.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; public enum IconSize{ def(48), diff --git a/core/src/io/anuke/mindustry/ui/IntFormat.java b/core/src/mindustry/ui/IntFormat.java similarity index 89% rename from core/src/io/anuke/mindustry/ui/IntFormat.java rename to core/src/mindustry/ui/IntFormat.java index 695d177707..187e21993f 100644 --- a/core/src/io/anuke/mindustry/ui/IntFormat.java +++ b/core/src/mindustry/ui/IntFormat.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.Core; -import io.anuke.arc.func.Func; +import arc.Core; +import arc.func.Func; /** * A low-garbage way to format bundle strings. diff --git a/core/src/io/anuke/mindustry/ui/ItemDisplay.java b/core/src/mindustry/ui/ItemDisplay.java similarity index 79% rename from core/src/io/anuke/mindustry/ui/ItemDisplay.java rename to core/src/mindustry/ui/ItemDisplay.java index a55a5034c5..6407a95d0a 100644 --- a/core/src/io/anuke/mindustry/ui/ItemDisplay.java +++ b/core/src/mindustry/ui/ItemDisplay.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.ItemStack; +import arc.scene.ui.layout.Table; +import mindustry.type.Item; +import mindustry.type.ItemStack; /** An item image with text. */ public class ItemDisplay extends Table{ diff --git a/core/src/io/anuke/mindustry/ui/ItemImage.java b/core/src/mindustry/ui/ItemImage.java similarity index 79% rename from core/src/io/anuke/mindustry/ui/ItemImage.java rename to core/src/mindustry/ui/ItemImage.java index e2ea1b5c23..f04a8f0dab 100644 --- a/core/src/io/anuke/mindustry/ui/ItemImage.java +++ b/core/src/mindustry/ui/ItemImage.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.type.*; +import arc.graphics.g2d.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.type.*; public class ItemImage extends Stack{ diff --git a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java b/core/src/mindustry/ui/ItemsDisplay.java similarity index 70% rename from core/src/io/anuke/mindustry/ui/ItemsDisplay.java rename to core/src/mindustry/ui/ItemsDisplay.java index e198673c08..d59a579c16 100644 --- a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java +++ b/core/src/mindustry/ui/ItemsDisplay.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; +import arc.graphics.*; +import arc.scene.ui.layout.*; +import mindustry.core.GameState.*; +import mindustry.gen.*; +import mindustry.type.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** Displays a list of items, e.g. launched items.*/ public class ItemsDisplay extends Table{ @@ -39,9 +39,9 @@ public class ItemsDisplay extends Table{ private String format(Item item){ builder.setLength(0); builder.append(ui.formatAmount(data.items().get(item, 0))); - if(!state.is(State.menu) && !state.teams.get(player.getTeam()).cores.isEmpty() && state.teams.get(player.getTeam()).cores.first().entity != null && state.teams.get(player.getTeam()).cores.first().entity.items.get(item) > 0){ + if(!state.is(State.menu) && player.getTeam().data().hasCore() && player.getTeam().core().items.get(item) > 0){ builder.append(" [unlaunched]+ "); - builder.append(ui.formatAmount(state.teams.get(player.getTeam()).cores.first().entity.items.get(item))); + builder.append(ui.formatAmount(state.teams.get(player.getTeam()).core().items.get(item))); } return builder.toString(); } diff --git a/core/src/io/anuke/mindustry/ui/Links.java b/core/src/mindustry/ui/Links.java similarity index 89% rename from core/src/io/anuke/mindustry/ui/Links.java rename to core/src/mindustry/ui/Links.java index 670ca4e76e..a7b1afde19 100644 --- a/core/src/io/anuke/mindustry/ui/Links.java +++ b/core/src/mindustry/ui/Links.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.Core; -import io.anuke.arc.util.Strings; -import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.graphics.Pal; +import arc.Core; +import arc.util.Strings; +import arc.graphics.Color; +import mindustry.graphics.Pal; public class Links{ private static LinkEntry[] links; @@ -14,6 +14,7 @@ public class Links{ new LinkEntry("changelog", "https://github.com/Anuken/Mindustry/releases", Pal.accent.cpy()), new LinkEntry("trello", "https://trello.com/b/aE2tcUwF", Color.valueOf("026aa7")), new LinkEntry("wiki", "https://mindustrygame.github.io/wiki/", Color.valueOf("0f142f")), + new LinkEntry("feathub", "https://feathub.com/Anuken/Mindustry/", Color.valueOf("ebebeb")), new LinkEntry("reddit", "https://www.reddit.com/r/Mindustry/", Color.valueOf("ee593b")), new LinkEntry("itch.io", "https://anuke.itch.io/mindustry", Color.valueOf("fa5c5c")), new LinkEntry("google-play", "https://play.google.com/store/apps/details?id=io.anuke.mindustry", Color.valueOf("689f38")), diff --git a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java b/core/src/mindustry/ui/LiquidDisplay.java similarity index 74% rename from core/src/io/anuke/mindustry/ui/LiquidDisplay.java rename to core/src/mindustry/ui/LiquidDisplay.java index 741491d9b9..7ce5c0504e 100644 --- a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java +++ b/core/src/mindustry/ui/LiquidDisplay.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.scene.ui.Image; -import io.anuke.arc.scene.ui.layout.Stack; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.util.Strings; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.meta.StatUnit; +import arc.graphics.Color; +import arc.scene.ui.Image; +import arc.scene.ui.layout.Stack; +import arc.scene.ui.layout.Table; +import arc.util.Strings; +import mindustry.type.Liquid; +import mindustry.world.meta.StatUnit; /** An ItemDisplay, but for liquids. */ public class LiquidDisplay extends Table{ diff --git a/core/src/io/anuke/mindustry/ui/Minimap.java b/core/src/mindustry/ui/Minimap.java similarity index 87% rename from core/src/io/anuke/mindustry/ui/Minimap.java rename to core/src/mindustry/ui/Minimap.java index dc2817e8f0..bbb81a7f00 100644 --- a/core/src/io/anuke/mindustry/ui/Minimap.java +++ b/core/src/mindustry/ui/Minimap.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.input.KeyCode; -import io.anuke.arc.scene.Element; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.gen.*; +import arc.Core; +import arc.graphics.g2d.Draw; +import arc.input.KeyCode; +import arc.scene.Element; +import arc.scene.event.*; +import arc.scene.ui.layout.*; +import mindustry.gen.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Minimap extends Table{ @@ -36,7 +36,7 @@ public class Minimap extends Table{ Draw.rect(renderer.minimap.getRegion(), x + width / 2f, y + height / 2f, width, height); if(renderer.minimap.getTexture() != null){ - renderer.minimap.drawEntities(x, y, width, height, false); + renderer.minimap.drawEntities(x, y, width, height, 0.75f, false); } } }).size(140f); @@ -83,7 +83,7 @@ public class Minimap extends Table{ @Override public void clicked(InputEvent event, float x, float y){ - ui.minimap.show(); + ui.minimapfrag.toggle(); } }); diff --git a/core/src/io/anuke/mindustry/ui/MobileButton.java b/core/src/mindustry/ui/MobileButton.java similarity index 66% rename from core/src/io/anuke/mindustry/ui/MobileButton.java rename to core/src/mindustry/ui/MobileButton.java index b674830ebd..736247d45b 100644 --- a/core/src/io/anuke/mindustry/ui/MobileButton.java +++ b/core/src/mindustry/ui/MobileButton.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.ImageButton; -import io.anuke.arc.util.Align; +import arc.scene.style.*; +import arc.scene.ui.ImageButton; +import arc.util.Align; public class MobileButton extends ImageButton{ diff --git a/core/src/io/anuke/mindustry/ui/MultiReqImage.java b/core/src/mindustry/ui/MultiReqImage.java similarity index 82% rename from core/src/io/anuke/mindustry/ui/MultiReqImage.java rename to core/src/mindustry/ui/MultiReqImage.java index 4fa2cf2fc8..6d7f199f57 100644 --- a/core/src/io/anuke/mindustry/ui/MultiReqImage.java +++ b/core/src/mindustry/ui/MultiReqImage.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.collection.Array; -import io.anuke.arc.scene.ui.layout.Stack; -import io.anuke.arc.util.Time; +import arc.struct.Array; +import arc.scene.ui.layout.Stack; +import arc.util.Time; public class MultiReqImage extends Stack{ private Array displays = new Array<>(); diff --git a/core/src/io/anuke/mindustry/ui/ReqImage.java b/core/src/mindustry/ui/ReqImage.java similarity index 72% rename from core/src/io/anuke/mindustry/ui/ReqImage.java rename to core/src/mindustry/ui/ReqImage.java index 17c88a959b..eef8591f63 100644 --- a/core/src/io/anuke/mindustry/ui/ReqImage.java +++ b/core/src/mindustry/ui/ReqImage.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.arc.func.Boolp; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.Element; -import io.anuke.arc.scene.ui.Image; -import io.anuke.arc.scene.ui.layout.Stack; -import io.anuke.arc.scene.ui.layout.Scl; -import io.anuke.mindustry.graphics.Pal; +import arc.func.Boolp; +import arc.graphics.g2d.*; +import arc.scene.Element; +import arc.scene.ui.Image; +import arc.scene.ui.layout.Stack; +import arc.scene.ui.layout.Scl; +import mindustry.graphics.Pal; public class ReqImage extends Stack{ private final Boolp valid; diff --git a/core/src/io/anuke/mindustry/ui/Styles.java b/core/src/mindustry/ui/Styles.java similarity index 93% rename from core/src/io/anuke/mindustry/ui/Styles.java rename to core/src/mindustry/ui/Styles.java index 1f7be8f08c..e28882397f 100644 --- a/core/src/io/anuke/mindustry/ui/Styles.java +++ b/core/src/mindustry/ui/Styles.java @@ -1,25 +1,25 @@ -package io.anuke.mindustry.ui; +package mindustry.ui; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.g2d.TextureAtlas.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.Button.*; -import io.anuke.arc.scene.ui.CheckBox.*; -import io.anuke.arc.scene.ui.Dialog.*; -import io.anuke.arc.scene.ui.ImageButton.*; -import io.anuke.arc.scene.ui.KeybindDialog.*; -import io.anuke.arc.scene.ui.Label.*; -import io.anuke.arc.scene.ui.ScrollPane.*; -import io.anuke.arc.scene.ui.Slider.*; -import io.anuke.arc.scene.ui.TextButton.*; -import io.anuke.arc.scene.ui.TextField.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.graphics.g2d.TextureAtlas.*; +import arc.scene.style.*; +import arc.scene.ui.Button.*; +import arc.scene.ui.CheckBox.*; +import arc.scene.ui.Dialog.*; +import arc.scene.ui.ImageButton.*; +import arc.scene.ui.KeybindDialog.*; +import arc.scene.ui.Label.*; +import arc.scene.ui.ScrollPane.*; +import arc.scene.ui.Slider.*; +import arc.scene.ui.TextButton.*; +import arc.scene.ui.TextField.*; +import mindustry.gen.*; +import mindustry.graphics.*; -import static io.anuke.mindustry.gen.Tex.*; +import static mindustry.gen.Tex.*; @StyleDefaults public class Styles{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java b/core/src/mindustry/ui/dialogs/AboutDialog.java similarity index 86% rename from core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java rename to core/src/mindustry/ui/dialogs/AboutDialog.java index 83d44a97f2..7b64fdaf3a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/mindustry/ui/dialogs/AboutDialog.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Links.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.ui.Links.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class AboutDialog extends FloatingDialog{ private Array contributors = new Array<>(); @@ -95,7 +95,7 @@ public class AboutDialog extends FloatingDialog{ public void showCredits(){ FloatingDialog dialog = new FloatingDialog("$credits"); dialog.addCloseButton(); - dialog.cont.add("$credits.text"); + dialog.cont.add("$credits.text").fillX().wrap().get().setAlignment(Align.center); dialog.cont.row(); if(!contributors.isEmpty()){ dialog.cont.addImage().color(Pal.accent).fillX().height(3f).pad(3f); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java b/core/src/mindustry/ui/dialogs/AdminsDialog.java similarity index 85% rename from core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java rename to core/src/mindustry/ui/dialogs/AdminsDialog.java index c53cbc3ec7..4b9d23816d 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AdminsDialog.java +++ b/core/src/mindustry/ui/dialogs/AdminsDialog.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.Administration.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.gen.*; +import mindustry.net.Administration.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class AdminsDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/BansDialog.java b/core/src/mindustry/ui/dialogs/BansDialog.java similarity index 83% rename from core/src/io/anuke/mindustry/ui/dialogs/BansDialog.java rename to core/src/mindustry/ui/dialogs/BansDialog.java index 4a09b24b65..18b9e5b701 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/BansDialog.java +++ b/core/src/mindustry/ui/dialogs/BansDialog.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.Administration.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.gen.*; +import mindustry.net.Administration.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class BansDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ColorPicker.java b/core/src/mindustry/ui/dialogs/ColorPicker.java similarity index 88% rename from core/src/io/anuke/mindustry/ui/dialogs/ColorPicker.java rename to core/src/mindustry/ui/dialogs/ColorPicker.java index 03454d76e5..e5a9c60f01 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ColorPicker.java +++ b/core/src/mindustry/ui/dialogs/ColorPicker.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; +import arc.func.*; +import arc.graphics.*; +import arc.scene.ui.*; +import mindustry.gen.*; +import mindustry.graphics.*; public class ColorPicker extends FloatingDialog{ private Cons cons = c -> {}; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java similarity index 70% rename from core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java rename to core/src/mindustry/ui/dialogs/ContentInfoDialog.java index 3a4abf4d18..e73a0bb427 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.scene.ui.ScrollPane; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.ctype.UnlockableContent; +import arc.scene.ui.ScrollPane; +import arc.scene.ui.layout.Table; +import mindustry.ctype.UnlockableContent; public class ContentInfoDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ControlsDialog.java b/core/src/mindustry/ui/dialogs/ControlsDialog.java similarity index 70% rename from core/src/io/anuke/mindustry/ui/dialogs/ControlsDialog.java rename to core/src/mindustry/ui/dialogs/ControlsDialog.java index a78051e601..a7179a4d0a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ControlsDialog.java +++ b/core/src/mindustry/ui/dialogs/ControlsDialog.java @@ -1,11 +1,10 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.input.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; +import arc.input.*; +import arc.scene.ui.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.graphics.*; public class ControlsDialog extends KeybindDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java b/core/src/mindustry/ui/dialogs/CustomGameDialog.java similarity index 84% rename from core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java rename to core/src/mindustry/ui/dialogs/CustomGameDialog.java index 74eb693fec..fdc5077821 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomGameDialog.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.maps.*; +import mindustry.ui.*; public class CustomGameDialog extends FloatingDialog{ private MapPlayDialog dialog = new MapPlayDialog(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java similarity index 93% rename from core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java rename to core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 201e3411f2..73eb5a9efa 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -1,24 +1,24 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class CustomRulesDialog extends FloatingDialog{ private Table main; @@ -142,6 +142,7 @@ public class CustomRulesDialog extends FloatingDialog{ check("$rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions); number("$rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources); number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier); + number("$rules.blockhealthmultiplier", f -> rules.blockHealthMultiplier = f, () -> rules.blockHealthMultiplier); main.addButton("$configure", () -> loadoutDialog.show(Blocks.coreShard.itemCapacity, rules.loadout, diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java similarity index 82% rename from core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java rename to core/src/mindustry/ui/dialogs/DatabaseDialog.java index 406665f431..a78c5c0ccb 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.*; +import mindustry.core.GameState.*; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; public class DatabaseDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java b/core/src/mindustry/ui/dialogs/DeployDialog.java similarity index 91% rename from core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java rename to core/src/mindustry/ui/dialogs/DeployDialog.java index a84ff1a73c..811caca161 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java +++ b/core/src/mindustry/ui/dialogs/DeployDialog.java @@ -1,39 +1,39 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.scene.utils.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Saves.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.io.SaveIO.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.layout.*; -import io.anuke.mindustry.ui.layout.TreeLayout.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.event.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.scene.utils.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.core.GameState.*; +import mindustry.game.EventType.*; +import mindustry.game.Saves.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.io.SaveIO.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.layout.*; +import mindustry.ui.layout.TreeLayout.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class DeployDialog extends FloatingDialog{ private final float nodeSize = Scl.scl(230f); private ObjectSet nodes = new ObjectSet<>(); private ZoneInfoDialog info = new ZoneInfoDialog(); - private Rectangle bounds = new Rectangle(); + private Rect bounds = new Rect(); private View view = new View(); public DeployDialog(){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DiscordDialog.java b/core/src/mindustry/ui/dialogs/DiscordDialog.java similarity index 82% rename from core/src/io/anuke/mindustry/ui/dialogs/DiscordDialog.java rename to core/src/mindustry/ui/dialogs/DiscordDialog.java index 2b87ed6a7d..9886736a01 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DiscordDialog.java +++ b/core/src/mindustry/ui/dialogs/DiscordDialog.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.scene.ui.Dialog; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.Pal; +import arc.Core; +import arc.graphics.Color; +import arc.scene.ui.Dialog; +import mindustry.gen.*; +import mindustry.graphics.Pal; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class DiscordDialog extends Dialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java b/core/src/mindustry/ui/dialogs/FileChooser.java similarity index 94% rename from core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java rename to core/src/mindustry/ui/dialogs/FileChooser.java index 811cf7add5..44c4a47450 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/mindustry/ui/dialogs/FileChooser.java @@ -1,21 +1,21 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.struct.*; +import arc.files.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.pooling.*; +import mindustry.gen.*; +import mindustry.ui.*; import java.util.*; -import static io.anuke.mindustry.Vars.platform; +import static mindustry.Vars.platform; public class FileChooser extends FloatingDialog{ private static final Fi homeDirectory = Core.files.absolute(Core.files.getExternalStoragePath()); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java b/core/src/mindustry/ui/dialogs/FloatingDialog.java similarity index 81% rename from core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java rename to core/src/mindustry/ui/dialogs/FloatingDialog.java index 09924218d0..6204eb6682 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/FloatingDialog.java +++ b/core/src/mindustry/ui/dialogs/FloatingDialog.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.input.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; +import arc.*; +import arc.input.*; +import arc.scene.ui.*; +import arc.util.*; +import mindustry.core.GameState.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class FloatingDialog extends Dialog{ private boolean wasPaused; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java b/core/src/mindustry/ui/dialogs/GameOverDialog.java similarity index 90% rename from core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java rename to core/src/mindustry/ui/dialogs/GameOverDialog.java index af64727163..bb9b4fcc8d 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java +++ b/core/src/mindustry/ui/dialogs/GameOverDialog.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Stats.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Cicon; +import arc.*; +import mindustry.core.GameState.*; +import mindustry.game.*; +import mindustry.game.EventType.*; +import mindustry.game.Stats.*; +import mindustry.type.*; +import mindustry.ui.Cicon; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class GameOverDialog extends FloatingDialog{ private Team winner; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/mindustry/ui/dialogs/HostDialog.java similarity index 89% rename from core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java rename to core/src/mindustry/ui/dialogs/HostDialog.java index 200986f839..196f93d63f 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/mindustry/ui/dialogs/HostDialog.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.graphics.*; +import arc.scene.ui.*; +import arc.util.*; +import mindustry.*; +import mindustry.core.*; +import mindustry.gen.*; +import mindustry.ui.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class HostDialog extends FloatingDialog{ float w = 300; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java similarity index 93% rename from core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java rename to core/src/mindustry/ui/dialogs/JoinDialog.java index 490d2b370f..d3e154b3b1 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -1,23 +1,23 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.graphics.*; +import arc.input.*; +import arc.math.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.serialization.*; +import mindustry.*; +import mindustry.core.*; +import mindustry.gen.*; +import mindustry.net.*; +import mindustry.net.Packets.*; +import mindustry.ui.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class JoinDialog extends FloatingDialog{ Array servers = new Array<>(); @@ -288,7 +288,12 @@ public class JoinDialog extends FloatingDialog{ local.table(Tex.button, t -> t.label(() -> "[accent]" + Core.bundle.get("hosts.discovering.any") + Strings.animated(Time.time(), 4, 10f, ".")).pad(10f)).growX(); net.discoverServers(this::addLocalHost, this::finishLocalHosts); for(String host : defaultServers){ - net.pingHost(host, port, this::addLocalHost, e -> {}); + String resaddress = host.contains(":") ? host.split(":")[0] : host; + int resport = host.contains(":") ? Strings.parseInt(host.split(":")[1]) : port; + net.pingHost(resaddress, resport, res -> { + res.port = resport; + addLocalHost(res); + }, e -> {}); } } @@ -314,7 +319,7 @@ public class JoinDialog extends FloatingDialog{ local.row(); - TextButton button = local.addButton("", Styles.cleart, () -> safeConnect(host.address, port, host.version)) + TextButton button = local.addButton("", Styles.cleart, () -> safeConnect(host.address, host.port, host.version)) .width(w).pad(5f).get(); button.clearChildren(); buildServer(host, button); @@ -362,7 +367,7 @@ public class JoinDialog extends FloatingDialog{ servers = Core.settings.getObject("server-list", Array.class, Array::new); //get servers - Core.net.httpGet(serverJsonURL, result -> { + Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonURL, result -> { try{ Jval val = Jval.read(result.getResultAsString()); Core.app.post(() -> { diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java b/core/src/mindustry/ui/dialogs/LanguageDialog.java similarity index 86% rename from core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java rename to core/src/mindustry/ui/dialogs/LanguageDialog.java index bfe98b9ce8..849c25d2ee 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LanguageDialog.java +++ b/core/src/mindustry/ui/dialogs/LanguageDialog.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.Core; -import io.anuke.arc.collection.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.util.Log; -import io.anuke.arc.util.Strings; -import io.anuke.mindustry.ui.*; +import arc.Core; +import arc.struct.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.Table; +import arc.util.Log; +import arc.util.Strings; +import mindustry.ui.*; import java.util.Locale; -import static io.anuke.mindustry.Vars.locales; -import static io.anuke.mindustry.Vars.ui; +import static mindustry.Vars.locales; +import static mindustry.Vars.ui; public class LanguageDialog extends FloatingDialog{ private Locale lastLocale; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/mindustry/ui/dialogs/LoadDialog.java similarity index 91% rename from core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java rename to core/src/mindustry/ui/dialogs/LoadDialog.java index a1dfe4622a..78e504e6e0 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/mindustry/ui/dialogs/LoadDialog.java @@ -1,25 +1,25 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.Saves.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.io.SaveIO.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Styles; +import arc.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.core.GameState.*; +import mindustry.game.Saves.*; +import mindustry.gen.*; +import mindustry.io.*; +import mindustry.io.SaveIO.*; +import mindustry.ui.*; +import mindustry.ui.Styles; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class LoadDialog extends FloatingDialog{ ScrollPane pane; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java b/core/src/mindustry/ui/dialogs/LoadoutDialog.java similarity index 91% rename from core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java rename to core/src/mindustry/ui/dialogs/LoadoutDialog.java index f6bd24ff37..9f84c3a616 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java +++ b/core/src/mindustry/ui/dialogs/LoadoutDialog.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.input.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; +import arc.*; +import arc.struct.*; +import arc.input.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class LoadoutDialog extends FloatingDialog{ private Runnable hider; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java b/core/src/mindustry/ui/dialogs/MapPlayDialog.java similarity index 89% rename from core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java rename to core/src/mindustry/ui/dialogs/MapPlayDialog.java index de6dccaefe..052d18e461 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java +++ b/core/src/mindustry/ui/dialogs/MapPlayDialog.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.maps.*; +import mindustry.ui.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MapPlayDialog extends FloatingDialog{ CustomRulesDialog dialog = new CustomRulesDialog(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java b/core/src/mindustry/ui/dialogs/MapsDialog.java similarity index 93% rename from core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java rename to core/src/mindustry/ui/dialogs/MapsDialog.java index 4fd821d051..99b4f40778 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/mindustry/ui/dialogs/MapsDialog.java @@ -1,21 +1,21 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.graphics.*; +import arc.input.*; +import arc.math.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.io.*; +import mindustry.maps.*; +import mindustry.ui.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MapsDialog extends FloatingDialog{ private FloatingDialog dialog; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MinimapDialog.java b/core/src/mindustry/ui/dialogs/MinimapDialog.java similarity index 85% rename from core/src/io/anuke/mindustry/ui/dialogs/MinimapDialog.java rename to core/src/mindustry/ui/dialogs/MinimapDialog.java index b527b98456..c8f0163aac 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MinimapDialog.java +++ b/core/src/mindustry/ui/dialogs/MinimapDialog.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.gen.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.scene.event.*; +import arc.scene.ui.layout.*; +import mindustry.gen.*; -import static io.anuke.mindustry.Vars.renderer; +import static mindustry.Vars.renderer; public class MinimapDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java similarity index 94% rename from core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java rename to core/src/mindustry/ui/dialogs/ModsDialog.java index b3003cbb0b..4b42f64d80 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.Net.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.io.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.Net.*; +import arc.files.*; +import arc.util.*; +import arc.util.io.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.mod.Mods.*; +import mindustry.ui.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ModsDialog extends FloatingDialog{ @@ -32,7 +32,7 @@ public class ModsDialog extends FloatingDialog{ buttons.row(); - buttons.addImageTextButton("$mods.guide", Icon.wiki, + buttons.addImageTextButton("$mods.guide", Icon.link, () -> Core.net.openURI(modGuideURL)) .size(210, 64f); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/PaletteDialog.java b/core/src/mindustry/ui/dialogs/PaletteDialog.java similarity index 75% rename from core/src/io/anuke/mindustry/ui/dialogs/PaletteDialog.java rename to core/src/mindustry/ui/dialogs/PaletteDialog.java index 693a576691..876d88b925 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/PaletteDialog.java +++ b/core/src/mindustry/ui/dialogs/PaletteDialog.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.input.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.ui.*; +import arc.func.*; +import arc.graphics.*; +import arc.input.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.gen.*; +import mindustry.ui.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class PaletteDialog extends Dialog{ private Cons cons; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java similarity index 95% rename from core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java rename to core/src/mindustry/ui/dialogs/PausedDialog.java index 1073a98892..01d776bd3b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/mindustry/ui/dialogs/PausedDialog.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.input.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.gen.*; +import arc.*; +import arc.input.*; +import mindustry.core.GameState.*; +import mindustry.gen.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class PausedDialog extends FloatingDialog{ private SaveDialog save = new SaveDialog(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SaveDialog.java b/core/src/mindustry/ui/dialogs/SaveDialog.java similarity index 81% rename from core/src/io/anuke/mindustry/ui/dialogs/SaveDialog.java rename to core/src/mindustry/ui/dialogs/SaveDialog.java index 68b22313b9..0832e80bdf 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SaveDialog.java +++ b/core/src/mindustry/ui/dialogs/SaveDialog.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.Core; -import io.anuke.arc.scene.ui.TextButton; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.game.Saves.SaveSlot; -import io.anuke.mindustry.gen.*; +import arc.Core; +import arc.scene.ui.TextButton; +import arc.util.Time; +import mindustry.core.GameState.State; +import mindustry.game.Saves.SaveSlot; +import mindustry.gen.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class SaveDialog extends LoadDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/mindustry/ui/dialogs/SchematicsDialog.java similarity index 94% rename from core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java rename to core/src/mindustry/ui/dialogs/SchematicsDialog.java index 4e10a46160..1747cdf2a0 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/mindustry/ui/dialogs/SchematicsDialog.java @@ -1,24 +1,24 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Texture.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.ImageButton.*; -import io.anuke.arc.scene.ui.TextButton.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.Texture.*; +import arc.graphics.g2d.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.ImageButton.*; +import arc.scene.ui.TextButton.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.core.GameState.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class SchematicsDialog extends FloatingDialog{ private SchematicInfoDialog info = new SchematicInfoDialog(); @@ -163,7 +163,7 @@ public class SchematicsDialog extends FloatingDialog{ setup(); ui.showInfoFade("$schematic.saved"); showInfo(s); - }catch(Exception e){ + }catch(Throwable e){ ui.showException(e); } }).marginLeft(12f).disabled(b -> Core.app.getClipboardText() == null || !Core.app.getClipboardText().startsWith(schematicBaseStart)); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java similarity index 93% rename from core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java rename to core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 26cd33ec93..ea9210f695 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -1,28 +1,28 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.Texture.*; -import io.anuke.arc.input.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.SettingsDialog.SettingsTable.*; -import io.anuke.arc.scene.ui.TextButton.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.graphics.Texture.*; +import arc.input.*; +import arc.scene.*; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.SettingsDialog.SettingsTable.*; +import arc.scene.ui.TextButton.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.core.GameState.*; +import mindustry.core.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.input.*; +import mindustry.ui.*; -import static io.anuke.arc.Core.bundle; -import static io.anuke.mindustry.Vars.*; +import static arc.Core.bundle; +import static mindustry.Vars.*; public class SettingsMenuDialog extends SettingsDialog{ private SettingsTable graphics; @@ -229,6 +229,7 @@ public class SettingsMenuDialog extends SettingsDialog{ game.checkPref("savecreate", true); game.checkPref("blockreplace", true); game.checkPref("conveyorpathfinding", true); + game.checkPref("coreselect", false); game.checkPref("hints", true); if(!mobile){ game.checkPref("buildautopause", false); @@ -267,6 +268,7 @@ public class SettingsMenuDialog extends SettingsDialog{ } return s + "%"; }); + graphics.sliderPref("bridgeopacity", 75, 0, 100, 5, s -> s + "%"); if(!mobile){ graphics.checkPref("vsync", true, b -> Core.graphics.setVSync(b)); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/mindustry/ui/dialogs/TechTreeDialog.java similarity index 92% rename from core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java rename to core/src/mindustry/ui/dialogs/TechTreeDialog.java index 7a60ad2724..0d28af70c5 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/mindustry/ui/dialogs/TechTreeDialog.java @@ -1,37 +1,37 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.actions.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.content.TechTree.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.ui.layout.*; -import io.anuke.mindustry.ui.layout.TreeLayout.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.actions.*; +import arc.scene.event.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.content.TechTree.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.ui.layout.*; +import mindustry.ui.layout.TreeLayout.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class TechTreeDialog extends FloatingDialog{ private final float nodeSize = Scl.scl(60f); private ObjectSet nodes = new ObjectSet<>(); private TechTreeNode root = new TechTreeNode(TechTree.root, null); - private Rectangle bounds = new Rectangle(); + private Rect bounds = new Rect(); private ItemsDisplay items; private View view; @@ -123,7 +123,7 @@ public class TechTreeDialog extends FloatingDialog{ miny = Math.min(n.y - n.height/2f, miny); maxy = Math.max(n.y + n.height/2f, maxy); } - bounds = new Rectangle(minx, miny, maxx - minx, maxy - miny); + bounds = new Rect(minx, miny, maxx - minx, maxy - miny); bounds.y += nodeSize*1.5f; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java b/core/src/mindustry/ui/dialogs/TraceDialog.java similarity index 78% rename from core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java rename to core/src/mindustry/ui/dialogs/TraceDialog.java index 6635da8a45..9d31780501 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TraceDialog.java +++ b/core/src/mindustry/ui/dialogs/TraceDialog.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.Core; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.Administration.TraceInfo; +import arc.Core; +import arc.scene.ui.layout.Table; +import mindustry.entities.type.Player; +import mindustry.gen.*; +import mindustry.net.Administration.TraceInfo; public class TraceDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/mindustry/ui/dialogs/ZoneInfoDialog.java similarity index 89% rename from core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java rename to core/src/mindustry/ui/dialogs/ZoneInfoDialog.java index 1bf34b0855..ed1584133c 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.ui.dialogs; +package mindustry.ui.dialogs; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Objectives.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Cicon; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.game.*; +import mindustry.game.Objectives.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.Cicon; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ZoneInfoDialog extends FloatingDialog{ private LoadoutDialog loadout = new LoadoutDialog(); @@ -45,7 +45,7 @@ public class ZoneInfoDialog extends FloatingDialog{ if(i++ % 2 == 0){ iteminfo.row(); } - iteminfo.addImage(stack.item.icon(io.anuke.mindustry.ui.Cicon.small)).size(8 * 3).padRight(1); + iteminfo.addImage(stack.item.icon(mindustry.ui.Cicon.small)).size(8 * 3).padRight(1); iteminfo.add(stack.amount + "").color(Color.lightGray).padRight(5); } }; @@ -85,7 +85,7 @@ public class ZoneInfoDialog extends FloatingDialog{ r.add("$research.list").colspan(2).left(); r.row(); for(Unlock blocko : blocks){ - r.addImage(blocko.block.icon(io.anuke.mindustry.ui.Cicon.small)).size(8 * 3).padRight(5); + r.addImage(blocko.block.icon(mindustry.ui.Cicon.small)).size(8 * 3).padRight(5); r.add(blocko.block.localizedName).color(Color.lightGray).left(); r.addImage(blocko.block.unlocked() ? Icon.checkSmall : Icon.cancelSmall, blocko.block.unlocked() ? Color.lightGray : Color.scarlet).padLeft(3); r.row(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java b/core/src/mindustry/ui/fragments/BlockConfigFragment.java similarity index 84% rename from core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java rename to core/src/mindustry/ui/fragments/BlockConfigFragment.java index 663c275e11..8a6aaceda9 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java +++ b/core/src/mindustry/ui/fragments/BlockConfigFragment.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.actions.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.math.*; +import arc.scene.*; +import arc.scene.actions.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.core.GameState.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class BlockConfigFragment extends Fragment{ private Table table = new Table(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/mindustry/ui/fragments/BlockInventoryFragment.java similarity index 84% rename from core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java rename to core/src/mindustry/ui/fragments/BlockInventoryFragment.java index 8dc34edd01..c4cc71cc5a 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/mindustry/ui/fragments/BlockInventoryFragment.java @@ -1,29 +1,29 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.actions.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.actions.*; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.core.GameState.*; +import mindustry.entities.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.ui.Cicon; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class BlockInventoryFragment extends Fragment{ private final static float holdWithdraw = 20f; @@ -36,7 +36,7 @@ public class BlockInventoryFragment extends Fragment{ @Remote(called = Loc.server, targets = Loc.both, forward = true) public static void requestItem(Player player, Tile tile, Item item, int amount){ - if(player == null || tile == null || !player.timer.get(Player.timerTransfer, 20) || !tile.interactable(player.getTeam())) return; + if(player == null || tile == null || !tile.interactable(player.getTeam())) return; if(!Units.canInteract(player, tile)) return; int removed = tile.block().removeStack(tile, item, amount); @@ -199,7 +199,7 @@ public class BlockInventoryFragment extends Fragment{ } private void updateTablePosition(){ - Vector2 v = Core.input.mouseScreen(tile.drawx() + tile.block().size * tilesize / 2f, tile.drawy() + tile.block().size * tilesize / 2f); + Vec2 v = Core.input.mouseScreen(tile.drawx() + tile.block().size * tilesize / 2f, tile.drawy() + tile.block().size * tilesize / 2f); table.pack(); table.setPosition(v.x, v.y, Align.topLeft); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java similarity index 91% rename from core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java rename to core/src/mindustry/ui/fragments/ChatFragment.java index c7c168bc84..a6cd4354cf 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -1,24 +1,24 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.*; -import io.anuke.arc.Input.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.Label.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.Input.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.*; +import arc.scene.ui.*; +import arc.scene.ui.Label.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.*; +import mindustry.gen.*; +import mindustry.input.*; +import mindustry.ui.*; -import static io.anuke.arc.Core.*; -import static io.anuke.mindustry.Vars.net; -import static io.anuke.mindustry.Vars.*; +import static arc.Core.*; +import static mindustry.Vars.net; +import static mindustry.Vars.*; public class ChatFragment extends Table{ private final static int messagesShown = 10; diff --git a/core/src/io/anuke/mindustry/ui/fragments/FadeInFragment.java b/core/src/mindustry/ui/fragments/FadeInFragment.java similarity index 81% rename from core/src/io/anuke/mindustry/ui/fragments/FadeInFragment.java rename to core/src/mindustry/ui/fragments/FadeInFragment.java index 4d903430dc..d6ce32541f 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/FadeInFragment.java +++ b/core/src/mindustry/ui/fragments/FadeInFragment.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.event.*; +import arc.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.*; +import arc.scene.event.*; /** Fades in a black overlay.*/ public class FadeInFragment extends Fragment{ diff --git a/core/src/io/anuke/mindustry/ui/fragments/Fragment.java b/core/src/mindustry/ui/fragments/Fragment.java similarity index 52% rename from core/src/io/anuke/mindustry/ui/fragments/Fragment.java rename to core/src/mindustry/ui/fragments/Fragment.java index f878d5465d..2e66da0652 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/Fragment.java +++ b/core/src/mindustry/ui/fragments/Fragment.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.scene.Group; +import arc.scene.Group; public abstract class Fragment{ public abstract void build(Group parent); diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java similarity index 91% rename from core/src/io/anuke/mindustry/ui/fragments/HudFragment.java rename to core/src/mindustry/ui/fragments/HudFragment.java index 8b05c07d5a..688923924c 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -1,38 +1,38 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.input.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.actions.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.ImageButton.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.ctype.UnlockableContent; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.ui.dialogs.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.actions.*; +import arc.scene.event.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.ImageButton.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.core.GameState.*; +import mindustry.ctype.ContentType; +import mindustry.ctype.UnlockableContent; +import mindustry.entities.*; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.input.*; +import mindustry.net.Packets.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.ui.dialogs.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class HudFragment extends Fragment{ public final PlacementFragment blockfrag = new PlacementFragment(); @@ -168,7 +168,7 @@ public class HudFragment extends Fragment{ t.table(teams -> { teams.left(); int i = 0; - for(Team team : Team.all){ + for(Team team : Team.base()){ ImageButton button = teams.addImageButton(Tex.whiteui, Styles.clearTogglePartiali, 40f, () -> Call.setPlayerTeamEditor(player, team)) .size(50f).margin(6f).get(); button.getImageCell().grow(); @@ -208,7 +208,7 @@ public class HudFragment extends Fragment{ if(b.isChecked()){ Element e = Core.scene.hit(Core.input.mouseX(), Core.input.mouseY(), true); if(e == null){ - Vector2 world = Core.input.mouseWorld(); + Vec2 world = Core.input.mouseWorld(); Units.nearby(world.x, world.y, 1f, 1f, unit -> { if(!found[0] && unit instanceof BaseUnit){ if(Core.input.keyTap(KeyCode.MOUSE_LEFT)){ @@ -287,7 +287,7 @@ public class HudFragment extends Fragment{ }); t.top().visible(() -> { - if(state.is(State.menu) || state.teams.get(player.getTeam()).cores.size == 0 || state.teams.get(player.getTeam()).cores.first().entity == null){ + if(state.is(State.menu) || !state.teams.get(player.getTeam()).hasCore()){ coreAttackTime[0] = 0f; return false; } @@ -557,7 +557,7 @@ public class HudFragment extends Fragment{ } private boolean canLaunch(){ - return inLaunchWave() && state.enemies() <= 0; + return inLaunchWave() && state.enemies <= 0; } private void toggleMenus(){ @@ -604,7 +604,7 @@ public class HudFragment extends Fragment{ if(inLaunchWave()){ builder.append("[#"); - Tmp.c1.set(Color.white).lerp(state.enemies() > 0 ? Color.white : Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)).toString(builder); + Tmp.c1.set(Color.white).lerp(state.enemies > 0 ? Color.white : Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)).toString(builder); builder.append("]"); if(!canLaunch()){ @@ -618,18 +618,18 @@ public class HudFragment extends Fragment{ builder.append("[]\n"); } - if(state.enemies() > 0){ - if(state.enemies() == 1){ - builder.append(enemyf.get(state.enemies())); + if(state.enemies > 0){ + if(state.enemies == 1){ + builder.append(enemyf.get(state.enemies)); }else{ - builder.append(enemiesf.get(state.enemies())); + builder.append(enemiesf.get(state.enemies)); } builder.append("\n"); } if(state.rules.waveTimer){ - builder.append((state.rules.waitForWaveToEnd && unitGroups[waveTeam.ordinal()].size() > 0) ? Core.bundle.get("wave.waveInProgress") : ( waitingf.get((int)(state.wavetime/60)))); - }else if(state.enemies() == 0){ + builder.append((state.rules.waitForWaveToEnd && state.enemies > 0 ? Core.bundle.get("wave.waveInProgress") : ( waitingf.get((int)(state.wavetime/60))))); + }else if(state.enemies == 0){ builder.append(Core.bundle.get("waiting")); } @@ -646,7 +646,7 @@ public class HudFragment extends Fragment{ } private boolean canSkipWave(){ - return state.rules.waves && ((net.server() || player.isAdmin) || !net.active()) && state.enemies() == 0 && !spawner.isSpawning() && !state.rules.tutorial; + return state.rules.waves && ((net.server() || player.isAdmin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning() && !state.rules.tutorial; } private void addPlayButton(Table table){ diff --git a/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java b/core/src/mindustry/ui/fragments/LoadingFragment.java similarity index 83% rename from core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java rename to core/src/mindustry/ui/fragments/LoadingFragment.java index dec9860e0d..6cbbeb35fd 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java +++ b/core/src/mindustry/ui/fragments/LoadingFragment.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.scene.Group; -import io.anuke.arc.scene.actions.*; -import io.anuke.arc.scene.event.Touchable; -import io.anuke.arc.scene.ui.Label; -import io.anuke.arc.scene.ui.TextButton; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.ui.*; +import arc.func.*; +import arc.graphics.*; +import arc.scene.Group; +import arc.scene.actions.*; +import arc.scene.event.Touchable; +import arc.scene.ui.Label; +import arc.scene.ui.TextButton; +import arc.scene.ui.layout.Table; +import mindustry.graphics.Pal; +import mindustry.ui.*; public class LoadingFragment extends Fragment{ private Table table; diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java similarity index 89% rename from core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java rename to core/src/mindustry/ui/fragments/MenuFragment.java index abf313183b..8737db0d9a 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -1,23 +1,23 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.actions.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.*; +import arc.scene.actions.*; +import arc.scene.event.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.core.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MenuFragment extends Fragment{ private Table container, submenu; @@ -59,6 +59,18 @@ public class MenuFragment extends Fragment{ if(mobile){ parent.fill(c -> c.bottom().left().addButton("", Styles.infot, ui.about::show).size(84, 45)); parent.fill(c -> c.bottom().right().addButton("", Styles.discordt, ui.discord::show).size(84, 45)); + }else if(becontrol.active()){ + parent.fill(c -> c.bottom().right().addImageTextButton("$be.check", Icon.refreshSmall, () -> { + ui.loadfrag.show(); + becontrol.checkUpdate(result -> { + ui.loadfrag.hide(); + if(!result){ + ui.showInfo("$be.noupdates"); + } + }); + }).size(200, 60).update(t -> { + t.getLabel().setColor(becontrol.isUpdateAvailable() ? Tmp.c1.set(Color.white).lerp(Pal.accent, Mathf.absin(5f, 1f)) : Color.white); + })); } String versionText = "[#ffffffba]" + ((Version.build == -1) ? "[#fc8140aa]custom build" : (Version.type.equals("official") ? Version.modifier : Version.type) + " build " + Version.build + (Version.revision == 0 ? "" : "." + Version.revision)); diff --git a/core/src/mindustry/ui/fragments/MinimapFragment.java b/core/src/mindustry/ui/fragments/MinimapFragment.java new file mode 100644 index 0000000000..d13fed8936 --- /dev/null +++ b/core/src/mindustry/ui/fragments/MinimapFragment.java @@ -0,0 +1,114 @@ +package mindustry.ui.fragments; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.math.*; +import arc.scene.*; +import arc.scene.event.*; +import arc.scene.ui.layout.*; +import mindustry.gen.*; +import mindustry.input.*; +import mindustry.ui.*; + +import static mindustry.Vars.*; + +public class MinimapFragment extends Fragment{ + private boolean shown; + private float panx, pany, zoom = 1f, lastZoom = -1; + private float baseSize = Scl.scl(5f); + private Element elem; + + @Override + public void build(Group parent){ + elem = parent.fill((x, y, w, h) -> { + w = Core.graphics.getWidth(); + h = Core.graphics.getHeight(); + float size = baseSize * zoom * world.width(); + + Draw.color(Color.black); + Fill.crect(x, y, w, h); + + if(renderer.minimap.getTexture() != null){ + Draw.color(); + float ratio = (float)renderer.minimap.getTexture().getHeight() / renderer.minimap.getTexture().getWidth(); + TextureRegion reg = Draw.wrap(renderer.minimap.getTexture()); + Draw.rect(reg, w/2f + panx*zoom, h/2f + pany*zoom, size, size * ratio); + renderer.minimap.drawEntities(w/2f + panx*zoom - size/2f, h/2f + pany*zoom - size/2f * ratio, size, size * ratio, zoom, true); + } + + Draw.reset(); + }); + + elem.visible(() -> shown); + elem.update(() -> { + elem.requestKeyboard(); + elem.requestScroll(); + elem.setFillParent(true); + elem.setBounds(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight()); + + if(Core.input.keyTap(Binding.menu)){ + shown = false; + } + }); + elem.touchable(Touchable.enabled); + + elem.addListener(new ElementGestureListener(){ + + @Override + public void zoom(InputEvent event, float initialDistance, float distance){ + if(lastZoom < 0){ + lastZoom = zoom; + } + + zoom = Mathf.clamp(distance / initialDistance * lastZoom, 0.25f, 10f); + } + + @Override + public void pan(InputEvent event, float x, float y, float deltaX, float deltaY){ + panx += deltaX / zoom; + pany += deltaY / zoom; + } + + @Override + public void touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){ + super.touchDown(event, x, y, pointer, button); + } + + @Override + public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){ + lastZoom = zoom; + } + }); + + elem.addListener(new InputListener(){ + + @Override + public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){ + zoom = Mathf.clamp(zoom - amountY / 10f * zoom, 0.25f, 10f); + return true; + } + }); + + parent.fill(t -> { + t.setFillParent(true); + t.visible(() -> shown); + t.update(() -> t.setBounds(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight())); + + t.add("$minimap").style(Styles.outlineLabel).pad(10f); + t.row(); + t.add().growY(); + t.row(); + t.addImageTextButton("$back", Icon.backSmall, () -> shown = false).size(220f, 60f).pad(10f); + }); + } + + public boolean shown(){ + return shown; + } + + public void toggle(){ + shown = !shown; + } +} diff --git a/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java b/core/src/mindustry/ui/fragments/OverlayFragment.java similarity index 80% rename from core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java rename to core/src/mindustry/ui/fragments/OverlayFragment.java index c2387d1b23..b3116b20b9 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/OverlayFragment.java +++ b/core/src/mindustry/ui/fragments/OverlayFragment.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.*; +import arc.*; +import arc.scene.event.*; +import arc.scene.ui.layout.*; +import mindustry.*; /** Fragment for displaying overlays such as block inventories. */ public class OverlayFragment{ diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java similarity index 95% rename from core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java rename to core/src/mindustry/ui/fragments/PlacementFragment.java index 2a843fd5b9..f02b0ab54f 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -1,28 +1,28 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.event.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.input.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class PlacementFragment extends Fragment{ final int rowWidth = 4; @@ -433,7 +433,7 @@ public class PlacementFragment extends Fragment{ Block getSelected(){ Block toDisplay = null; - Vector2 v = topTable.stageToLocalCoordinates(Core.input.mouse()); + Vec2 v = topTable.stageToLocalCoordinates(Core.input.mouse()); //setup hovering tile if(!Core.scene.hasMouse() && topTable.hit(v.x, v.y, false) == null){ diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/mindustry/ui/fragments/PlayerListFragment.java similarity index 88% rename from core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java rename to core/src/mindustry/ui/fragments/PlayerListFragment.java index e590b910e7..ea6f6087c1 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/mindustry/ui/fragments/PlayerListFragment.java @@ -1,20 +1,21 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.graphics.g2d.*; +import arc.scene.*; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.core.GameState.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.net.*; +import mindustry.net.Packets.*; +import mindustry.ui.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class PlayerListFragment extends Fragment{ private boolean visible = false; @@ -65,7 +66,7 @@ public class PlayerListFragment extends Fragment{ float h = 74f; - playerGroup.all().sort((p1, p2) -> p1.getTeam().compareTo(p2.getTeam())); + playerGroup.all().sort(Structs.comparing(Unit::getTeam)); playerGroup.all().each(user -> { NetConnection connection = user.con; @@ -129,7 +130,7 @@ public class PlayerListFragment extends Fragment{ t.addImageButton(Icon.zoomSmall, Styles.clearPartiali, () -> Call.onAdminRequest(user, AdminAction.trace)); }).padRight(12).size(bs + 10f, bs); - }else if((!user.isLocal && !user.isAdmin) && net.client() && playerGroup.size() >= 3){ //votekick + }else if((!user.isLocal && !user.isAdmin) && net.client() && playerGroup.size() >= 3 && player.getTeam() != user.getTeam()){ //votekick button.add().growY(); button.addImageButton(Icon.banSmall, Styles.clearPartiali, diff --git a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java similarity index 89% rename from core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java rename to core/src/mindustry/ui/fragments/ScriptConsoleFragment.java index 87b7f76d6e..378359f631 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java +++ b/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -1,22 +1,22 @@ -package io.anuke.mindustry.ui.fragments; +package mindustry.ui.fragments; -import io.anuke.arc.*; -import io.anuke.arc.Input.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.Label.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.input.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.Input.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.*; +import arc.scene.ui.*; +import arc.scene.ui.Label.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.*; +import mindustry.input.*; +import mindustry.ui.*; -import static io.anuke.arc.Core.*; -import static io.anuke.mindustry.Vars.*; +import static arc.Core.*; +import static mindustry.Vars.*; public class ScriptConsoleFragment extends Table{ private final static int messagesShown = 30; @@ -45,7 +45,7 @@ public class ScriptConsoleFragment extends Table{ font = Fonts.def; visible(() -> { - if(input.keyTap(Binding.console) && !Vars.net.client() && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ + if(input.keyTap(Binding.console) && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ shown = !shown; if(shown && !open && enableConsole){ toggle(); @@ -53,7 +53,7 @@ public class ScriptConsoleFragment extends Table{ clearChatInput(); } - return shown && !Vars.net.active(); + return shown && Vars.net.active(); }); update(() -> { diff --git a/core/src/io/anuke/mindustry/ui/layout/BranchTreeLayout.java b/core/src/mindustry/ui/layout/BranchTreeLayout.java similarity index 97% rename from core/src/io/anuke/mindustry/ui/layout/BranchTreeLayout.java rename to core/src/mindustry/ui/layout/BranchTreeLayout.java index 5f3f4b6932..07c3fb5497 100644 --- a/core/src/io/anuke/mindustry/ui/layout/BranchTreeLayout.java +++ b/core/src/mindustry/ui/layout/BranchTreeLayout.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.ui.layout; +package mindustry.ui.layout; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.geom.*; +import arc.struct.*; +import arc.math.geom.*; /** * Algorithm taken from TreeLayout. @@ -66,8 +66,8 @@ public class BranchTreeLayout implements TreeLayout{ } } - public Rectangle getBounds(){ - return new Rectangle(boundsLeft, boundsBottom, boundsRight - boundsLeft, boundsTop - boundsBottom); + public Rect getBounds(){ + return new Rect(boundsLeft, boundsBottom, boundsRight - boundsLeft, boundsTop - boundsBottom); } private void calcSizeOfLevels(TreeNode node, int level){ diff --git a/core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java b/core/src/mindustry/ui/layout/RadialTreeLayout.java similarity index 94% rename from core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java rename to core/src/mindustry/ui/layout/RadialTreeLayout.java index e0c8006cb9..65096e86f6 100644 --- a/core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java +++ b/core/src/mindustry/ui/layout/RadialTreeLayout.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.ui.layout; +package mindustry.ui.layout; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; +import arc.struct.*; +import arc.math.*; public class RadialTreeLayout implements TreeLayout{ private static ObjectSet visited = new ObjectSet<>(); diff --git a/core/src/io/anuke/mindustry/ui/layout/TreeLayout.java b/core/src/mindustry/ui/layout/TreeLayout.java similarity index 93% rename from core/src/io/anuke/mindustry/ui/layout/TreeLayout.java rename to core/src/mindustry/ui/layout/TreeLayout.java index 6b9f4556da..1a44ee708c 100644 --- a/core/src/io/anuke/mindustry/ui/layout/TreeLayout.java +++ b/core/src/mindustry/ui/layout/TreeLayout.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.ui.layout; +package mindustry.ui.layout; public interface TreeLayout{ void layout(TreeNode root); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/mindustry/world/Block.java similarity index 95% rename from core/src/io/anuke/mindustry/world/Block.java rename to core/src/mindustry/world/Block.java index a6f7769d03..a0294013ad 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -1,42 +1,42 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.Graphics.*; -import io.anuke.arc.Graphics.Cursor.*; -import io.anuke.arc.audio.*; -import io.anuke.arc.collection.EnumSet; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.g2d.TextureAtlas.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.graphics.MultiPacker.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.power.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.meta.values.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.Graphics.*; +import arc.Graphics.Cursor.*; +import arc.audio.*; +import arc.struct.EnumSet; +import arc.struct.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.graphics.g2d.TextureAtlas.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import arc.util.pooling.*; +import mindustry.ctype.*; +import mindustry.ctype.ContentType; +import mindustry.entities.*; +import mindustry.entities.effect.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.graphics.MultiPacker.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.power.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; import java.util.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Block extends BlockStorage{ public static final int crackRegions = 8, maxCrackSize = 5; @@ -55,6 +55,8 @@ public class Block extends BlockStorage{ public boolean rotate; /** whether you can break this with rightclick */ public boolean breakable; + /** whether to add this block to brokenblocks */ + public boolean rebuildable = true; /** whether this floor can be placed on. */ public boolean placeableOn = true; /** whether this block has insulating properties. */ @@ -489,7 +491,7 @@ public class Block extends BlockStorage{ /** Update table alignment after configuring.*/ public void updateTableAlign(Tile tile, Table table){ - Vector2 pos = Core.input.mouseScreen(tile.drawx(), tile.drawy() - tile.block().size * tilesize / 2f - 1); + Vec2 pos = Core.input.mouseScreen(tile.drawx(), tile.drawy() - tile.block().size * tilesize / 2f - 1); table.setPosition(pos.x, pos.y, Align.top); } @@ -864,7 +866,7 @@ public class Block extends BlockStorage{ return ((size + 1) % 2) * tilesize / 2f; } - public Rectangle bounds(int x, int y, Rectangle rect){ + public Rect bounds(int x, int y, Rect rect){ return rect.setSize(size * tilesize).setCenter(x * tilesize + offset(), y * tilesize + offset()); } diff --git a/core/src/io/anuke/mindustry/world/BlockStorage.java b/core/src/mindustry/world/BlockStorage.java similarity index 93% rename from core/src/io/anuke/mindustry/world/BlockStorage.java rename to core/src/mindustry/world/BlockStorage.java index ced126de72..20c1ca8f98 100644 --- a/core/src/io/anuke/mindustry/world/BlockStorage.java +++ b/core/src/mindustry/world/BlockStorage.java @@ -1,21 +1,21 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.arc.collection.Array; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.*; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.effect.Puddle; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.ctype.UnlockableContent; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.consumers.Consumers; -import io.anuke.mindustry.world.meta.BlockBars; -import io.anuke.mindustry.world.meta.BlockStats; +import arc.struct.Array; +import arc.math.Mathf; +import arc.math.geom.Vec2; +import arc.util.*; +import mindustry.Vars; +import mindustry.content.Fx; +import mindustry.entities.Effects; +import mindustry.entities.effect.Puddle; +import mindustry.entities.type.TileEntity; +import mindustry.entities.type.Unit; +import mindustry.ctype.UnlockableContent; +import mindustry.type.Item; +import mindustry.type.Liquid; +import mindustry.world.consumers.Consumers; +import mindustry.world.meta.BlockBars; +import mindustry.world.meta.BlockStats; public abstract class BlockStorage extends UnlockableContent{ public boolean hasItems; @@ -83,7 +83,7 @@ public abstract class BlockStorage extends UnlockableContent{ } /** Returns offset for stack placement. */ - public void getStackOffset(Item item, Tile tile, Vector2 trns){ + public void getStackOffset(Item item, Tile tile, Vec2 trns){ } diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/mindustry/world/Build.java similarity index 81% rename from core/src/io/anuke/mindustry/world/Build.java rename to core/src/mindustry/world/Build.java index 276caefba7..b8d41df4f0 100644 --- a/core/src/io/anuke/mindustry/world/Build.java +++ b/core/src/mindustry/world/Build.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.Core; -import io.anuke.arc.Events; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.*; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.game.EventType.BlockBuildBeginEvent; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.world.blocks.BuildBlock; -import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; +import mindustry.annotations.Annotations.Loc; +import mindustry.annotations.Annotations.Remote; +import arc.Core; +import arc.Events; +import arc.math.Mathf; +import arc.math.geom.*; +import mindustry.content.Blocks; +import mindustry.entities.Units; +import mindustry.game.EventType.BlockBuildBeginEvent; +import mindustry.game.Team; +import mindustry.world.blocks.BuildBlock; +import mindustry.world.blocks.BuildBlock.BuildEntity; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Build{ @@ -38,7 +38,7 @@ public class Build{ Block previous = tile.block(); Block sub = BuildBlock.get(previous.size); - world.setBlock(tile, sub, team, rotation); + tile.set(sub, team, rotation); tile.ent().setDeconstruct(previous); tile.entity.health = tile.entity.maxHealth() * prevPercent; @@ -60,7 +60,7 @@ public class Build{ Block previous = tile.block(); Block sub = BuildBlock.get(result.size); - world.setBlock(tile, sub, team, rotation); + tile.set(sub, team, rotation); tile.ent().setConstruct(previous, result); Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, false))); @@ -72,7 +72,7 @@ public class Build{ return false; } - if(state.rules.bannedBlocks.contains(type) && !(state.rules.waves && team == waveTeam)){ + if(state.rules.bannedBlocks.contains(type) && !(state.rules.waves && team == state.rules.waveTeam)){ return false; } @@ -80,13 +80,8 @@ public class Build{ return false; } - //check for enemy cores - for(Team enemy : state.teams.enemiesOf(team)){ - for(Tile core : state.teams.get(enemy).cores){ - if(Mathf.dst(x * tilesize + type.offset(), y * tilesize + type.offset(), core.drawx(), core.drawy()) < state.rules.enemyCoreBuildRadius + type.size * tilesize / 2f){ - return false; - } - } + if(state.teams.eachEnemyCore(team, core -> Mathf.dst(x * tilesize + type.offset(), y * tilesize + type.offset(), core.x, core.y) < state.rules.enemyCoreBuildRadius + type.size * tilesize / 2f)){ + return false; } Tile tile = world.tile(x, y); diff --git a/core/src/io/anuke/mindustry/world/CachedTile.java b/core/src/mindustry/world/CachedTile.java similarity index 82% rename from core/src/io/anuke/mindustry/world/CachedTile.java rename to core/src/mindustry/world/CachedTile.java index dde20ba3be..281828dcd7 100644 --- a/core/src/io/anuke/mindustry/world/CachedTile.java +++ b/core/src/mindustry/world/CachedTile.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.world.modules.*; +import mindustry.entities.type.TileEntity; +import mindustry.game.Team; +import mindustry.world.modules.*; /** * A tile which does not trigger change events and whose entity types are cached. @@ -16,7 +16,7 @@ public class CachedTile extends Tile{ @Override public Team getTeam(){ - return Team.all[getTeamID()]; + return Team.get(getTeamID()); } @Override diff --git a/core/src/io/anuke/mindustry/world/DirectionalItemBuffer.java b/core/src/mindustry/world/DirectionalItemBuffer.java similarity index 88% rename from core/src/io/anuke/mindustry/world/DirectionalItemBuffer.java rename to core/src/mindustry/world/DirectionalItemBuffer.java index 2f5d7538b6..5c57376fa1 100644 --- a/core/src/io/anuke/mindustry/world/DirectionalItemBuffer.java +++ b/core/src/mindustry/world/DirectionalItemBuffer.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.annotations.Annotations.Struct; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.gen.BufferItem; -import io.anuke.mindustry.type.Item; +import mindustry.annotations.Annotations.Struct; +import arc.util.Time; +import mindustry.gen.BufferItem; +import mindustry.type.Item; import java.io.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class DirectionalItemBuffer{ public final long[][] buffers; diff --git a/core/src/io/anuke/mindustry/world/Edges.java b/core/src/mindustry/world/Edges.java similarity index 90% rename from core/src/io/anuke/mindustry/world/Edges.java rename to core/src/mindustry/world/Edges.java index 623dd1d434..86d6e31449 100644 --- a/core/src/io/anuke/mindustry/world/Edges.java +++ b/core/src/mindustry/world/Edges.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.*; +import arc.math.Mathf; +import arc.math.geom.*; import java.util.Arrays; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.world; public class Edges{ private static final int maxSize = 11; private static final int maxRadius = 12; private static Point2[][] edges = new Point2[maxSize][0]; private static Point2[][] edgeInside = new Point2[maxSize][0]; - private static Vector2[][] polygons = new Vector2[maxRadius * 2][0]; + private static Vec2[][] polygons = new Vec2[maxRadius * 2][0]; static{ for(int i = 0; i < maxRadius * 2; i++){ @@ -60,7 +60,7 @@ public class Edges{ tiley + Mathf.clamp(other.y - tiley, -(size - 1) / 2, (size / 2))); } - public static Vector2[] getPixelPolygon(float radius){ + public static Vec2[] getPixelPolygon(float radius){ if(radius < 1 || radius > maxRadius) throw new RuntimeException("Polygon size must be between 1 and " + maxRadius); return polygons[(int)(radius * 2) - 1]; diff --git a/core/src/io/anuke/mindustry/world/ItemBuffer.java b/core/src/mindustry/world/ItemBuffer.java similarity index 93% rename from core/src/io/anuke/mindustry/world/ItemBuffer.java rename to core/src/mindustry/world/ItemBuffer.java index 9c058ce50c..20f414403f 100644 --- a/core/src/io/anuke/mindustry/world/ItemBuffer.java +++ b/core/src/mindustry/world/ItemBuffer.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.arc.util.*; -import io.anuke.mindustry.type.Item; +import arc.util.*; +import mindustry.type.Item; import java.io.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class ItemBuffer{ private final float speed; diff --git a/core/src/io/anuke/mindustry/world/LegacyColorMapper.java b/core/src/mindustry/world/LegacyColorMapper.java similarity index 90% rename from core/src/io/anuke/mindustry/world/LegacyColorMapper.java rename to core/src/mindustry/world/LegacyColorMapper.java index e57e99eb3a..8f3f80e953 100644 --- a/core/src/io/anuke/mindustry/world/LegacyColorMapper.java +++ b/core/src/mindustry/world/LegacyColorMapper.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.arc.collection.IntMap; -import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.world.blocks.Floor; +import arc.struct.IntMap; +import arc.graphics.Color; +import mindustry.content.Blocks; +import mindustry.ctype.ContentList; +import mindustry.world.blocks.Floor; public class LegacyColorMapper implements ContentList{ private static IntMap blockMap = new IntMap<>(); diff --git a/core/src/io/anuke/mindustry/world/Pos.java b/core/src/mindustry/world/Pos.java similarity index 94% rename from core/src/io/anuke/mindustry/world/Pos.java rename to core/src/mindustry/world/Pos.java index 97a4d560b8..995e7a0d77 100644 --- a/core/src/io/anuke/mindustry/world/Pos.java +++ b/core/src/mindustry/world/Pos.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world; +package mindustry.world; /** Methods for a packed position 'struct', contained in an int. */ public class Pos{ diff --git a/core/src/io/anuke/mindustry/world/StaticTree.java b/core/src/mindustry/world/StaticTree.java similarity index 80% rename from core/src/io/anuke/mindustry/world/StaticTree.java rename to core/src/mindustry/world/StaticTree.java index be6b6c4c76..1eeb3f89c2 100644 --- a/core/src/io/anuke/mindustry/world/StaticTree.java +++ b/core/src/mindustry/world/StaticTree.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.util.Tmp; -import io.anuke.mindustry.world.blocks.StaticWall; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.util.Tmp; +import mindustry.world.blocks.StaticWall; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class StaticTree extends StaticWall{ diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java similarity index 87% rename from core/src/io/anuke/mindustry/world/Tile.java rename to core/src/mindustry/world/Tile.java index b3b82a3c45..fe319fd02e 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.world; +package mindustry.world; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.modules.*; +import arc.struct.*; +import arc.func.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.ArcAnnotate.*; +import mindustry.content.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.blocks.*; +import mindustry.world.modules.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Tile implements Position, TargetTrait{ /** Tile traversal cost. */ @@ -142,11 +142,11 @@ public class Tile implements Position, TargetTrait{ @Override public Team getTeam(){ - return Team.all[link().team]; + return Team.get(link().team); } public void setTeam(Team team){ - this.team = (byte)team.ordinal(); + this.team = (byte) team.id; } public byte getTeamID(){ @@ -156,7 +156,7 @@ public class Tile implements Position, TargetTrait{ public void setBlock(@NonNull Block type, Team team, int rotation){ preChanged(); this.block = type; - this.team = (byte)team.ordinal(); + this.team = (byte) team.id; this.rotation = (byte)Mathf.mod(rotation, 4); changed(); } @@ -186,6 +186,35 @@ public class Tile implements Position, TargetTrait{ setOverlay(overlay); } + public void remove(){ + link().getLinkedTiles(other -> other.setBlock(Blocks.air)); + } + + public void set(Block block, Team team){ + set(block, team, 0); + } + + public void set(Block block, Team team, int rotation){ + setBlock(block, team, rotation); + if(block.isMultiblock()){ + int offsetx = -(block.size - 1) / 2; + int offsety = -(block.size - 1) / 2; + + for(int dx = 0; dx < block.size; dx++){ + for(int dy = 0; dy < block.size; dy++){ + int worldx = dx + offsetx + x; + int worldy = dy + offsety + y; + if(!(worldx == x && worldy == y)){ + Tile toplace = world.tile(worldx, worldy); + if(toplace != null){ + toplace.setBlock(BlockPart.get(dx + offsetx, dy + offsety), team); + } + } + } + } + } + } + public byte rotation(){ return rotation; } @@ -228,7 +257,7 @@ public class Tile implements Position, TargetTrait{ } public boolean solid(){ - return block.solid || block.isSolidFor(this) || (isLinked() && link().solid()); + return block.solid || block.isSolidFor(this) || (isLinked() && link() != this && link().solid()); } public boolean breakable(){ @@ -240,7 +269,7 @@ public class Tile implements Position, TargetTrait{ } public boolean isEnemyCheat(){ - return getTeam() == waveTeam && state.rules.enemyCheat; + return getTeam() == state.rules.waveTeam && state.rules.enemyCheat; } public boolean isLinked(){ @@ -298,7 +327,7 @@ public class Tile implements Position, TargetTrait{ return tmpArray; } - public Rectangle getHitbox(Rectangle rect){ + public Rect getHitbox(Rect rect){ return rect.setSize(block().size * tilesize).setCenter(drawx(), drawy()); } @@ -344,10 +373,10 @@ public class Tile implements Position, TargetTrait{ } public boolean interactable(Team team){ - return getTeam() == Team.derelict || team == getTeam(); + return state.teams.canInteract(team, getTeam()); } - public Item drop(){ + public @Nullable Item drop(){ return overlay == Blocks.air || overlay.itemDrop == null ? floor.itemDrop : overlay.itemDrop; } @@ -449,8 +478,8 @@ public class Tile implements Position, TargetTrait{ } @Override - public Vector2 velocity(){ - return Vector2.ZERO; + public Vec2 velocity(){ + return Vec2.ZERO; } @Override diff --git a/core/src/io/anuke/mindustry/world/WorldContext.java b/core/src/mindustry/world/WorldContext.java similarity index 94% rename from core/src/io/anuke/mindustry/world/WorldContext.java rename to core/src/mindustry/world/WorldContext.java index ceaa528b77..03a6cccea7 100644 --- a/core/src/io/anuke/mindustry/world/WorldContext.java +++ b/core/src/mindustry/world/WorldContext.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world; +package mindustry.world; public interface WorldContext{ diff --git a/core/src/io/anuke/mindustry/world/blocks/Attributes.java b/core/src/mindustry/world/blocks/Attributes.java similarity index 75% rename from core/src/io/anuke/mindustry/world/blocks/Attributes.java rename to core/src/mindustry/world/blocks/Attributes.java index ce343a852c..487b093314 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Attributes.java +++ b/core/src/mindustry/world/blocks/Attributes.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.mindustry.world.meta.Attribute; +import mindustry.world.meta.Attribute; public class Attributes{ private float[] array = new float[Attribute.values().length]; diff --git a/core/src/io/anuke/mindustry/world/blocks/Autotiler.java b/core/src/mindustry/world/blocks/Autotiler.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/Autotiler.java rename to core/src/mindustry/world/blocks/Autotiler.java index 29e99361a4..4c25ca170d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Autotiler.java +++ b/core/src/mindustry/world/blocks/Autotiler.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.world.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.world.*; import java.util.*; diff --git a/core/src/io/anuke/mindustry/world/blocks/BlockPart.java b/core/src/mindustry/world/blocks/BlockPart.java similarity index 91% rename from core/src/io/anuke/mindustry/world/blocks/BlockPart.java rename to core/src/mindustry/world/blocks/BlockPart.java index 633685f1d4..ef2b3d1c38 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BlockPart.java +++ b/core/src/mindustry/world/blocks/BlockPart.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import mindustry.type.Item; +import mindustry.type.Liquid; +import mindustry.world.Block; +import mindustry.world.Tile; /** * Used for multiblocks. Each block that is not the center of the multiblock is a part. diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/mindustry/world/blocks/BuildBlock.java similarity index 91% rename from core/src/io/anuke/mindustry/world/blocks/BuildBlock.java rename to core/src/mindustry/world/blocks/BuildBlock.java index 4623857790..14187850ba 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/mindustry/world/blocks/BuildBlock.java @@ -1,30 +1,30 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.Graphics.*; -import io.anuke.arc.Graphics.Cursor.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.modules.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.Graphics.*; +import arc.Graphics.Cursor.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.effect.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.modules.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class BuildBlock extends Block{ public static final int maxSize = 9; @@ -57,7 +57,7 @@ public class BuildBlock extends Block{ public static void onDeconstructFinish(Tile tile, Block block, int builderID){ Team team = tile.getTeam(); Effects.effect(Fx.breakBlock, tile.drawx(), tile.drawy(), block.size); - world.removeBlock(tile); + tile.remove(); Events.fire(new BlockBuildEndEvent(tile, playerGroup.getByID(builderID), team, true)); if(shouldPlay()) Sounds.breaks.at(tile, calcPitch(false)); } @@ -66,7 +66,7 @@ public class BuildBlock extends Block{ public static void onConstructFinish(Tile tile, Block block, int builderID, byte rotation, Team team, boolean skipConfig){ if(tile == null) return; float healthf = tile.entity == null ? 1f : tile.entity.healthf(); - world.setBlock(tile, block, team, rotation); + tile.set(block, team, rotation); if(tile.entity != null){ tile.entity.health = block.health * healthf; } @@ -125,7 +125,7 @@ public class BuildBlock extends Block{ @Override public TextureRegion getDisplayIcon(Tile tile){ BuildEntity entity = tile.ent(); - return (entity.cblock == null ? entity.previous : entity.cblock).icon(io.anuke.mindustry.ui.Cicon.full); + return (entity.cblock == null ? entity.previous : entity.cblock).icon(mindustry.ui.Cicon.full); } @Override @@ -171,9 +171,9 @@ public class BuildBlock extends Block{ return; } - if(entity.previous == null) return; + if(entity.previous == null || entity.cblock == null) return; - if(Core.atlas.isFound(entity.previous.icon(io.anuke.mindustry.ui.Cicon.full))){ + if(Core.atlas.isFound(entity.previous.icon(Cicon.full))){ Draw.rect(entity.previous.icon(Cicon.full), tile.drawx(), tile.drawy(), entity.previous.rotate ? tile.rotation() * 90 : 0); } } @@ -257,7 +257,7 @@ public class BuildBlock extends Block{ if(cblock != null){ ItemStack[] requirements = cblock.requirements; if(requirements.length != accumulator.length || totalAccumulator.length != requirements.length){ - setDeconstruct(previous); + setDeconstruct(cblock); } //make sure you take into account that you can't deconstruct more than there is deconstructed @@ -337,16 +337,17 @@ public class BuildBlock extends Block{ } public void setDeconstruct(Block previous){ + if(previous == null) return; this.previous = previous; this.progress = 1f; if(previous.buildCost >= 0.01f){ this.cblock = previous; - this.accumulator = new float[previous.requirements.length]; - this.totalAccumulator = new float[previous.requirements.length]; this.buildCost = previous.buildCost * state.rules.buildCostMultiplier; }else{ this.buildCost = 20f; //default no-requirement build cost is 20 } + this.accumulator = new float[previous.requirements.length]; + this.totalAccumulator = new float[previous.requirements.length]; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/DoubleOverlayFloor.java b/core/src/mindustry/world/blocks/DoubleOverlayFloor.java similarity index 77% rename from core/src/io/anuke/mindustry/world/blocks/DoubleOverlayFloor.java rename to core/src/mindustry/world/blocks/DoubleOverlayFloor.java index 7a0a26847d..45d156c164 100644 --- a/core/src/io/anuke/mindustry/world/blocks/DoubleOverlayFloor.java +++ b/core/src/mindustry/world/blocks/DoubleOverlayFloor.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.world.Tile; +import arc.graphics.g2d.Draw; +import arc.math.Mathf; +import mindustry.world.Tile; public class DoubleOverlayFloor extends OverlayFloor{ diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/mindustry/world/blocks/Floor.java similarity index 92% rename from core/src/io/anuke/mindustry/world/blocks/Floor.java rename to core/src/mindustry/world/blocks/Floor.java index 3ed6edf0d4..4faf2adbe0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/mindustry/world/blocks/Floor.java @@ -1,21 +1,21 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.g2d.TextureAtlas.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.graphics.MultiPacker.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.graphics.g2d.TextureAtlas.*; +import arc.math.*; +import arc.math.geom.*; +import mindustry.content.*; +import mindustry.entities.Effects.*; +import mindustry.graphics.*; +import mindustry.graphics.MultiPacker.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class Floor extends Block{ /** number of different variant regions to use */ diff --git a/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java b/core/src/mindustry/world/blocks/ItemSelection.java similarity index 71% rename from core/src/io/anuke/mindustry/world/blocks/ItemSelection.java rename to core/src/mindustry/world/blocks/ItemSelection.java index 26e4a3d5c9..8fe4994d5b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java +++ b/core/src/mindustry/world/blocks/ItemSelection.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; +import arc.struct.*; +import arc.func.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ItemSelection{ diff --git a/core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java b/core/src/mindustry/world/blocks/LiquidBlock.java similarity index 79% rename from core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java rename to core/src/mindustry/world/blocks/LiquidBlock.java index f7b4b9566c..91cb843283 100644 --- a/core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java +++ b/core/src/mindustry/world/blocks/LiquidBlock.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockGroup; -import io.anuke.mindustry.world.modules.LiquidModule; +import arc.Core; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.meta.BlockGroup; +import mindustry.world.modules.LiquidModule; public class LiquidBlock extends Block{ protected TextureRegion liquidRegion, bottomRegion, topRegion; diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/mindustry/world/blocks/OreBlock.java similarity index 84% rename from core/src/io/anuke/mindustry/world/blocks/OreBlock.java rename to core/src/mindustry/world/blocks/OreBlock.java index 7270ec7aa0..f6c25ef06c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/mindustry/world/blocks/OreBlock.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.graphics.MultiPacker.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import mindustry.graphics.*; +import mindustry.graphics.MultiPacker.*; +import mindustry.type.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; /**An overlay ore for a specific item type.*/ public class OreBlock extends OverlayFloor{ diff --git a/core/src/io/anuke/mindustry/world/blocks/OverlayFloor.java b/core/src/mindustry/world/blocks/OverlayFloor.java similarity index 70% rename from core/src/io/anuke/mindustry/world/blocks/OverlayFloor.java rename to core/src/mindustry/world/blocks/OverlayFloor.java index a2527e6a67..28c5e81983 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OverlayFloor.java +++ b/core/src/mindustry/world/blocks/OverlayFloor.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.world.Tile; +import arc.graphics.g2d.Draw; +import arc.math.Mathf; +import mindustry.world.Tile; /**A type of floor that is overlaid on top of over floors.*/ public class OverlayFloor extends Floor{ diff --git a/core/src/io/anuke/mindustry/world/blocks/PowerBlock.java b/core/src/mindustry/world/blocks/PowerBlock.java similarity index 63% rename from core/src/io/anuke/mindustry/world/blocks/PowerBlock.java rename to core/src/mindustry/world/blocks/PowerBlock.java index 83e550a7e4..3312267635 100644 --- a/core/src/io/anuke/mindustry/world/blocks/PowerBlock.java +++ b/core/src/mindustry/world/blocks/PowerBlock.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.meta.BlockGroup; +import mindustry.world.Block; +import mindustry.world.meta.BlockGroup; public abstract class PowerBlock extends Block{ diff --git a/core/src/io/anuke/mindustry/world/blocks/RespawnBlock.java b/core/src/mindustry/world/blocks/RespawnBlock.java similarity index 87% rename from core/src/io/anuke/mindustry/world/blocks/RespawnBlock.java rename to core/src/mindustry/world/blocks/RespawnBlock.java index 8171535184..b27b0af621 100644 --- a/core/src/io/anuke/mindustry/world/blocks/RespawnBlock.java +++ b/core/src/mindustry/world/blocks/RespawnBlock.java @@ -1,13 +1,14 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.entities.type.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.net; +import static mindustry.Vars.net; public class RespawnBlock{ @@ -20,7 +21,7 @@ public class RespawnBlock{ Draw.reset(); if(player != null){ - TextureRegion region = player.getIconRegion(); + TextureRegion region = to.icon(Cicon.full); Draw.color(0f, 0f, 0f, 0.4f * progress); Draw.rect("circle-shadow", tile.drawx(), tile.drawy(), region.getWidth() / 3f, region.getWidth() / 3f); diff --git a/core/src/io/anuke/mindustry/world/blocks/Rock.java b/core/src/mindustry/world/blocks/Rock.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/Rock.java rename to core/src/mindustry/world/blocks/Rock.java index a178ce74f0..235dd24ee6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Rock.java +++ b/core/src/mindustry/world/blocks/Rock.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import arc.Core; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; +import mindustry.world.Block; +import mindustry.world.Tile; public class Rock extends Block{ protected int variants; diff --git a/core/src/io/anuke/mindustry/world/blocks/StaticWall.java b/core/src/mindustry/world/blocks/StaticWall.java similarity index 70% rename from core/src/io/anuke/mindustry/world/blocks/StaticWall.java rename to core/src/mindustry/world/blocks/StaticWall.java index 0797fee02a..531fb010a2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/StaticWall.java +++ b/core/src/mindustry/world/blocks/StaticWall.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.graphics.CacheLayer; -import io.anuke.mindustry.world.*; +import arc.Core; +import arc.graphics.g2d.*; +import arc.math.Mathf; +import mindustry.graphics.CacheLayer; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class StaticWall extends Rock{ TextureRegion large; @@ -43,9 +43,9 @@ public class StaticWall extends Rock{ boolean eq(int rx, int ry){ return rx < world.width() - 1 && ry < world.height() - 1 - && world.tile(rx + 1, ry).block() == this - && world.tile(rx, ry + 1).block() == this - && world.tile(rx, ry).block() == this - && world.tile(rx + 1, ry + 1).block() == this; + && world.tile(rx + 1, ry).block() == this + && world.tile(rx, ry + 1).block() == this + && world.tile(rx, ry).block() == this + && world.tile(rx + 1, ry + 1).block() == this; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/TreeBlock.java b/core/src/mindustry/world/blocks/TreeBlock.java similarity index 62% rename from core/src/io/anuke/mindustry/world/blocks/TreeBlock.java rename to core/src/mindustry/world/blocks/TreeBlock.java index 11d110fc31..6ce0ca84d8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/TreeBlock.java +++ b/core/src/mindustry/world/blocks/TreeBlock.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.blocks; +package mindustry.world.blocks; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.graphics.Layer; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import arc.graphics.g2d.Draw; +import arc.math.Mathf; +import mindustry.graphics.Layer; +import mindustry.world.Block; +import mindustry.world.Tile; public class TreeBlock extends Block{ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java b/core/src/mindustry/world/blocks/defense/DeflectorWall.java similarity index 70% rename from core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java rename to core/src/mindustry/world/blocks/defense/DeflectorWall.java index 3cc6d177f0..ae535ca8a6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java +++ b/core/src/mindustry/world/blocks/defense/DeflectorWall.java @@ -1,22 +1,22 @@ -package io.anuke.mindustry.world.blocks.defense; +package mindustry.world.blocks.defense; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.world.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.entities.type.*; +import mindustry.entities.type.Bullet; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class DeflectorWall extends Wall{ public static final float hitTime = 10f; protected float maxDamageDeflect = 10f; - protected Rectangle rect = new Rectangle(); - protected Rectangle rect2 = new Rectangle(); + protected Rect rect = new Rect(); + protected Rect rect2 = new Rect(); public DeflectorWall(String name){ super(name); @@ -52,7 +52,7 @@ public class DeflectorWall extends Wall{ bullet.hitbox(rect2); - Vector2 position = Geometry.raycastRect(bullet.x - bullet.velocity().x*Time.delta(), bullet.y - bullet.velocity().y*Time.delta(), bullet.x + bullet.velocity().x*Time.delta(), bullet.y + bullet.velocity().y*Time.delta(), + Vec2 position = Geometry.raycastRect(bullet.x - bullet.velocity().x*Time.delta(), bullet.y - bullet.velocity().y*Time.delta(), bullet.x + bullet.velocity().x*Time.delta(), bullet.y + bullet.velocity().y*Time.delta(), rect.setSize(size * tilesize + rect2.width*2 + rect2.height*2).setCenter(entity.x, entity.y)); if(position != null){ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java b/core/src/mindustry/world/blocks/defense/Door.java similarity index 79% rename from core/src/io/anuke/mindustry/world/blocks/defense/Door.java rename to core/src/mindustry/world/blocks/defense/Door.java index e8bfd2c4b4..df75416207 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java +++ b/core/src/mindustry/world/blocks/defense/Door.java @@ -1,24 +1,24 @@ -package io.anuke.mindustry.world.blocks.defense; +package mindustry.world.blocks.defense; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.Graphics.*; -import io.anuke.arc.Graphics.Cursor.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.geom.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.world.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.Graphics.*; +import arc.Graphics.Cursor.*; +import arc.graphics.g2d.*; +import arc.math.geom.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Door extends Wall{ - protected final static Rectangle rect = new Rectangle(); + protected final static Rect rect = new Rect(); public final int timerToggle = timers++; public Effect openfx = Fx.dooropen; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java similarity index 83% rename from core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java rename to core/src/mindustry/world/blocks/defense/ForceProjector.java index 466d677b6c..36ed812b5d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -1,24 +1,25 @@ -package io.anuke.mindustry.world.blocks.defense; +package mindustry.world.blocks.defense; -import io.anuke.arc.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.BaseEntity; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.entities.type.BaseEntity; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ForceProjector extends Block{ public final int timerUse = timers++; @@ -37,7 +38,7 @@ public class ForceProjector extends Block{ private static ForceProjector paramBlock; private static ForceEntity paramEntity; private static Cons shieldConsumer = trait -> { - if(trait.canBeAbsorbed() && trait.getTeam() != paramTile.getTeam() && paramBlock.isInsideHexagon(trait.getX(), trait.getY(), paramBlock.realRadius(paramEntity) * 2f, paramTile.drawx(), paramTile.drawy())){ + if(trait.canBeAbsorbed() && trait.getTeam() != paramTile.getTeam() && Intersector.isInsideHexagon(trait.getX(), trait.getY(), paramBlock.realRadius(paramEntity) * 2f, paramTile.drawx(), paramTile.drawy())){ trait.absorb(); Effects.effect(Fx.absorb, trait); paramEntity.hit = 1f; @@ -111,17 +112,6 @@ public class ForceProjector extends Block{ entity.warmup = Mathf.lerpDelta(entity.warmup, entity.efficiency(), 0.1f); -/* - if(entity.power.status < relativePowerDraw){ - entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.15f); - entity.power.status = 0f; - if(entity.warmup <= 0.09f){ - entity.broken = true; - } - }else{ - entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, 0.1f); - }*/ - if(entity.buildup > 0){ float scale = !entity.broken ? cooldownNormal : cooldownBrokenBase; ConsumeLiquidFilter cons = consumes.get(ConsumeType.liquid); @@ -159,13 +149,6 @@ public class ForceProjector extends Block{ return (radius + entity.phaseHeat * phaseRadiusBoost) * entity.radscl; } - boolean isInsideHexagon(float x0, float y0, float d, float x, float y){ - float dx = Math.abs(x - x0) / d; - float dy = Math.abs(y - y0) / d; - float a = 0.25f * Mathf.sqrt3; - return (dy <= a) && (a * dx + 0.25 * dy <= 0.5 * a); - } - @Override public void draw(Tile tile){ super.draw(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java similarity index 90% rename from core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java rename to core/src/mindustry/world/blocks/defense/MendProjector.java index a19d536018..30ea5fbda7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -1,21 +1,21 @@ -package io.anuke.mindustry.world.blocks.defense; +package mindustry.world.blocks.defense; -import io.anuke.arc.Core; -import io.anuke.arc.collection.IntSet; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.Core; +import arc.struct.IntSet; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.math.Mathf; +import arc.util.*; +import mindustry.content.Fx; +import mindustry.entities.Effects; +import mindustry.entities.type.TileEntity; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MendProjector extends Block{ private static final IntSet healed = new IntSet(); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java similarity index 91% rename from core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java rename to core/src/mindustry/world/blocks/defense/OverdriveProjector.java index 84e88b2f22..945aeb3602 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.world.blocks.defense; +package mindustry.world.blocks.defense; -import io.anuke.arc.Core; -import io.anuke.arc.collection.IntSet; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.Core; +import arc.struct.IntSet; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.math.Mathf; +import arc.util.Time; +import mindustry.entities.type.TileEntity; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class OverdriveProjector extends Block{ private static final IntSet healed = new IntSet(); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java b/core/src/mindustry/world/blocks/defense/ShockMine.java similarity index 74% rename from core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java rename to core/src/mindustry/world/blocks/defense/ShockMine.java index de72043c7d..61864556b8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java +++ b/core/src/mindustry/world/blocks/defense/ShockMine.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.world.blocks.defense; +package mindustry.world.blocks.defense; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Fill; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.entities.effect.Lightning; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.graphics.Layer; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.math.Mathf; +import mindustry.entities.effect.Lightning; +import mindustry.entities.type.Unit; +import mindustry.graphics.Layer; +import mindustry.graphics.Pal; +import mindustry.world.Block; +import mindustry.world.Tile; public class ShockMine extends Block{ public final int timerDamage = timers++; @@ -26,6 +26,7 @@ public class ShockMine extends Block{ solid = false; targetable = false; layer = Layer.overlay; + rebuildable = false; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java b/core/src/mindustry/world/blocks/defense/SurgeWall.java similarity index 66% rename from core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java rename to core/src/mindustry/world/blocks/defense/SurgeWall.java index a1c52ac823..d679169c8b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java +++ b/core/src/mindustry/world/blocks/defense/SurgeWall.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.blocks.defense; +package mindustry.world.blocks.defense; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.entities.effect.Lightning; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.graphics.Pal; +import arc.math.Mathf; +import mindustry.entities.type.Bullet; +import mindustry.entities.effect.Lightning; +import mindustry.entities.type.TileEntity; +import mindustry.graphics.Pal; public class SurgeWall extends Wall{ public float lightningChance = 0.05f; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java b/core/src/mindustry/world/blocks/defense/Wall.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/defense/Wall.java rename to core/src/mindustry/world/blocks/defense/Wall.java index 8b60ffd0f2..d790e3f299 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.world.blocks.defense; +package mindustry.world.blocks.defense; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockGroup; +import arc.Core; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.meta.BlockGroup; public class Wall extends Block{ public int variants = 0; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java similarity index 69% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java index 433987d2c6..a74e4abf94 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.mindustry.entities.Predict; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.world.Tile; +import arc.math.Mathf; +import arc.math.geom.Vec2; +import mindustry.entities.Predict; +import mindustry.entities.type.Bullet; +import mindustry.entities.bullet.BulletType; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; /** * Artillery turrets have special shooting calculations done to hit targets. @@ -31,7 +31,7 @@ public class ArtilleryTurret extends ItemTurret{ tr.trns(entity.rotation, size * tilesize / 2); - Vector2 predict = Predict.intercept(tile, entity.target, type.speed); + Vec2 predict = Predict.intercept(tile, entity.target, type.speed); float dst = entity.dst(predict.x, predict.y); float maxTraveled = type.lifetime * type.speed; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java b/core/src/mindustry/world/blocks/defense/turrets/BurstTurret.java similarity index 74% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/BurstTurret.java index 3661ec175c..06d91c8ee6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/BurstTurret.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.world.Tile; +import arc.math.Mathf; +import arc.util.Time; +import mindustry.entities.bullet.BulletType; +import mindustry.world.Tile; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class BurstTurret extends ItemTurret{ public float burstSpacing = 5; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ChargeTurret.java similarity index 81% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/ChargeTurret.java index dc12e2425f..9f4b3c8ee2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ChargeTurret.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.world.*; +import arc.math.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.bullet.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class ChargeTurret extends PowerTurret{ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java b/core/src/mindustry/world/blocks/defense/turrets/CooledTurret.java similarity index 76% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/CooledTurret.java index 9e48e3fc3a..078e626009 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/CooledTurret.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.meta.values.*; +import arc.*; +import arc.math.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.game.EventType.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class CooledTurret extends Turret{ /** How much reload is lowered by for each unit of liquid of heat capacity. */ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java b/core/src/mindustry/world/blocks/defense/turrets/DoubleTurret.java similarity index 69% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/DoubleTurret.java index 70be09ad4a..2065c0bdcd 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/DoubleTurret.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; +import arc.math.Mathf; +import mindustry.entities.bullet.BulletType; +import mindustry.world.Tile; +import mindustry.world.meta.BlockStat; +import mindustry.world.meta.StatUnit; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class DoubleTurret extends ItemTurret{ public float shotWidth = 2f; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java similarity index 88% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java index 393e102d7a..b40b8d58b6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -1,25 +1,25 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.meta.values.*; +import arc.*; +import arc.struct.*; +import arc.scene.ui.layout.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.bullet.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ItemTurret extends CooledTurret{ public int maxAmmo = 30; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java similarity index 87% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java index 422b5b57b8..7a37c7af2b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.meta.values.*; +import arc.math.*; +import arc.util.*; +import mindustry.entities.*; +import mindustry.entities.bullet.*; +import mindustry.entities.type.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class LaserTurret extends PowerTurret{ public float firingMoveFract = 0.25f; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java similarity index 79% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 7192ba09fe..42336ea1d9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -1,26 +1,30 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.collection.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.entities.effect.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.meta.values.*; +import arc.*; +import arc.graphics.g2d.*; +import arc.struct.*; +import mindustry.entities.*; +import mindustry.entities.bullet.*; +import mindustry.entities.effect.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class LiquidTurret extends Turret{ public ObjectMap ammo = new ObjectMap<>(); + public int liquidRegion; public LiquidTurret(String name){ super(name); hasLiquids = true; activeSound = Sounds.spray; + liquidRegion = reg("-liquid"); } /** Initializes accepted ammo map. Format: [liquid1, bullet1, liquid2, bullet2...] */ @@ -28,6 +32,19 @@ public class LiquidTurret extends Turret{ ammo = OrderedMap.of(objects); } + @Override + public void drawLayer(Tile tile){ + super.drawLayer(tile); + TurretEntity entity = tile.ent(); + + if(Core.atlas.isFound(reg(liquidRegion))){ + Draw.color(entity.liquids.current().color); + Draw.alpha(entity.liquids.total() / liquidCapacity); + Draw.rect(reg(liquidRegion), tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); + Draw.color(); + } + } + @Override public void setStats(){ super.setStats(); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java rename to core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java index 1eab2079a8..35b11319b8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; +import arc.util.ArcAnnotate.*; +import mindustry.entities.bullet.BulletType; +import mindustry.world.Tile; +import mindustry.world.meta.BlockStat; +import mindustry.world.meta.StatUnit; public class PowerTurret extends CooledTurret{ public @NonNull BulletType shootType; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java similarity index 88% rename from core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java rename to core/src/mindustry/world/blocks/defense/turrets/Turret.java index e6c3b129d4..75ca4bcf2d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -1,31 +1,31 @@ -package io.anuke.mindustry.world.blocks.defense.turrets; +package mindustry.world.blocks.defense.turrets; -import io.anuke.arc.Core; -import io.anuke.arc.audio.*; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.EnumSet; -import io.anuke.arc.func.Cons2; -import io.anuke.arc.graphics.Blending; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.entities.traits.TargetTrait; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.*; +import arc.Core; +import arc.audio.*; +import arc.struct.Array; +import arc.struct.EnumSet; +import arc.func.Cons2; +import arc.graphics.Blending; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.math.Angles; +import arc.math.Mathf; +import arc.math.geom.Vec2; +import arc.util.Time; +import mindustry.content.Fx; +import mindustry.entities.*; +import mindustry.entities.Effects.Effect; +import mindustry.entities.type.Bullet; +import mindustry.entities.bullet.BulletType; +import mindustry.entities.traits.TargetTrait; +import mindustry.entities.type.TileEntity; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public abstract class Turret extends Block{ public final int timerTarget = timers++; @@ -54,8 +54,8 @@ public abstract class Turret extends Block{ public boolean targetAir = true; public boolean targetGround = true; - protected Vector2 tr = new Vector2(); - protected Vector2 tr2 = new Vector2(); + protected Vec2 tr = new Vec2(); + protected Vec2 tr2 = new Vec2(); public TextureRegion baseRegion, heatRegion; @@ -162,7 +162,7 @@ public abstract class Turret extends Block{ float speed = type.speed; if(speed < 0.1f) speed = 9999999f; - Vector2 result = Predict.intercept(entity, entity.target, speed); + Vec2 result = Predict.intercept(entity, entity.target, speed); if(result.isZero()){ result.set(entity.target.getX(), entity.target.getY()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java b/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java similarity index 83% rename from core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java rename to core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java index c91c16318b..fb6eb261f9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import mindustry.type.*; +import mindustry.world.*; public class ArmoredConveyor extends Conveyor{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java b/core/src/mindustry/world/blocks/distribution/BufferedItemBridge.java similarity index 91% rename from core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java rename to core/src/mindustry/world/blocks/distribution/BufferedItemBridge.java index 89b91cb50c..3809fea966 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/BufferedItemBridge.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.arc.math.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.math.*; +import mindustry.type.*; +import mindustry.world.*; import java.io.*; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java rename to core/src/mindustry/world/blocks/distribution/Conveyor.java index a3799def15..23f564df04 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/mindustry/world/blocks/distribution/Conveyor.java @@ -1,26 +1,26 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Conveyor extends Block implements Autotiler{ private static final float itemSpace = 0.4f; @@ -28,8 +28,8 @@ public class Conveyor extends Block implements Autotiler{ private static ItemPos drawpos = new ItemPos(); private static ItemPos pos1 = new ItemPos(); private static ItemPos pos2 = new ItemPos(); - private final Vector2 tr1 = new Vector2(); - private final Vector2 tr2 = new Vector2(); + private final Vec2 tr1 = new Vec2(); + private final Vec2 tr2 = new Vec2(); private TextureRegion[][] regions = new TextureRegion[7][4]; public float speed = 0f; @@ -283,7 +283,7 @@ public class Conveyor extends Block implements Autotiler{ } @Override - public void getStackOffset(Item item, Tile tile, Vector2 trns){ + public void getStackOffset(Item item, Tile tile, Vec2 trns){ trns.trns(tile.rotation() * 90 + 180f, tilesize / 2f); } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java b/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java similarity index 82% rename from core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java rename to core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java index 7a0a2b1d06..6fe691d117 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java @@ -1,11 +1,12 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Geometry; -import io.anuke.mindustry.world.Tile; +import arc.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ExtendingItemBridge extends ItemBridge{ @@ -31,6 +32,10 @@ public class ExtendingItemBridge extends ItemBridge{ ex *= uptime; ey *= uptime; + float opacity = Core.settings.getInt("bridgeopacity") / 100f; + if(Mathf.zero(opacity)) return; + Draw.alpha(opacity); + Lines.stroke(8f); Lines.line(bridgeRegion, tile.worldx() + Geometry.d4[i].x * tilesize / 2f, @@ -50,7 +55,7 @@ public class ExtendingItemBridge extends ItemBridge{ Draw.color(); for(int a = 0; a < arrows; a++){ - Draw.alpha(Mathf.absin(a / (float)arrows - entity.time / 100f, 0.1f, 1f) * uptime); + Draw.alpha(Mathf.absin(a / (float)arrows - entity.time / 100f, 0.1f, 1f) * uptime * opacity); Draw.rect(arrowRegion, tile.worldx() + Geometry.d4[i].x * (tilesize / 2f + a * 6f + 2) * uptime, tile.worldy() + Geometry.d4[i].y * (tilesize / 2f + a * 6f + 2) * uptime, i * 90f); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java rename to core/src/mindustry/world/blocks/distribution/ItemBridge.java index 3624a1079b..5d16ec69ee 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -1,23 +1,23 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.collection.IntSet.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.struct.*; +import arc.struct.IntSet.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ItemBridge extends Block{ public final int timerTransport = timers++; @@ -219,10 +219,13 @@ public class ItemBridge extends Block{ Tile other = world.tile(entity.link); if(!linkValid(tile, other)) return; + float opacity = Core.settings.getInt("bridgeopacity") / 100f; + if(Mathf.zero(opacity)) return; + int i = tile.absoluteRelativeTo(other.x, other.y); Draw.color(Color.white, Color.black, Mathf.absin(Time.time(), 6f, 0.07f)); - Draw.alpha(Math.max(entity.uptime, 0.25f)); + Draw.alpha(Math.max(entity.uptime, 0.25f) * opacity); Draw.rect(endRegion, tile.drawx(), tile.drawy(), i * 90 + 90); Draw.rect(endRegion, other.drawx(), other.drawy(), i * 90 + 270); @@ -242,7 +245,7 @@ public class ItemBridge extends Block{ Draw.color(); for(int a = 0; a < arrows; a++){ - Draw.alpha(Mathf.absin(a / (float)arrows - entity.time / 100f, 0.1f, 1f) * entity.uptime); + Draw.alpha(Mathf.absin(a / (float)arrows - entity.time / 100f, 0.1f, 1f) * entity.uptime * opacity); Draw.rect(arrowRegion, tile.worldx() + Geometry.d4[i].x * (tilesize / 2f + a * 4f + time % 4f), tile.worldy() + Geometry.d4[i].y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java b/core/src/mindustry/world/blocks/distribution/Junction.java similarity index 82% rename from core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java rename to core/src/mindustry/world/blocks/distribution/Junction.java index 45fea7b8a4..99c22057e1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/mindustry/world/blocks/distribution/Junction.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.gen.BufferItem; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.DirectionalItemBuffer; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockGroup; +import arc.util.Time; +import mindustry.entities.type.TileEntity; +import mindustry.entities.type.Unit; +import mindustry.gen.BufferItem; +import mindustry.type.Item; +import mindustry.world.Block; +import mindustry.world.DirectionalItemBuffer; +import mindustry.world.Tile; +import mindustry.world.meta.BlockGroup; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class Junction extends Block{ public float speed = 26; //frames taken to go through this junction @@ -58,7 +58,7 @@ public class Junction extends Block{ if(dest != null) dest = dest.link(); //skip blocks that don't want the item, keep waiting until they do - if(dest == null || !dest.block().acceptItem(item, dest, tile)){ + if(dest == null || !dest.block().acceptItem(item, dest, tile) || dest.getTeam() != tile.getTeam()){ continue; } @@ -82,10 +82,9 @@ public class Junction extends Block{ JunctionEntity entity = tile.ent(); int relative = source.relativeTo(tile.x, tile.y); - if(entity == null || relative == -1 || !entity.buffer.accepts(relative)) - return false; + if(entity == null || relative == -1 || !entity.buffer.accepts(relative)) return false; Tile to = tile.getNearby(relative); - return to != null && to.link().entity != null; + return to != null && to.link().entity != null && to.getTeam() == tile.getTeam(); } class JunctionEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/mindustry/world/blocks/distribution/MassDriver.java similarity index 87% rename from core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java rename to core/src/mindustry/world/blocks/distribution/MassDriver.java index 1f75a716c8..eacef7d0eb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/mindustry/world/blocks/distribution/MassDriver.java @@ -1,23 +1,23 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.Pool.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.struct.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import arc.util.pooling.Pool.*; +import arc.util.pooling.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.type.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MassDriver extends Block{ public float range; @@ -162,6 +162,24 @@ public class MassDriver extends Block{ @Override public void drawPlace(int x, int y, int rotation, boolean valid){ Drawf.dashCircle(x * tilesize, y*tilesize, range, Pal.accent); + + //check if a mass driver is selected while placing this driver + if(!control.input.frag.config.isShown()) return; + Tile selected = control.input.frag.config.getSelectedTile(); + if(selected == null || !(selected.block() instanceof MassDriver) || !(selected.dst(x * tilesize, y * tilesize) <= range)) return; + + //if so, draw a dotted line towards it while it is in range + float sin = Mathf.absin(Time.time(), 6f, 1f); + Tmp.v1.set(x * tilesize + offset(), y * tilesize + offset()).sub(selected.drawx(), selected.drawy()).limit((size / 2f + 1) * tilesize + sin + 0.5f); + float x2 = x * tilesize - Tmp.v1.x, y2 = y * tilesize - Tmp.v1.y, + x1 = selected.drawx() + Tmp.v1.x, y1 = selected.drawy() + Tmp.v1.y; + int segs = (int)(selected.dst(x * tilesize, y * tilesize) / tilesize); + + Lines.stroke(4f, Pal.gray); + Lines.dashLine(x1, y1, x2, y2, segs); + Lines.stroke(2f, Pal.placing); + Lines.dashLine(x1, y1, x2, y2, segs); + Draw.reset(); } @Override @@ -262,6 +280,7 @@ public class MassDriver extends Block{ } protected boolean shooterValid(Tile tile, Tile other){ + if(other == null) return true; if(!(other.block() instanceof MassDriver)) return false; MassDriverEntity entity = other.ent(); @@ -274,7 +293,7 @@ public class MassDriver extends Block{ if(entity == null || entity.link == -1) return false; Tile link = world.tile(entity.link); - return link != null && link.block() instanceof MassDriver && tile.dst(link) <= range; + return link != null && link.block() instanceof MassDriver && link.getTeam() == tile.getTeam() && tile.dst(link) <= range; } public static class DriverBulletData implements Poolable{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/mindustry/world/blocks/distribution/OverflowGate.java similarity index 87% rename from core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java rename to core/src/mindustry/world/blocks/distribution/OverflowGate.java index a6c8f779ac..b07ae8c7be 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/mindustry/world/blocks/distribution/OverflowGate.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.BlockGroup; +import arc.math.Mathf; +import arc.util.Time; +import mindustry.entities.type.TileEntity; +import mindustry.type.Item; +import mindustry.world.*; +import mindustry.world.meta.BlockGroup; import java.io.*; @@ -81,11 +81,11 @@ public class OverflowGate extends Block{ if(to == null) return null; Tile edge = Edges.getFacingEdge(tile, to); - if(!to.block().acceptItem(item, to, edge) || (to.block() instanceof OverflowGate)){ + if(!to.block().acceptItem(item, to, edge) || to.getTeam() != tile.getTeam() || (to.block() instanceof OverflowGate)){ Tile a = tile.getNearby(Mathf.mod(from - 1, 4)); Tile b = tile.getNearby(Mathf.mod(from + 1, 4)); - boolean ac = a != null && a.block().acceptItem(item, a, edge) && !(a.block() instanceof OverflowGate); - boolean bc = b != null && b.block().acceptItem(item, b, edge) && !(b.block() instanceof OverflowGate); + boolean ac = a != null && a.block().acceptItem(item, a, edge) && !(a.block() instanceof OverflowGate) && a.getTeam() == tile.getTeam(); + boolean bc = b != null && b.block().acceptItem(item, b, edge) && !(b.block() instanceof OverflowGate) && b.getTeam() == tile.getTeam(); if(!ac && !bc){ return null; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java b/core/src/mindustry/world/blocks/distribution/Router.java similarity index 88% rename from core/src/io/anuke/mindustry/world/blocks/distribution/Router.java rename to core/src/mindustry/world/blocks/distribution/Router.java index 1893af98e2..8cfa4525d0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java +++ b/core/src/mindustry/world/blocks/distribution/Router.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.arc.collection.Array; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.BlockGroup; +import arc.struct.Array; +import arc.util.Time; +import mindustry.content.*; +import mindustry.entities.type.TileEntity; +import mindustry.type.Item; +import mindustry.world.*; +import mindustry.world.meta.BlockGroup; public class Router extends Block{ public float speed = 8f; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/mindustry/world/blocks/distribution/Sorter.java similarity index 89% rename from core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java rename to core/src/mindustry/world/blocks/distribution/Sorter.java index 1794161654..1df5fe75e5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/mindustry/world/blocks/distribution/Sorter.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.world.blocks.distribution; +package mindustry.world.blocks.distribution; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class Sorter extends Block{ private static Item lastItem; @@ -74,7 +74,7 @@ public class Sorter extends Block{ public boolean acceptItem(Item item, Tile tile, Tile source){ Tile to = getTileTarget(item, tile, source, false); - return to != null && to.block().acceptItem(item, to, tile); + return to != null && to.block().acceptItem(item, to, tile) && to.getTeam() == tile.getTeam(); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java rename to core/src/mindustry/world/blocks/liquid/ArmoredConduit.java index d74087123c..82fe515f0f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java +++ b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.world.blocks.liquid; +package mindustry.world.blocks.liquid; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Edges; -import io.anuke.mindustry.world.Tile; +import arc.Core; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import mindustry.type.Liquid; +import mindustry.world.Block; +import mindustry.world.Edges; +import mindustry.world.Tile; public class ArmoredConduit extends Conduit{ public TextureRegion capRegion; diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java b/core/src/mindustry/world/blocks/liquid/Conduit.java similarity index 89% rename from core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java rename to core/src/mindustry/world/blocks/liquid/Conduit.java index 0b6518b956..a1d784f84f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/mindustry/world/blocks/liquid/Conduit.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.world.blocks.liquid; +package mindustry.world.blocks.liquid; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.modules.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.modules.*; public class Conduit extends LiquidBlock implements Autotiler{ public final int timerFlow = timers++; diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java similarity index 83% rename from core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java rename to core/src/mindustry/world/blocks/liquid/LiquidBridge.java index 5575d6d779..b1a790b491 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world.blocks.liquid; +package mindustry.world.blocks.liquid; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.distribution.*; -import io.anuke.mindustry.world.meta.*; +import arc.math.*; +import arc.util.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.distribution.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.world; public class LiquidBridge extends ItemBridge{ diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java similarity index 82% rename from core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java rename to core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java index 1753e17d55..8b7840e9ad 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world.blocks.liquid; +package mindustry.world.blocks.liquid; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.distribution.*; -import io.anuke.mindustry.world.meta.*; +import arc.math.*; +import arc.util.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.distribution.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.world; public class LiquidExtendingBridge extends ExtendingItemBridge{ diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidJunction.java b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java similarity index 67% rename from core/src/io/anuke/mindustry/world/blocks/liquid/LiquidJunction.java rename to core/src/mindustry/world/blocks/liquid/LiquidJunction.java index 34cf6c4916..881213705a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidJunction.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.liquid; +package mindustry.world.blocks.liquid; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.graphics.g2d.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; public class LiquidJunction extends LiquidBlock{ @@ -39,8 +39,8 @@ public class LiquidJunction extends LiquidBlock{ public Tile getLiquidDestination(Tile tile, Tile source, Liquid liquid){ int dir = source.relativeTo(tile.x, tile.y); dir = (dir + 4) % 4; - Tile next = tile.getNearby(dir).link(); - if(!next.block().acceptLiquid(next, tile, liquid, 0f) && !(next.block() instanceof LiquidJunction)){ + Tile next = tile.getNearbyLink(dir); + if(next == null || !next.block().acceptLiquid(next, tile, liquid, 0f) && !(next.block() instanceof LiquidJunction)){ return tile; } return next.block().getLiquidDestination(next, tile, liquid); diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java b/core/src/mindustry/world/blocks/liquid/LiquidOverflowGate.java similarity index 83% rename from core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java rename to core/src/mindustry/world/blocks/liquid/LiquidOverflowGate.java index 3004835249..1f6ceac925 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidOverflowGate.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.liquid; +package mindustry.world.blocks.liquid; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.graphics.g2d.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; //TODO implement later public class LiquidOverflowGate extends LiquidBlock{ diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidRouter.java b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java similarity index 76% rename from core/src/io/anuke/mindustry/world/blocks/liquid/LiquidRouter.java rename to core/src/mindustry/world/blocks/liquid/LiquidRouter.java index e5c4103a3c..35f7e09ea8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidRouter.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.liquid; +package mindustry.world.blocks.liquid; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.LiquidBlock; +import mindustry.type.Liquid; +import mindustry.world.Tile; +import mindustry.world.blocks.LiquidBlock; public class LiquidRouter extends LiquidBlock{ diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidTank.java b/core/src/mindustry/world/blocks/liquid/LiquidTank.java similarity index 70% rename from core/src/io/anuke/mindustry/world/blocks/liquid/LiquidTank.java rename to core/src/mindustry/world/blocks/liquid/LiquidTank.java index c8303771a6..89dd558dc2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidTank.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidTank.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.liquid; +package mindustry.world.blocks.liquid; public class LiquidTank extends LiquidRouter{ diff --git a/core/src/io/anuke/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java similarity index 55% rename from core/src/io/anuke/mindustry/world/blocks/logic/LogicBlock.java rename to core/src/mindustry/world/blocks/logic/LogicBlock.java index ccb78c365c..a1f7ef7069 100644 --- a/core/src/io/anuke/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.blocks.logic; +package mindustry.world.blocks.logic; -import io.anuke.mindustry.world.Block; +import mindustry.world.Block; public class LogicBlock extends Block{ diff --git a/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java b/core/src/mindustry/world/blocks/logic/MessageBlock.java similarity index 86% rename from core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java rename to core/src/mindustry/world/blocks/logic/MessageBlock.java index 0d00c50d09..cb7498138d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java +++ b/core/src/mindustry/world/blocks/logic/MessageBlock.java @@ -1,26 +1,26 @@ -package io.anuke.mindustry.world.blocks.logic; +package mindustry.world.blocks.logic; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.Input.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.dialogs.*; -import io.anuke.mindustry.world.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.Input.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.geom.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.pooling.*; +import mindustry.entities.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.net.*; +import mindustry.ui.*; +import mindustry.ui.dialogs.*; +import mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MessageBlock extends Block{ protected static int maxTextLength = 220; @@ -142,7 +142,7 @@ public class MessageBlock extends Block{ @Override public void updateTableAlign(Tile tile, Table table){ - Vector2 pos = Core.input.mouseScreen(tile.drawx(), tile.drawy() + tile.block().size * tilesize / 2f + 1); + Vec2 pos = Core.input.mouseScreen(tile.drawx(), tile.drawy() + tile.block().size * tilesize / 2f + 1); table.setPosition(pos.x, pos.y, Align.bottom); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/Battery.java b/core/src/mindustry/world/blocks/power/Battery.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/power/Battery.java rename to core/src/mindustry/world/blocks/power/Battery.java index 48a776affb..2783984747 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/Battery.java +++ b/core/src/mindustry/world/blocks/power/Battery.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; public class Battery extends PowerDistributor{ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java b/core/src/mindustry/world/blocks/power/BurnerGenerator.java similarity index 74% rename from core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java rename to core/src/mindustry/world/blocks/power/BurnerGenerator.java index dba75d1e0c..fee2d5135a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java +++ b/core/src/mindustry/world/blocks/power/BurnerGenerator.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Liquid; +import mindustry.type.Item; +import mindustry.type.Liquid; public class BurnerGenerator extends ItemLiquidGenerator{ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ConditionalConsumePower.java b/core/src/mindustry/world/blocks/power/ConditionalConsumePower.java similarity index 69% rename from core/src/io/anuke/mindustry/world/blocks/power/ConditionalConsumePower.java rename to core/src/mindustry/world/blocks/power/ConditionalConsumePower.java index 1f9dadd3e9..fa94ea64cc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ConditionalConsumePower.java +++ b/core/src/mindustry/world/blocks/power/ConditionalConsumePower.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.func.Boolf; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.world.consumers.ConsumePower; +import arc.func.Boolf; +import mindustry.entities.type.TileEntity; +import mindustry.world.consumers.ConsumePower; /** A power consumer that only activates sometimes. */ public class ConditionalConsumePower extends ConsumePower{ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/DecayGenerator.java b/core/src/mindustry/world/blocks/power/DecayGenerator.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/power/DecayGenerator.java rename to core/src/mindustry/world/blocks/power/DecayGenerator.java index 18b3cd47df..e9fee90eee 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/DecayGenerator.java +++ b/core/src/mindustry/world/blocks/power/DecayGenerator.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.mindustry.type.Item; +import mindustry.type.Item; public class DecayGenerator extends ItemLiquidGenerator{ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java b/core/src/mindustry/world/blocks/power/ImpactReactor.java similarity index 90% rename from core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java rename to core/src/mindustry/world/blocks/power/ImpactReactor.java index e74eab58ef..2c47bdf465 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/mindustry/world/blocks/power/ImpactReactor.java @@ -1,22 +1,22 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ImpactReactor extends PowerGenerator{ public final int timerUse = timers++; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java similarity index 92% rename from core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java rename to core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java index c0c9e240cf..1eb1cf6033 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; /** * Power generation block which can use items, liquids or both as input sources for power production. diff --git a/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java b/core/src/mindustry/world/blocks/power/LightBlock.java similarity index 85% rename from core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java rename to core/src/mindustry/world/blocks/power/LightBlock.java index 989775dc40..ad65313954 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java +++ b/core/src/mindustry/world/blocks/power/LightBlock.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class LightBlock extends Block{ private static int lastColor = 0; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java b/core/src/mindustry/world/blocks/power/NuclearReactor.java similarity index 89% rename from core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java rename to core/src/mindustry/world/blocks/power/NuclearReactor.java index 5957a92ac6..b583b3cfdf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/mindustry/world/blocks/power/NuclearReactor.java @@ -1,30 +1,30 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class NuclearReactor extends PowerGenerator{ public final int timerFuel = timers++; - public final Vector2 tr = new Vector2(); + public final Vec2 tr = new Vec2(); public Color lightColor = Color.valueOf("7f19ea"); public Color coolColor = new Color(1, 1, 1, 0f); @@ -46,6 +46,7 @@ public class NuclearReactor extends PowerGenerator{ hasItems = true; hasLiquids = true; entityType = NuclearReactorEntity::new; + rebuildable = false; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java b/core/src/mindustry/world/blocks/power/PowerDiode.java similarity index 83% rename from core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java rename to core/src/mindustry/world/blocks/power/PowerDiode.java index 1dee0636a5..eea5b46d72 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java +++ b/core/src/mindustry/world/blocks/power/PowerDiode.java @@ -1,16 +1,16 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.Core; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.ui.Bar; -import io.anuke.arc.util.Eachable; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.Block; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.mindustry.entities.traits.BuilderTrait; +import arc.Core; +import arc.math.Mathf; +import mindustry.ui.Bar; +import arc.util.Eachable; +import mindustry.ui.Cicon; +import mindustry.world.Tile; +import mindustry.world.Block; +import arc.graphics.g2d.Draw; +import mindustry.graphics.Pal; +import arc.graphics.g2d.TextureRegion; +import mindustry.entities.traits.BuilderTrait; public class PowerDiode extends Block{ public TextureRegion arrow; @@ -27,7 +27,7 @@ public class PowerDiode extends Block{ public void update(Tile tile){ super.update(tile); - if(tile.front() == null || tile.back() == null || !tile.back().block().hasPower || !tile.front().block().hasPower) return; + if(tile.front() == null || tile.back() == null || !tile.back().block().hasPower || !tile.front().block().hasPower || tile.back().getTeam() != tile.front().getTeam()) return; PowerGraph backGraph = tile.back().entity.power.graph; PowerGraph frontGraph = tile.front().entity.power.graph; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java b/core/src/mindustry/world/blocks/power/PowerDistributor.java similarity index 65% rename from core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java rename to core/src/mindustry/world/blocks/power/PowerDistributor.java index 38ef286d78..6a9bf0b302 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java +++ b/core/src/mindustry/world/blocks/power/PowerDistributor.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.mindustry.world.blocks.PowerBlock; +import mindustry.world.blocks.PowerBlock; public class PowerDistributor extends PowerBlock{ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java b/core/src/mindustry/world/blocks/power/PowerGenerator.java similarity index 84% rename from core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java rename to core/src/mindustry/world/blocks/power/PowerGenerator.java index 7612e9ff16..b7cff15bd7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/mindustry/world/blocks/power/PowerGenerator.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.Core; -import io.anuke.arc.collection.EnumSet; -import io.anuke.arc.util.Strings; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.ui.Bar; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.*; +import arc.Core; +import arc.struct.EnumSet; +import arc.util.Strings; +import mindustry.entities.type.TileEntity; +import mindustry.graphics.Pal; +import mindustry.ui.Bar; +import mindustry.world.Tile; +import mindustry.world.meta.*; import java.io.*; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/mindustry/world/blocks/power/PowerGraph.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java rename to core/src/mindustry/world/blocks/power/PowerGraph.java index 43a782d2e8..be5d593797 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/mindustry/world/blocks/power/PowerGraph.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; +import arc.*; +import arc.struct.*; +import arc.math.*; +import arc.util.*; +import mindustry.world.*; +import mindustry.world.consumers.*; public class PowerGraph{ private final static Queue queue = new Queue<>(); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java rename to core/src/mindustry/world/blocks/power/PowerNode.java index bfd60a2cdb..7a267abeef 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -1,28 +1,28 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.type.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class PowerNode extends PowerBlock{ protected static boolean returnValue = false; protected final ObjectSet graphs = new ObjectSet<>(); - protected final Vector2 t1 = new Vector2(), t2 = new Vector2(); + protected final Vec2 t1 = new Vec2(), t2 = new Vec2(); public TextureRegion laser, laserEnd; public float laserRange = 6; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/SingleTypeGenerator.java b/core/src/mindustry/world/blocks/power/SingleTypeGenerator.java similarity index 73% rename from core/src/io/anuke/mindustry/world/blocks/power/SingleTypeGenerator.java rename to core/src/mindustry/world/blocks/power/SingleTypeGenerator.java index 231533fc8c..22a668160e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/SingleTypeGenerator.java +++ b/core/src/mindustry/world/blocks/power/SingleTypeGenerator.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Liquid; +import mindustry.type.Item; +import mindustry.type.Liquid; public class SingleTypeGenerator extends ItemLiquidGenerator{ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java b/core/src/mindustry/world/blocks/power/SolarGenerator.java similarity index 79% rename from core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java rename to core/src/mindustry/world/blocks/power/SolarGenerator.java index 81712ba4bc..75a23c9d6f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java +++ b/core/src/mindustry/world/blocks/power/SolarGenerator.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.collection.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.struct.*; +import mindustry.world.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.state; +import static mindustry.Vars.state; public class SolarGenerator extends PowerGenerator{ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/mindustry/world/blocks/power/ThermalGenerator.java similarity index 81% rename from core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java rename to core/src/mindustry/world/blocks/power/ThermalGenerator.java index 61570c66df..6c1debe03b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/mindustry/world/blocks/power/ThermalGenerator.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.world.blocks.power; +package mindustry.world.blocks.power; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.math.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.graphics.*; +import arc.math.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.world.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.renderer; +import static mindustry.Vars.renderer; public class ThermalGenerator extends PowerGenerator{ public Effect generateEffect = Fx.none; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java b/core/src/mindustry/world/blocks/production/Cultivator.java similarity index 86% rename from core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java rename to core/src/mindustry/world/blocks/production/Cultivator.java index 640f438b40..3d924c1dbf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/mindustry/world/blocks/production/Cultivator.java @@ -1,17 +1,17 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.RandomXS128; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.ui.Bar; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.Attribute; +import arc.Core; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.math.Mathf; +import arc.math.Rand; +import arc.util.Time; +import mindustry.content.Fx; +import mindustry.entities.type.TileEntity; +import mindustry.graphics.Pal; +import mindustry.ui.Bar; +import mindustry.world.Tile; +import mindustry.world.meta.Attribute; import java.io.*; @@ -21,7 +21,7 @@ public class Cultivator extends GenericCrafter{ public Color bottomColor = Color.valueOf("474747"); public TextureRegion middleRegion, topRegion; - public RandomXS128 random = new RandomXS128(0); + public Rand random = new Rand(0); public float recurrence = 6f; public Attribute attribute = Attribute.spores; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java similarity index 93% rename from core/src/io/anuke/mindustry/world/blocks/production/Drill.java rename to core/src/mindustry/world/blocks/production/Drill.java index 1ef45a3c2f..0a9975e69f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -1,23 +1,23 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.struct.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Drill extends Block{ public float hardnessDrillMultiplier = 50f; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java b/core/src/mindustry/world/blocks/production/Fracker.java similarity index 92% rename from core/src/io/anuke/mindustry/world/blocks/production/Fracker.java rename to core/src/mindustry/world/blocks/production/Fracker.java index d70d8e878c..5642830c2e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java +++ b/core/src/mindustry/world/blocks/production/Fracker.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.graphics.g2d.*; +import mindustry.world.*; +import mindustry.world.meta.*; public class Fracker extends SolidPump{ public float itemUseTime = 100f; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java similarity index 85% rename from core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java rename to core/src/mindustry/world/blocks/production/GenericCrafter.java index 00075370e4..ee0e9a3c30 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; import java.io.*; @@ -149,14 +149,6 @@ public class GenericCrafter extends Block{ return itemCapacity; } - public Item outputItem(){ - return outputItem == null ? null : outputItem.item; - } - - public Liquid outputLiquid(){ - return outputLiquid == null ? null : outputLiquid.liquid; - } - public static class GenericCrafterEntity extends TileEntity{ public float progress; public float totalProgress; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java b/core/src/mindustry/world/blocks/production/GenericSmelter.java similarity index 83% rename from core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java rename to core/src/mindustry/world/blocks/production/GenericSmelter.java index 3fe9e1eb7a..4e74edecd0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java +++ b/core/src/mindustry/world/blocks/production/GenericSmelter.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.arc.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.world.*; -import static io.anuke.mindustry.Vars.renderer; +import static mindustry.Vars.renderer; /** A GenericCrafter with a new glowing region drawn on top. */ public class GenericSmelter extends GenericCrafter{ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java b/core/src/mindustry/world/blocks/production/Incinerator.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java rename to core/src/mindustry/world/blocks/production/Incinerator.java index 656476c4d8..61d5d05ee8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java +++ b/core/src/mindustry/world/blocks/production/Incinerator.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Fill; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.math.Mathf; +import arc.util.Time; +import mindustry.content.Fx; +import mindustry.entities.Effects; +import mindustry.entities.Effects.Effect; +import mindustry.entities.type.TileEntity; +import mindustry.type.Item; +import mindustry.type.Liquid; +import mindustry.world.Block; +import mindustry.world.Tile; public class Incinerator extends Block{ public Effect effect = Fx.fuelburn; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java b/core/src/mindustry/world/blocks/production/LiquidConverter.java similarity index 86% rename from core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java rename to core/src/mindustry/world/blocks/production/LiquidConverter.java index 95fdc2184f..b604867434 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java +++ b/core/src/mindustry/world/blocks/production/LiquidConverter.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.consumers.ConsumeLiquidBase; -import io.anuke.mindustry.world.consumers.ConsumeType; -import io.anuke.mindustry.world.meta.BlockStat; +import mindustry.world.Tile; +import mindustry.world.consumers.ConsumeLiquidBase; +import mindustry.world.consumers.ConsumeType; +import mindustry.world.meta.BlockStat; public class LiquidConverter extends GenericCrafter{ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java b/core/src/mindustry/world/blocks/production/Pump.java similarity index 86% rename from core/src/io/anuke/mindustry/world/blocks/production/Pump.java rename to core/src/mindustry/world/blocks/production/Pump.java index 9142cc49af..010e7cb041 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java +++ b/core/src/mindustry/world/blocks/production/Pump.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.mindustry.graphics.Layer; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.LiquidBlock; -import io.anuke.mindustry.world.meta.*; +import arc.Core; +import arc.struct.Array; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import mindustry.graphics.Layer; +import mindustry.type.Liquid; +import mindustry.ui.Cicon; +import mindustry.world.Tile; +import mindustry.world.blocks.LiquidBlock; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.tilesize; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.tilesize; +import static mindustry.Vars.world; public class Pump extends LiquidBlock{ protected final Array drawTiles = new Array<>(); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java b/core/src/mindustry/world/blocks/production/Separator.java similarity index 87% rename from core/src/io/anuke/mindustry/world/blocks/production/Separator.java rename to core/src/mindustry/world/blocks/production/Separator.java index c297851e67..64ab3783c2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java +++ b/core/src/mindustry/world/blocks/production/Separator.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.production.GenericCrafter.*; -import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.meta.values.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.ArcAnnotate.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.production.GenericCrafter.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; /** * Extracts a random list of items from an input item and an input liquid. diff --git a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java b/core/src/mindustry/world/blocks/production/SolidPump.java similarity index 82% rename from core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java rename to core/src/mindustry/world/blocks/production/SolidPump.java index e7ac5b0c14..ac199c7b27 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/mindustry/world/blocks/production/SolidPump.java @@ -1,20 +1,21 @@ -package io.anuke.mindustry.world.blocks.production; +package mindustry.world.blocks.production; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.content.Liquids; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.ui.Bar; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.Attribute; -import io.anuke.mindustry.world.meta.BlockStat; +import arc.Core; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; +import arc.util.*; +import mindustry.content.Fx; +import mindustry.content.Liquids; +import mindustry.entities.Effects; +import mindustry.entities.Effects.Effect; +import mindustry.entities.type.TileEntity; +import mindustry.graphics.Pal; +import mindustry.type.Liquid; +import mindustry.ui.Bar; +import mindustry.world.Tile; +import mindustry.world.meta.Attribute; +import mindustry.world.meta.BlockStat; /** * Pump that makes liquid from solids and takes in power. Only works on solid floor blocks. @@ -51,8 +52,8 @@ public class SolidPump extends Pump{ public void setBars(){ super.setBars(); bars.add("efficiency", entity -> new Bar(() -> - Core.bundle.formatFloat("bar.efficiency", - ((((SolidPumpEntity)entity).boost + 1f) * ((SolidPumpEntity)entity).warmup) * 100 * percentSolid(entity.tile.x, entity.tile.y), 1), + Core.bundle.formatFloat("bar.pumpspeed", + ((SolidPumpEntity)entity).lastPump / Time.delta() * 60, 1), () -> Pal.ammo, () -> ((SolidPumpEntity)entity).warmup)); } @@ -104,11 +105,13 @@ public class SolidPump extends Pump{ if(tile.entity.cons.valid() && typeLiquid(tile) < liquidCapacity - 0.001f){ float maxPump = Math.min(liquidCapacity - typeLiquid(tile), pumpAmount * entity.delta() * fraction * entity.efficiency()); tile.entity.liquids.add(result, maxPump); + entity.lastPump = maxPump; entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, 0.02f); if(Mathf.chance(entity.delta() * updateEffectChance)) Effects.effect(updateEffect, entity.x + Mathf.range(size * 2f), entity.y + Mathf.range(size * 2f)); }else{ entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.02f); + entity.lastPump = 0f; } entity.pumpTime += entity.warmup * entity.delta(); @@ -153,5 +156,6 @@ public class SolidPump extends Pump{ public float warmup; public float pumpTime; public float boost; + public float lastPump; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/mindustry/world/blocks/sandbox/ItemSource.java similarity index 84% rename from core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java rename to core/src/mindustry/world/blocks/sandbox/ItemSource.java index 46e1e86ee2..2ff49b70d8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/mindustry/world/blocks/sandbox/ItemSource.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.world.blocks.sandbox; +package mindustry.world.blocks.sandbox; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.graphics.g2d.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class ItemSource extends Block{ private static Item lastItem; diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemVoid.java b/core/src/mindustry/world/blocks/sandbox/ItemVoid.java similarity index 66% rename from core/src/io/anuke/mindustry/world/blocks/sandbox/ItemVoid.java rename to core/src/mindustry/world/blocks/sandbox/ItemVoid.java index 2a59aeab8b..1271cbac6f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemVoid.java +++ b/core/src/mindustry/world/blocks/sandbox/ItemVoid.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.sandbox; +package mindustry.world.blocks.sandbox; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import mindustry.type.Item; +import mindustry.world.Block; +import mindustry.world.Tile; public class ItemVoid extends Block{ diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java similarity index 84% rename from core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java rename to core/src/mindustry/world/blocks/sandbox/LiquidSource.java index ac260679a7..d1ff0be0dd 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java @@ -1,24 +1,24 @@ -package io.anuke.mindustry.world.blocks.sandbox; +package mindustry.world.blocks.sandbox; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.style.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; +import arc.*; +import arc.struct.*; +import arc.graphics.g2d.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class LiquidSource extends Block{ public static Liquid lastLiquid; diff --git a/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java b/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java new file mode 100644 index 0000000000..dbdc766dcf --- /dev/null +++ b/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java @@ -0,0 +1,29 @@ +package mindustry.world.blocks.sandbox; + +import mindustry.type.*; +import mindustry.world.*; + +public class LiquidVoid extends Block{ + + public LiquidVoid(String name){ + super(name); + hasLiquids = true; + solid = true; + update = true; + } + + @Override + public void setBars(){ + super.setBars(); + bars.remove("liquid"); + } + + @Override + public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ + return true; + } + + @Override + public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){} + +} diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/PowerSource.java b/core/src/mindustry/world/blocks/sandbox/PowerSource.java similarity index 66% rename from core/src/io/anuke/mindustry/world/blocks/sandbox/PowerSource.java rename to core/src/mindustry/world/blocks/sandbox/PowerSource.java index 9c95ccd689..e7efd5e034 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/PowerSource.java +++ b/core/src/mindustry/world/blocks/sandbox/PowerSource.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.blocks.sandbox; +package mindustry.world.blocks.sandbox; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.power.PowerNode; +import mindustry.world.Tile; +import mindustry.world.blocks.power.PowerNode; public class PowerSource extends PowerNode{ diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/PowerVoid.java b/core/src/mindustry/world/blocks/sandbox/PowerVoid.java similarity index 63% rename from core/src/io/anuke/mindustry/world/blocks/sandbox/PowerVoid.java rename to core/src/mindustry/world/blocks/sandbox/PowerVoid.java index 549183c0be..ba778d2688 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/PowerVoid.java +++ b/core/src/mindustry/world/blocks/sandbox/PowerVoid.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.blocks.sandbox; +package mindustry.world.blocks.sandbox; -import io.anuke.mindustry.world.blocks.PowerBlock; -import io.anuke.mindustry.world.meta.BlockStat; +import mindustry.world.blocks.PowerBlock; +import mindustry.world.meta.BlockStat; public class PowerVoid extends PowerBlock{ diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java similarity index 77% rename from core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java rename to core/src/mindustry/world/blocks/storage/CoreBlock.java index 557dddce45..4a8f500d77 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -1,27 +1,27 @@ -package io.anuke.mindustry.world.blocks.storage; +package mindustry.world.blocks.storage; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.modules.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.*; +import arc.func.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; +import mindustry.world.modules.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class CoreBlock extends StorageBlock{ public Mech mech = Mechs.starter; @@ -84,12 +84,12 @@ public class CoreBlock extends StorageBlock{ public void onProximityUpdate(Tile tile){ CoreEntity entity = tile.ent(); - for(Tile other : state.teams.get(tile.getTeam()).cores){ - if(other != tile){ - entity.items = other.entity.items; + for(TileEntity other : state.teams.cores(tile.getTeam())){ + if(other.tile != tile){ + entity.items = other.items; } } - state.teams.get(tile.getTeam()).cores.add(tile); + state.teams.registerCore(entity); entity.storageCapacity = itemCapacity + entity.proximity().sum(e -> isContainer(e) ? e.block().itemCapacity : 0); entity.proximity().each(this::isContainer, t -> { @@ -97,9 +97,9 @@ public class CoreBlock extends StorageBlock{ t.ent().linkedCore = tile; }); - for(Tile other : state.teams.get(tile.getTeam()).cores){ - if(other == tile) continue; - entity.storageCapacity += other.block().itemCapacity + other.entity.proximity().sum(e -> isContainer(e) ? e.block().itemCapacity : 0); + for(TileEntity other : state.teams.cores(tile.getTeam())){ + if(other.tile == tile) continue; + entity.storageCapacity += other.block.itemCapacity + entity.proximity().sum(e -> isContainer(e) ? e.block().itemCapacity : 0); } if(!world.isGenerating()){ @@ -108,9 +108,8 @@ public class CoreBlock extends StorageBlock{ } } - for(Tile other : state.teams.get(tile.getTeam()).cores){ - CoreEntity oe = other.ent(); - oe.storageCapacity = entity.storageCapacity; + for(CoreEntity other : state.teams.cores(tile.getTeam())){ + other.storageCapacity = entity.storageCapacity; } } @@ -151,8 +150,9 @@ public class CoreBlock extends StorageBlock{ @Override public void removed(Tile tile){ - int total = tile.entity.proximity().count(e -> e.entity.items == tile.entity.items); - float fract = 1f / total / state.teams.get(tile.getTeam()).cores.size; + CoreEntity entity = tile.ent(); + int total = tile.entity.proximity().count(e -> e.entity != null && e.entity.items != null && e.entity.items == tile.entity.items); + float fract = 1f / total / state.teams.cores(tile.getTeam()).size; tile.entity.proximity().each(e -> isContainer(e) && e.entity.items == tile.entity.items, t -> { StorageBlockEntity ent = (StorageBlockEntity)t.entity; @@ -163,22 +163,23 @@ public class CoreBlock extends StorageBlock{ } }); - state.teams.get(tile.getTeam()).cores.remove(tile); + state.teams.unregisterCore(entity); - int max = itemCapacity * state.teams.get(tile.getTeam()).cores.size; + int max = itemCapacity * state.teams.cores(tile.getTeam()).size; for(Item item : content.items()){ tile.entity.items.set(item, Math.min(tile.entity.items.get(item), max)); } - for(Tile other : state.teams.get(tile.getTeam()).cores){ - other.block().onProximityUpdate(other); + for(CoreEntity other : state.teams.cores(tile.getTeam())){ + other.block.onProximityUpdate(other.tile); } } @Override public void placed(Tile tile){ super.placed(tile); - state.teams.get(tile.getTeam()).cores.add(tile); + CoreEntity entity = tile.ent(); + state.teams.registerCore(entity); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java b/core/src/mindustry/world/blocks/storage/LaunchPad.java similarity index 67% rename from core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java rename to core/src/mindustry/world/blocks/storage/LaunchPad.java index 92aa7ae75c..02cb9bbd29 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java +++ b/core/src/mindustry/world/blocks/storage/LaunchPad.java @@ -1,24 +1,24 @@ -package io.anuke.mindustry.world.blocks.storage; +package mindustry.world.blocks.storage; -import io.anuke.arc.*; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Lines; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.ItemType; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; +import arc.*; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Lines; +import arc.math.Mathf; +import arc.util.Time; +import mindustry.Vars; +import mindustry.content.Fx; +import mindustry.entities.Effects; +import mindustry.entities.type.TileEntity; +import mindustry.game.EventType.*; +import mindustry.graphics.Pal; +import mindustry.type.Item; +import mindustry.type.ItemType; +import mindustry.world.Tile; +import mindustry.world.meta.BlockStat; +import mindustry.world.meta.StatUnit; -import static io.anuke.mindustry.Vars.data; -import static io.anuke.mindustry.Vars.world; +import static mindustry.Vars.data; +import static mindustry.Vars.world; public class LaunchPad extends StorageBlock{ public final int timerLaunch = timers++; @@ -73,7 +73,7 @@ public class LaunchPad extends StorageBlock{ public void update(Tile tile){ TileEntity entity = tile.entity; - if(world.isZone() && entity.cons.valid() && world.isZone() && entity.items.total() >= itemCapacity && entity.timer.get(timerLaunch, launchTime / entity.timeScale)){ + if(world.isZone() && entity.cons.valid() && entity.items.total() >= itemCapacity && entity.timer.get(timerLaunch, launchTime / entity.timeScale)){ for(Item item : Vars.content.items()){ Events.fire(Trigger.itemLaunch); Effects.effect(Fx.padlaunch, tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java b/core/src/mindustry/world/blocks/storage/StorageBlock.java similarity index 88% rename from core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java rename to core/src/mindustry/world/blocks/storage/StorageBlock.java index 710f97fbe3..29aa7860b5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/mindustry/world/blocks/storage/StorageBlock.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.blocks.storage; +package mindustry.world.blocks.storage; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import arc.util.ArcAnnotate.*; +import mindustry.entities.type.TileEntity; +import mindustry.type.Item; +import mindustry.world.Block; +import mindustry.world.Tile; public abstract class StorageBlock extends Block{ diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/mindustry/world/blocks/storage/Unloader.java similarity index 90% rename from core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java rename to core/src/mindustry/world/blocks/storage/Unloader.java index 8186ade094..b63e7a04bb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/mindustry/world/blocks/storage/Unloader.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.world.blocks.storage; +package mindustry.world.blocks.storage; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.entities.traits.BuilderTrait.*; +import mindustry.entities.type.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; import java.io.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class Unloader extends Block{ public float speed = 1f; diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java b/core/src/mindustry/world/blocks/storage/Vault.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/storage/Vault.java rename to core/src/mindustry/world/blocks/storage/Vault.java index 4ee9cf97b7..dcfad3942f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java +++ b/core/src/mindustry/world/blocks/storage/Vault.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.storage; +package mindustry.world.blocks.storage; public class Vault extends StorageBlock{ diff --git a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java b/core/src/mindustry/world/blocks/units/CommandCenter.java similarity index 77% rename from core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java rename to core/src/mindustry/world/blocks/units/CommandCenter.java index 9423ac6cae..be82783269 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/mindustry/world/blocks/units/CommandCenter.java @@ -1,27 +1,26 @@ -package io.anuke.mindustry.world.blocks.units; +package mindustry.world.blocks.units; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.Effects.*; +import mindustry.entities.type.*; +import mindustry.entities.units.*; +import mindustry.game.EventType.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.indexer; public class CommandCenter extends Block{ protected TextureRegion[] commandRegions = new TextureRegion[UnitCommand.all.length]; @@ -58,9 +57,7 @@ public class CommandCenter extends Block{ ObjectSet set = indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter); if(set.size == 1){ - for(BaseUnit unit : unitGroups[tile.getTeam().ordinal()].all()){ - unit.onCommand(UnitCommand.all[0]); - } + Units.each(tile.getTeam(), u -> u.onCommand(UnitCommand.all[0])); } } @@ -114,12 +111,7 @@ public class CommandCenter extends Block{ } } - Team team = (player == null ? tile.getTeam() : player.getTeam()); - - for(BaseUnit unit : unitGroups[team.ordinal()].all()){ - unit.onCommand(command); - } - + Units.each(tile.getTeam(), u -> u.onCommand(command)); Events.fire(new CommandIssueEvent(tile, command)); } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java b/core/src/mindustry/world/blocks/units/MechPad.java similarity index 85% rename from core/src/io/anuke/mindustry/world/blocks/units/MechPad.java rename to core/src/mindustry/world/blocks/units/MechPad.java index 54bc28fb03..0dadebc018 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/mindustry/world/blocks/units/MechPad.java @@ -1,28 +1,28 @@ -package io.anuke.mindustry.world.blocks.units; +package mindustry.world.blocks.units; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.EnumSet; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import mindustry.annotations.Annotations.*; +import arc.struct.EnumSet; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import arc.util.ArcAnnotate.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.traits.*; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class MechPad extends Block{ public @NonNull Mech mech; @@ -112,7 +112,7 @@ public class MechPad extends Block{ MechFactoryEntity entity = tile.ent(); if(entity.player != null){ - RespawnBlock.drawRespawn(tile, entity.heat, entity.progress, entity.time, entity.player, (!entity.sameMech && entity.player.mech == mech ? mech : Mechs.starter)); + RespawnBlock.drawRespawn(tile, entity.heat, entity.progress, entity.time, entity.player, (!entity.sameMech && entity.player.mech == mech ? Mechs.starter : mech)); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/RallyPoint.java b/core/src/mindustry/world/blocks/units/RallyPoint.java similarity index 53% rename from core/src/io/anuke/mindustry/world/blocks/units/RallyPoint.java rename to core/src/mindustry/world/blocks/units/RallyPoint.java index c4d467a19b..c79e08e3e4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RallyPoint.java +++ b/core/src/mindustry/world/blocks/units/RallyPoint.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.units; +package mindustry.world.blocks.units; -import io.anuke.arc.collection.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.struct.*; +import mindustry.world.*; +import mindustry.world.meta.*; public class RallyPoint extends Block{ diff --git a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java b/core/src/mindustry/world/blocks/units/RepairPoint.java similarity index 84% rename from core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java rename to core/src/mindustry/world/blocks/units/RepairPoint.java index 11b8fd89e6..a17fffe1b1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/mindustry/world/blocks/units/RepairPoint.java @@ -1,25 +1,25 @@ -package io.anuke.mindustry.world.blocks.units; +package mindustry.world.blocks.units; -import io.anuke.arc.Core; -import io.anuke.arc.collection.EnumSet; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Rectangle; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.*; +import arc.Core; +import arc.struct.EnumSet; +import arc.graphics.Color; +import arc.graphics.g2d.*; +import arc.math.Angles; +import arc.math.Mathf; +import arc.math.geom.Rect; +import arc.util.Time; +import mindustry.entities.Units; +import mindustry.entities.type.TileEntity; +import mindustry.entities.type.Unit; +import mindustry.graphics.*; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class RepairPoint extends Block{ - private static Rectangle rect = new Rectangle(); + private static Rect rect = new Rect(); public int timerTarget = timers++; diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java similarity index 85% rename from core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java rename to core/src/mindustry/world/blocks/units/UnitFactory.java index 8879f991b5..ac3e20f0bb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -1,30 +1,30 @@ -package io.anuke.mindustry.world.blocks.units; +package mindustry.world.blocks.units; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.*; -import io.anuke.arc.collection.EnumSet; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.graphics.Shaders; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Bar; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.consumers.ConsumeItems; -import io.anuke.mindustry.world.consumers.ConsumeType; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import mindustry.annotations.Annotations.Loc; +import mindustry.annotations.Annotations.Remote; +import arc.struct.EnumSet; +import arc.graphics.g2d.*; +import arc.math.Mathf; +import mindustry.Vars; +import mindustry.content.Fx; +import mindustry.entities.Effects; +import mindustry.entities.type.*; +import mindustry.game.EventType.*; +import mindustry.gen.Call; +import mindustry.graphics.Pal; +import mindustry.graphics.Shaders; +import mindustry.type.*; +import mindustry.ui.Bar; +import mindustry.ui.Cicon; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.consumers.ConsumeItems; +import mindustry.world.consumers.ConsumeType; +import mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class UnitFactory extends Block{ public UnitType unitType; diff --git a/core/src/io/anuke/mindustry/world/consumers/Consume.java b/core/src/mindustry/world/consumers/Consume.java similarity index 86% rename from core/src/io/anuke/mindustry/world/consumers/Consume.java rename to core/src/mindustry/world/consumers/Consume.java index 2e176cc670..b419f68d13 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consume.java +++ b/core/src/mindustry/world/consumers/Consume.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.consumers; +package mindustry.world.consumers; -import io.anuke.arc.collection.*; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockStats; +import arc.struct.*; +import arc.scene.ui.layout.Table; +import mindustry.entities.type.TileEntity; +import mindustry.world.Tile; +import mindustry.world.meta.BlockStats; /** An abstract class that defines a type of resource that a block can consume. */ public abstract class Consume{ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java similarity index 78% rename from core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java rename to core/src/mindustry/world/consumers/ConsumeItemFilter.java index 93e05c17aa..2dcab1a841 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -1,18 +1,18 @@ -package io.anuke.mindustry.world.consumers; +package mindustry.world.consumers; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.meta.values.*; +import arc.struct.*; +import arc.func.*; +import arc.scene.ui.layout.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.type.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.world.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class ConsumeItemFilter extends Consume{ public final @NonNull diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java b/core/src/mindustry/world/consumers/ConsumeItems.java similarity index 77% rename from core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java rename to core/src/mindustry/world/consumers/ConsumeItems.java index 0b5c7bc5bc..c5f904bfeb 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/mindustry/world/consumers/ConsumeItems.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.world.consumers; +package mindustry.world.consumers; -import io.anuke.arc.collection.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; -import io.anuke.mindustry.world.meta.values.*; +import arc.struct.*; +import arc.scene.ui.layout.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.type.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.world.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; public class ConsumeItems extends Consume{ public final @NonNull ItemStack[] items; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/mindustry/world/consumers/ConsumeLiquid.java similarity index 74% rename from core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java rename to core/src/mindustry/world/consumers/ConsumeLiquid.java index faaf5dc4ca..dcb318150a 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquid.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.world.consumers; +package mindustry.world.consumers; -import io.anuke.arc.collection.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.meta.*; +import arc.struct.*; +import arc.scene.ui.layout.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.type.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.ui.Cicon; +import mindustry.world.*; +import mindustry.world.meta.*; public class ConsumeLiquid extends ConsumeLiquidBase{ public final @NonNull Liquid liquid; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidBase.java b/core/src/mindustry/world/consumers/ConsumeLiquidBase.java similarity index 89% rename from core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidBase.java rename to core/src/mindustry/world/consumers/ConsumeLiquidBase.java index 34190338f2..229121863d 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidBase.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidBase.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.consumers; +package mindustry.world.consumers; -import io.anuke.mindustry.entities.type.TileEntity; +import mindustry.entities.type.TileEntity; public abstract class ConsumeLiquidBase extends Consume{ /** amount used per frame */ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java similarity index 70% rename from core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java rename to core/src/mindustry/world/consumers/ConsumeLiquidFilter.java index 1da3e86e50..9d8450cfb8 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.world.consumers; +package mindustry.world.consumers; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.Boolf; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.ui.MultiReqImage; -import io.anuke.mindustry.ui.ReqImage; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.BlockStats; -import io.anuke.mindustry.world.meta.values.LiquidFilterValue; +import arc.struct.*; +import arc.func.Boolf; +import arc.scene.ui.layout.Table; +import mindustry.entities.type.TileEntity; +import mindustry.type.Liquid; +import mindustry.ui.Cicon; +import mindustry.ui.MultiReqImage; +import mindustry.ui.ReqImage; +import mindustry.world.Tile; +import mindustry.world.meta.BlockStat; +import mindustry.world.meta.BlockStats; +import mindustry.world.meta.values.LiquidFilterValue; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class ConsumeLiquidFilter extends ConsumeLiquidBase{ public final Boolf filter; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java b/core/src/mindustry/world/consumers/ConsumePower.java similarity index 90% rename from core/src/io/anuke/mindustry/world/consumers/ConsumePower.java rename to core/src/mindustry/world/consumers/ConsumePower.java index 3343332fc4..5df011349a 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java +++ b/core/src/mindustry/world/consumers/ConsumePower.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.consumers; +package mindustry.world.consumers; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.*; +import arc.math.Mathf; +import arc.scene.ui.layout.Table; +import mindustry.entities.type.TileEntity; +import mindustry.world.Tile; +import mindustry.world.meta.*; /** Consumer class for blocks which consume power while being connected to a power graph. */ public class ConsumePower extends Consume{ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeType.java b/core/src/mindustry/world/consumers/ConsumeType.java similarity index 57% rename from core/src/io/anuke/mindustry/world/consumers/ConsumeType.java rename to core/src/mindustry/world/consumers/ConsumeType.java index 572332f9df..9a68a050cc 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeType.java +++ b/core/src/mindustry/world/consumers/ConsumeType.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.consumers; +package mindustry.world.consumers; public enum ConsumeType{ item, diff --git a/core/src/io/anuke/mindustry/world/consumers/Consumers.java b/core/src/mindustry/world/consumers/Consumers.java similarity index 88% rename from core/src/io/anuke/mindustry/world/consumers/Consumers.java rename to core/src/mindustry/world/consumers/Consumers.java index 2c66a03596..b6ebd7391a 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consumers.java +++ b/core/src/mindustry/world/consumers/Consumers.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world.consumers; +package mindustry.world.consumers; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.Boolf; -import io.anuke.arc.util.Structs; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.blocks.power.ConditionalConsumePower; -import io.anuke.mindustry.world.meta.BlockStats; +import arc.struct.*; +import arc.func.Boolf; +import arc.util.Structs; +import mindustry.Vars; +import mindustry.entities.type.TileEntity; +import mindustry.type.*; +import mindustry.world.blocks.power.ConditionalConsumePower; +import mindustry.world.meta.BlockStats; public class Consumers{ private Consume[] map = new Consume[ConsumeType.values().length]; diff --git a/core/src/io/anuke/mindustry/world/meta/Attribute.java b/core/src/mindustry/world/meta/Attribute.java similarity index 90% rename from core/src/io/anuke/mindustry/world/meta/Attribute.java rename to core/src/mindustry/world/meta/Attribute.java index 0604adeba2..815f471c9d 100644 --- a/core/src/io/anuke/mindustry/world/meta/Attribute.java +++ b/core/src/mindustry/world/meta/Attribute.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; public enum Attribute{ /** Heat of this block. Used for calculating output of thermal generators. */ diff --git a/core/src/io/anuke/mindustry/world/meta/BlockBars.java b/core/src/mindustry/world/meta/BlockBars.java similarity index 72% rename from core/src/io/anuke/mindustry/world/meta/BlockBars.java rename to core/src/mindustry/world/meta/BlockBars.java index 11706bc510..5b319332ce 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockBars.java +++ b/core/src/mindustry/world/meta/BlockBars.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; -import io.anuke.arc.collection.OrderedMap; -import io.anuke.arc.func.Func; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.ui.Bar; +import arc.struct.OrderedMap; +import arc.func.Func; +import mindustry.entities.type.TileEntity; +import mindustry.ui.Bar; public class BlockBars{ private OrderedMap> bars = new OrderedMap<>(); diff --git a/core/src/io/anuke/mindustry/world/meta/BlockFlag.java b/core/src/mindustry/world/meta/BlockFlag.java similarity index 92% rename from core/src/io/anuke/mindustry/world/meta/BlockFlag.java rename to core/src/mindustry/world/meta/BlockFlag.java index 477d6a6ce6..0fd2ca9c43 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockFlag.java +++ b/core/src/mindustry/world/meta/BlockFlag.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; /** Stores special flags of blocks for easy querying. */ public enum BlockFlag{ diff --git a/core/src/io/anuke/mindustry/world/meta/BlockGroup.java b/core/src/mindustry/world/meta/BlockGroup.java similarity index 70% rename from core/src/io/anuke/mindustry/world/meta/BlockGroup.java rename to core/src/mindustry/world/meta/BlockGroup.java index dd90943ea0..24e8166990 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockGroup.java +++ b/core/src/mindustry/world/meta/BlockGroup.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; public enum BlockGroup{ none, walls, turrets, transportation, power, liquids, drills diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStat.java b/core/src/mindustry/world/meta/BlockStat.java similarity index 96% rename from core/src/io/anuke/mindustry/world/meta/BlockStat.java rename to core/src/mindustry/world/meta/BlockStat.java index 7cea1a1277..162df3dd37 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStat.java +++ b/core/src/mindustry/world/meta/BlockStat.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; -import io.anuke.arc.Core; +import arc.Core; import java.util.Locale; diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStats.java b/core/src/mindustry/world/meta/BlockStats.java similarity index 90% rename from core/src/io/anuke/mindustry/world/meta/BlockStats.java rename to core/src/mindustry/world/meta/BlockStats.java index dbf3ea0afc..931482a49a 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStats.java +++ b/core/src/mindustry/world/meta/BlockStats.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.ObjectMap.Entry; -import io.anuke.arc.collection.OrderedMap; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.meta.values.*; +import arc.struct.Array; +import arc.struct.ObjectMap.Entry; +import arc.struct.OrderedMap; +import mindustry.type.*; +import mindustry.world.meta.values.*; /** Hold and organizes a list of block stats. */ public class BlockStats{ diff --git a/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java b/core/src/mindustry/world/meta/BuildVisibility.java similarity index 82% rename from core/src/io/anuke/mindustry/world/meta/BuildVisibility.java rename to core/src/mindustry/world/meta/BuildVisibility.java index 6197312ebc..e26e29e86b 100644 --- a/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java +++ b/core/src/mindustry/world/meta/BuildVisibility.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; -import io.anuke.arc.func.*; -import io.anuke.mindustry.*; +import arc.func.*; +import mindustry.*; public enum BuildVisibility{ hidden(() -> false), diff --git a/core/src/io/anuke/mindustry/world/meta/PowerType.java b/core/src/mindustry/world/meta/PowerType.java similarity index 62% rename from core/src/io/anuke/mindustry/world/meta/PowerType.java rename to core/src/mindustry/world/meta/PowerType.java index 2c1ba8eb81..3f870ce85a 100644 --- a/core/src/io/anuke/mindustry/world/meta/PowerType.java +++ b/core/src/mindustry/world/meta/PowerType.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; public enum PowerType{ consumer, diff --git a/core/src/io/anuke/mindustry/world/meta/Producers.java b/core/src/mindustry/world/meta/Producers.java similarity index 77% rename from core/src/io/anuke/mindustry/world/meta/Producers.java rename to core/src/mindustry/world/meta/Producers.java index 2b430ee28a..576341b4ad 100644 --- a/core/src/io/anuke/mindustry/world/meta/Producers.java +++ b/core/src/mindustry/world/meta/Producers.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; -import io.anuke.mindustry.ctype.Content; +import mindustry.ctype.Content; public class Producers{ private Content output; diff --git a/core/src/io/anuke/mindustry/world/meta/StatCategory.java b/core/src/mindustry/world/meta/StatCategory.java similarity index 79% rename from core/src/io/anuke/mindustry/world/meta/StatCategory.java rename to core/src/mindustry/world/meta/StatCategory.java index fa7944c55f..5f244674a4 100644 --- a/core/src/io/anuke/mindustry/world/meta/StatCategory.java +++ b/core/src/mindustry/world/meta/StatCategory.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; -import io.anuke.arc.Core; +import arc.Core; /** A specific category for a stat. */ public enum StatCategory{ diff --git a/core/src/io/anuke/mindustry/world/meta/StatUnit.java b/core/src/mindustry/world/meta/StatUnit.java similarity index 90% rename from core/src/io/anuke/mindustry/world/meta/StatUnit.java rename to core/src/mindustry/world/meta/StatUnit.java index 3b22ad68a5..5136280e8a 100644 --- a/core/src/io/anuke/mindustry/world/meta/StatUnit.java +++ b/core/src/mindustry/world/meta/StatUnit.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; -import io.anuke.arc.Core; +import arc.Core; import java.util.Locale; diff --git a/core/src/io/anuke/mindustry/world/meta/StatValue.java b/core/src/mindustry/world/meta/StatValue.java similarity index 79% rename from core/src/io/anuke/mindustry/world/meta/StatValue.java rename to core/src/mindustry/world/meta/StatValue.java index fd1e8a69bc..1a978b71e9 100644 --- a/core/src/io/anuke/mindustry/world/meta/StatValue.java +++ b/core/src/mindustry/world/meta/StatValue.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.meta; +package mindustry.world.meta; -import io.anuke.arc.scene.ui.layout.Table; +import arc.scene.ui.layout.Table; /** * A base interface for a value of a stat that is displayed. diff --git a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java b/core/src/mindustry/world/meta/values/AmmoListValue.java similarity index 82% rename from core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java rename to core/src/mindustry/world/meta/values/AmmoListValue.java index c19503c5d1..3819be4e48 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/mindustry/world/meta/values/AmmoListValue.java @@ -1,19 +1,19 @@ -package io.anuke.mindustry.world.meta.values; +package mindustry.world.meta.values; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.UnlockableContent; -import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.struct.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.ctype.UnlockableContent; +import mindustry.entities.bullet.*; +import mindustry.gen.*; +import mindustry.ui.Cicon; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.tilesize; +import static mindustry.Vars.tilesize; public class AmmoListValue implements StatValue{ private final ObjectMap map; diff --git a/core/src/io/anuke/mindustry/world/meta/values/BooleanValue.java b/core/src/mindustry/world/meta/values/BooleanValue.java similarity index 65% rename from core/src/io/anuke/mindustry/world/meta/values/BooleanValue.java rename to core/src/mindustry/world/meta/values/BooleanValue.java index 49e2967e7e..7f399ca702 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/BooleanValue.java +++ b/core/src/mindustry/world/meta/values/BooleanValue.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.meta.values; +package mindustry.world.meta.values; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.world.meta.StatValue; +import arc.scene.ui.layout.Table; +import mindustry.world.meta.StatValue; public class BooleanValue implements StatValue{ private final boolean value; diff --git a/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java b/core/src/mindustry/world/meta/values/BoosterListValue.java similarity index 81% rename from core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java rename to core/src/mindustry/world/meta/values/BoosterListValue.java index 30c1ff0765..40d0b21d13 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java +++ b/core/src/mindustry/world/meta/values/BoosterListValue.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.world.meta.values; +package mindustry.world.meta.values; -import io.anuke.arc.*; -import io.anuke.arc.func.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Cicon; -import io.anuke.mindustry.world.meta.*; +import arc.*; +import arc.func.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.ui.Cicon; +import mindustry.world.meta.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class BoosterListValue implements StatValue{ protected float reload, maxUsed, multiplier; diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java b/core/src/mindustry/world/meta/values/ItemFilterValue.java similarity index 61% rename from core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java rename to core/src/mindustry/world/meta/values/ItemFilterValue.java index 2bdaa32377..72928e173f 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java +++ b/core/src/mindustry/world/meta/values/ItemFilterValue.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world.meta.values; +package mindustry.world.meta.values; -import io.anuke.arc.collection.Array; -import io.anuke.arc.func.Boolf; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.ui.ItemDisplay; -import io.anuke.mindustry.world.meta.StatValue; +import arc.struct.Array; +import arc.func.Boolf; +import arc.scene.ui.layout.Table; +import mindustry.type.Item; +import mindustry.ui.ItemDisplay; +import mindustry.world.meta.StatValue; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class ItemFilterValue implements StatValue{ private final Boolf filter; diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java b/core/src/mindustry/world/meta/values/ItemListValue.java similarity index 71% rename from core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java rename to core/src/mindustry/world/meta/values/ItemListValue.java index 87d7732718..f6e1acc654 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/ItemListValue.java +++ b/core/src/mindustry/world/meta/values/ItemListValue.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.meta.values; +package mindustry.world.meta.values; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.ui.ItemDisplay; -import io.anuke.mindustry.world.meta.StatValue; +import arc.scene.ui.layout.Table; +import mindustry.type.ItemStack; +import mindustry.ui.ItemDisplay; +import mindustry.world.meta.StatValue; public class ItemListValue implements StatValue{ private final ItemStack[] stacks; diff --git a/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java b/core/src/mindustry/world/meta/values/LiquidFilterValue.java similarity index 70% rename from core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java rename to core/src/mindustry/world/meta/values/LiquidFilterValue.java index 99f6ea4a31..9e44f97ed2 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java +++ b/core/src/mindustry/world/meta/values/LiquidFilterValue.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world.meta.values; +package mindustry.world.meta.values; -import io.anuke.arc.collection.Array; -import io.anuke.arc.func.Boolf; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.ui.LiquidDisplay; -import io.anuke.mindustry.world.meta.StatValue; +import arc.struct.Array; +import arc.func.Boolf; +import arc.scene.ui.layout.Table; +import mindustry.type.Liquid; +import mindustry.ui.LiquidDisplay; +import mindustry.world.meta.StatValue; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class LiquidFilterValue implements StatValue{ private final Boolf filter; diff --git a/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java b/core/src/mindustry/world/meta/values/LiquidValue.java similarity index 67% rename from core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java rename to core/src/mindustry/world/meta/values/LiquidValue.java index be6eabc3f1..f6782da6ae 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/LiquidValue.java +++ b/core/src/mindustry/world/meta/values/LiquidValue.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.meta.values; +package mindustry.world.meta.values; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.ui.LiquidDisplay; -import io.anuke.mindustry.world.meta.StatValue; +import arc.scene.ui.layout.Table; +import mindustry.type.Liquid; +import mindustry.ui.LiquidDisplay; +import mindustry.world.meta.StatValue; public class LiquidValue implements StatValue{ private final Liquid liquid; diff --git a/core/src/io/anuke/mindustry/world/meta/values/NumberValue.java b/core/src/mindustry/world/meta/values/NumberValue.java similarity index 74% rename from core/src/io/anuke/mindustry/world/meta/values/NumberValue.java rename to core/src/mindustry/world/meta/values/NumberValue.java index 11080bc7b3..fd10d28f1d 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/NumberValue.java +++ b/core/src/mindustry/world/meta/values/NumberValue.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.meta.values; +package mindustry.world.meta.values; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.util.Strings; -import io.anuke.mindustry.world.meta.StatUnit; -import io.anuke.mindustry.world.meta.StatValue; +import arc.scene.ui.layout.Table; +import arc.util.Strings; +import mindustry.world.meta.StatUnit; +import mindustry.world.meta.StatValue; /** * A stat that is a number with a unit attacked. diff --git a/core/src/io/anuke/mindustry/world/meta/values/StringValue.java b/core/src/mindustry/world/meta/values/StringValue.java similarity index 62% rename from core/src/io/anuke/mindustry/world/meta/values/StringValue.java rename to core/src/mindustry/world/meta/values/StringValue.java index 1b90d6b2ca..4bc102a8d4 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/StringValue.java +++ b/core/src/mindustry/world/meta/values/StringValue.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.meta.values; +package mindustry.world.meta.values; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.util.Strings; -import io.anuke.mindustry.world.meta.StatValue; +import arc.scene.ui.layout.Table; +import arc.util.Strings; +import mindustry.world.meta.StatValue; public class StringValue implements StatValue{ private final String value; diff --git a/core/src/io/anuke/mindustry/world/modules/BlockModule.java b/core/src/mindustry/world/modules/BlockModule.java similarity index 86% rename from core/src/io/anuke/mindustry/world/modules/BlockModule.java rename to core/src/mindustry/world/modules/BlockModule.java index 377ba9c099..6d00713944 100644 --- a/core/src/io/anuke/mindustry/world/modules/BlockModule.java +++ b/core/src/mindustry/world/modules/BlockModule.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.modules; +package mindustry.world.modules; import java.io.*; diff --git a/core/src/io/anuke/mindustry/world/modules/ConsumeModule.java b/core/src/mindustry/world/modules/ConsumeModule.java similarity index 92% rename from core/src/io/anuke/mindustry/world/modules/ConsumeModule.java rename to core/src/mindustry/world/modules/ConsumeModule.java index 29252af34d..44f8d471d4 100644 --- a/core/src/io/anuke/mindustry/world/modules/ConsumeModule.java +++ b/core/src/mindustry/world/modules/ConsumeModule.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.modules; +package mindustry.world.modules; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.world.consumers.Consume; +import mindustry.entities.type.TileEntity; +import mindustry.world.consumers.Consume; import java.io.*; diff --git a/core/src/io/anuke/mindustry/world/modules/ItemModule.java b/core/src/mindustry/world/modules/ItemModule.java similarity index 95% rename from core/src/io/anuke/mindustry/world/modules/ItemModule.java rename to core/src/mindustry/world/modules/ItemModule.java index 7e146d8ab0..8fc338dcbd 100644 --- a/core/src/io/anuke/mindustry/world/modules/ItemModule.java +++ b/core/src/mindustry/world/modules/ItemModule.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.world.modules; +package mindustry.world.modules; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.ItemStack; +import mindustry.type.Item; +import mindustry.type.ItemStack; import java.io.*; import java.util.Arrays; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class ItemModule extends BlockModule{ private int[] items = new int[content.items().size]; diff --git a/core/src/io/anuke/mindustry/world/modules/LiquidModule.java b/core/src/mindustry/world/modules/LiquidModule.java similarity index 95% rename from core/src/io/anuke/mindustry/world/modules/LiquidModule.java rename to core/src/mindustry/world/modules/LiquidModule.java index c0cce49dac..19ad109341 100644 --- a/core/src/io/anuke/mindustry/world/modules/LiquidModule.java +++ b/core/src/mindustry/world/modules/LiquidModule.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.world.modules; +package mindustry.world.modules; -import io.anuke.arc.math.*; -import io.anuke.mindustry.type.Liquid; +import arc.math.*; +import mindustry.type.Liquid; import java.io.*; import java.util.Arrays; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; public class LiquidModule extends BlockModule{ private float[] liquids = new float[content.liquids().size]; diff --git a/core/src/io/anuke/mindustry/world/modules/PowerModule.java b/core/src/mindustry/world/modules/PowerModule.java similarity index 89% rename from core/src/io/anuke/mindustry/world/modules/PowerModule.java rename to core/src/mindustry/world/modules/PowerModule.java index f0c76e2aaf..e1500f85e7 100644 --- a/core/src/io/anuke/mindustry/world/modules/PowerModule.java +++ b/core/src/mindustry/world/modules/PowerModule.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.modules; +package mindustry.world.modules; -import io.anuke.arc.collection.IntArray; -import io.anuke.mindustry.world.blocks.power.PowerGraph; +import arc.struct.IntArray; +import mindustry.world.blocks.power.PowerGraph; import java.io.DataInput; import java.io.DataOutput; diff --git a/core/src/mindustry/world/producers/Produce.java b/core/src/mindustry/world/producers/Produce.java new file mode 100644 index 0000000000..478e9f35d9 --- /dev/null +++ b/core/src/mindustry/world/producers/Produce.java @@ -0,0 +1,4 @@ +package mindustry.world.producers; + +public class Produce{ +} diff --git a/core/src/mindustry/world/producers/ProduceItem.java b/core/src/mindustry/world/producers/ProduceItem.java new file mode 100644 index 0000000000..8f0b5129fb --- /dev/null +++ b/core/src/mindustry/world/producers/ProduceItem.java @@ -0,0 +1,4 @@ +package mindustry.world.producers; + +public class ProduceItem{ +} diff --git a/desktop/build.gradle b/desktop/build.gradle index acf5e0ae79..d03320d394 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -6,7 +6,7 @@ apply plugin: "java" sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = [ "src/" ] -project.ext.mainClassName = "io.anuke.mindustry.desktop.DesktopLauncher" +project.ext.mainClassName = "mindustry.desktop.DesktopLauncher" project.ext.assetsDir = new File("../core/assets") def enableTemplates = true @@ -33,7 +33,7 @@ task run(dependsOn: classes, type: JavaExec){ } if(args.contains("debug")){ - main = "io.anuke.mindustry.DebugLauncher" + main = "mindustry.debug.DebugLauncher" } } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/mindustry/desktop/DesktopLauncher.java similarity index 93% rename from desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java rename to desktop/src/mindustry/desktop/DesktopLauncher.java index b1b76c171a..b09894e521 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/mindustry/desktop/DesktopLauncher.java @@ -1,32 +1,32 @@ -package io.anuke.mindustry.desktop; +package mindustry.desktop; +import arc.*; +import arc.Files.*; +import arc.backend.sdl.*; +import arc.files.*; +import arc.func.*; +import arc.math.*; +import arc.struct.*; +import arc.util.*; +import arc.util.serialization.*; import club.minnced.discord.rpc.*; import com.codedisaster.steamworks.*; -import io.anuke.arc.*; -import io.anuke.arc.Files.*; -import io.anuke.arc.backends.sdl.*; import io.anuke.arc.backends.sdl.jni.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.desktop.steam.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.net.Net.*; -import io.anuke.mindustry.type.*; +import mindustry.*; +import mindustry.core.GameState.*; +import mindustry.core.*; +import mindustry.desktop.steam.*; +import mindustry.game.EventType.*; +import mindustry.net.*; +import mindustry.net.Net.*; +import mindustry.type.*; import java.io.*; import java.net.*; import java.nio.charset.*; import java.util.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class DesktopLauncher extends ClientLauncher{ public final static String discordID = "610508934456934412"; @@ -280,7 +280,7 @@ public class DesktopLauncher extends ClientLauncher{ if(steam){ try{ byte[] result = new byte[8]; - new RandomXS128(SVars.user.user.getSteamID().getAccountID()).nextBytes(result); + new Rand(SVars.user.user.getSteamID().getAccountID()).nextBytes(result); return new String(Base64Coder.encode(result)); }catch(Exception e){ e.printStackTrace(); diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SAchievement.java b/desktop/src/mindustry/desktop/steam/SAchievement.java similarity index 98% rename from desktop/src/io/anuke/mindustry/desktop/steam/SAchievement.java rename to desktop/src/mindustry/desktop/steam/SAchievement.java index 8ca7681b5a..d7c8390cd6 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SAchievement.java +++ b/desktop/src/mindustry/desktop/steam/SAchievement.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.desktop.steam; +package mindustry.desktop.steam; public enum SAchievement{ completeTutorial, diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java b/desktop/src/mindustry/desktop/steam/SNet.java similarity index 96% rename from desktop/src/io/anuke/mindustry/desktop/steam/SNet.java rename to desktop/src/mindustry/desktop/steam/SNet.java index a3c8e5b178..cb23befebe 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java +++ b/desktop/src/mindustry/desktop/steam/SNet.java @@ -1,28 +1,28 @@ -package io.anuke.mindustry.desktop.steam; +package mindustry.desktop.steam; +import arc.*; import com.codedisaster.steamworks.*; import com.codedisaster.steamworks.SteamFriends.*; import com.codedisaster.steamworks.SteamMatchmaking.*; import com.codedisaster.steamworks.SteamNetworking.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.func.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.core.Version; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.net.ArcNetProvider.*; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.net.Net.*; -import io.anuke.mindustry.net.Packets.*; +import arc.struct.*; +import arc.func.*; +import arc.util.*; +import arc.util.pooling.*; +import mindustry.core.GameState.*; +import mindustry.core.Version; +import mindustry.game.EventType.*; +import mindustry.game.*; +import mindustry.net.ArcNetProvider.*; +import mindustry.net.*; +import mindustry.net.Net.*; +import mindustry.net.Packets.*; import java.io.*; import java.nio.*; import java.util.concurrent.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, SteamFriendsCallback, NetProvider{ public final SteamNetworking snet = new SteamNetworking(this); diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SStat.java b/desktop/src/mindustry/desktop/steam/SStat.java similarity index 94% rename from desktop/src/io/anuke/mindustry/desktop/steam/SStat.java rename to desktop/src/mindustry/desktop/steam/SStat.java index 900e5a6cde..b9438350f0 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SStat.java +++ b/desktop/src/mindustry/desktop/steam/SStat.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.desktop.steam; +package mindustry.desktop.steam; public enum SStat{ unitsDestroyed, diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java b/desktop/src/mindustry/desktop/steam/SStats.java similarity index 90% rename from desktop/src/io/anuke/mindustry/desktop/steam/SStats.java rename to desktop/src/mindustry/desktop/steam/SStats.java index 7c083d5546..950bffc249 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java +++ b/desktop/src/mindustry/desktop/steam/SStats.java @@ -1,20 +1,19 @@ -package io.anuke.mindustry.desktop.steam; +package mindustry.desktop.steam; +import arc.*; +import arc.struct.*; +import arc.util.*; import com.codedisaster.steamworks.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Stats.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.type.*; +import mindustry.entities.units.*; +import mindustry.game.EventType.*; +import mindustry.game.Stats.*; +import mindustry.type.*; -import static io.anuke.mindustry.Vars.*; -import static io.anuke.mindustry.desktop.steam.SAchievement.*; +import static mindustry.Vars.*; +import static mindustry.desktop.steam.SAchievement.*; @SuppressWarnings("unchecked") public class SStats implements SteamUserStatsCallback{ @@ -55,18 +54,18 @@ public class SStats implements SteamUserStatsCallback{ private void checkUpdate(){ if(campaign()){ - SStat.maxUnitActive.max(unitGroups[player.getTeam().ordinal()].size()); + SStat.maxUnitActive.max(unitGroup.count(t -> t.getTeam() == player.getTeam())); - if(unitGroups[player.getTeam().ordinal()].count(u -> u.getType() == UnitTypes.phantom) >= 10){ + if(unitGroup.count(u -> u.getType() == UnitTypes.phantom && u.getTeam() == player.getTeam()) >= 10){ active10Phantoms.complete(); } - if(unitGroups[player.getTeam().ordinal()].count(u -> u.getType() == UnitTypes.crawler) >= 50){ + if(unitGroup.count(u -> u.getType() == UnitTypes.crawler && u.getTeam() == player.getTeam()) >= 50){ active50Crawlers.complete(); } - for(Tile tile : state.teams.get(player.getTeam()).cores){ - if(!content.items().contains(i -> i.type == ItemType.material && tile.entity.items.get(i) < tile.block().itemCapacity)){ + for(TileEntity entity : player.getTeam().cores()){ + if(!content.items().contains(i -> i.type == ItemType.material && entity.items.get(i) < entity.block.itemCapacity)){ fillCoreAllCampaign.complete(); break; } diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SUser.java b/desktop/src/mindustry/desktop/steam/SUser.java similarity index 92% rename from desktop/src/io/anuke/mindustry/desktop/steam/SUser.java rename to desktop/src/mindustry/desktop/steam/SUser.java index 6e828b36c7..730b12763e 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SUser.java +++ b/desktop/src/mindustry/desktop/steam/SUser.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.desktop.steam; +package mindustry.desktop.steam; import com.codedisaster.steamworks.*; import com.codedisaster.steamworks.SteamAuth.*; diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SVars.java b/desktop/src/mindustry/desktop/steam/SVars.java similarity index 82% rename from desktop/src/io/anuke/mindustry/desktop/steam/SVars.java rename to desktop/src/mindustry/desktop/steam/SVars.java index d4c669cde6..599f9f912a 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SVars.java +++ b/desktop/src/mindustry/desktop/steam/SVars.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.desktop.steam; +package mindustry.desktop.steam; public class SVars{ public final static int steamID = 1127400; diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java b/desktop/src/mindustry/desktop/steam/SWorkshop.java similarity index 96% rename from desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java rename to desktop/src/mindustry/desktop/steam/SWorkshop.java index 480830e1e3..4ede21944e 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java +++ b/desktop/src/mindustry/desktop/steam/SWorkshop.java @@ -1,22 +1,22 @@ -package io.anuke.mindustry.desktop.steam; +package mindustry.desktop.steam; +import arc.*; import com.codedisaster.steamworks.*; import com.codedisaster.steamworks.SteamRemoteStorage.*; import com.codedisaster.steamworks.SteamUGC.*; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.scene.ui.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.dialogs.*; +import arc.struct.*; +import arc.files.*; +import arc.func.*; +import arc.scene.ui.*; +import arc.util.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.maps.*; +import mindustry.mod.Mods.*; +import mindustry.type.*; +import mindustry.ui.dialogs.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class SWorkshop implements SteamUGCCallback{ public final SteamUGC ugc = new SteamUGC(this); diff --git a/fastlane/metadata/android/en-US/changelogs/102.1.txt b/fastlane/metadata/android/en-US/changelogs/102.1.txt new file mode 100644 index 0000000000..f8244a4b0b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/102.1.txt @@ -0,0 +1,5 @@ +- Added new map view w/ panning and scrolling +- Added block health rule +- Added more internal teams for alternative gamemodes +- Added features for improved server modding +- Major internal change: package is now "mindustry" instead of "io.anuke.mindustry" (will break plugins) diff --git a/fastlane/metadata/android/en-US/changelogs/102.2.txt b/fastlane/metadata/android/en-US/changelogs/102.2.txt new file mode 100644 index 0000000000..f8244a4b0b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/102.2.txt @@ -0,0 +1,5 @@ +- Added new map view w/ panning and scrolling +- Added block health rule +- Added more internal teams for alternative gamemodes +- Added features for improved server modding +- Major internal change: package is now "mindustry" instead of "io.anuke.mindustry" (will break plugins) diff --git a/fastlane/metadata/android/en-US/changelogs/102.txt b/fastlane/metadata/android/en-US/changelogs/102.txt new file mode 100644 index 0000000000..f8244a4b0b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/102.txt @@ -0,0 +1,5 @@ +- Added new map view w/ panning and scrolling +- Added block health rule +- Added more internal teams for alternative gamemodes +- Added features for improved server modding +- Major internal change: package is now "mindustry" instead of "io.anuke.mindustry" (will break plugins) diff --git a/fastlane/metadata/android/en-US/changelogs/29561.txt b/fastlane/metadata/android/en-US/changelogs/29561.txt new file mode 100644 index 0000000000..f8244a4b0b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29561.txt @@ -0,0 +1,5 @@ +- Added new map view w/ panning and scrolling +- Added block health rule +- Added more internal teams for alternative gamemodes +- Added features for improved server modding +- Major internal change: package is now "mindustry" instead of "io.anuke.mindustry" (will break plugins) diff --git a/fastlane/metadata/android/en-US/changelogs/29564.txt b/fastlane/metadata/android/en-US/changelogs/29564.txt new file mode 100644 index 0000000000..f8244a4b0b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29564.txt @@ -0,0 +1,5 @@ +- Added new map view w/ panning and scrolling +- Added block health rule +- Added more internal teams for alternative gamemodes +- Added features for improved server modding +- Major internal change: package is now "mindustry" instead of "io.anuke.mindustry" (will break plugins) diff --git a/fastlane/metadata/android/en-US/changelogs/29567.txt b/fastlane/metadata/android/en-US/changelogs/29567.txt new file mode 100644 index 0000000000..f8244a4b0b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29567.txt @@ -0,0 +1,5 @@ +- Added new map view w/ panning and scrolling +- Added block health rule +- Added more internal teams for alternative gamemodes +- Added features for improved server modding +- Major internal change: package is now "mindustry" instead of "io.anuke.mindustry" (will break plugins) diff --git a/fastlane/metadata/android/en-US/changelogs/29570.txt b/fastlane/metadata/android/en-US/changelogs/29570.txt new file mode 100644 index 0000000000..f8244a4b0b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29570.txt @@ -0,0 +1,5 @@ +- Added new map view w/ panning and scrolling +- Added block health rule +- Added more internal teams for alternative gamemodes +- Added features for improved server modding +- Major internal change: package is now "mindustry" instead of "io.anuke.mindustry" (will break plugins) diff --git a/fastlane/metadata/android/en-US/changelogs/29573.txt b/fastlane/metadata/android/en-US/changelogs/29573.txt new file mode 100644 index 0000000000..f8244a4b0b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29573.txt @@ -0,0 +1,5 @@ +- Added new map view w/ panning and scrolling +- Added block health rule +- Added more internal teams for alternative gamemodes +- Added features for improved server modding +- Major internal change: package is now "mindustry" instead of "io.anuke.mindustry" (will break plugins) diff --git a/fastlane/metadata/android/es-ES/changelogs/100.1.txt b/fastlane/metadata/android/es-ES/changelogs/100.1.txt new file mode 100644 index 0000000000..182fef996f --- /dev/null +++ b/fastlane/metadata/android/es-ES/changelogs/100.1.txt @@ -0,0 +1,3 @@ +-Solución de bugs +-Actualizadas algunas traducciones +-Agregada la opción de volver atrás al cargar ciertos mods antiguos. diff --git a/fastlane/metadata/android/es-ES/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt new file mode 100644 index 0000000000..f1ff659fef --- /dev/null +++ b/fastlane/metadata/android/es-ES/full_description.txt @@ -0,0 +1,14 @@ +Crea elaboradas cadenas de suministros para cargar tus torretas, produce materiales para crear estructuras y defiendelas de oleadas de enemigos. Juega con tus amigos en un multijugador cooperativo multiplataforma, o pelea contra ellos en batallas PvP por equipos. + +Características: +- 24 mapas oficiales integrados +- Una campaña, con un completo árbol de tecnologias y áreas desbloqueables +- 4 poderosos jefes de oleada que derrotar +- Sistemas de transporte de energía, minerales y líquidos +- 19 tipos de drones, mecanoides y naves +- Mas de 120 bloques desbloqueables por tecnologias +- Más de 75 bloques de ambiente, con distintos biomas por descubrir. +- Multijugador multiplataforma tanto por redes locales (LAN) como en servidores dedicados. +- Reglas personalizadas: Configura costos, fuerza de los enemigos, recursos iniciales, tiempo entre oleadas, y más +- Un poderoso editor, con herramientas para generar terreno y ores automaticamente, decorar y aplicar simetría. +- Oleadas personalizables. diff --git a/fastlane/metadata/android/es-ES/short_description.txt b/fastlane/metadata/android/es-ES/short_description.txt new file mode 100644 index 0000000000..515d4b8068 --- /dev/null +++ b/fastlane/metadata/android/es-ES/short_description.txt @@ -0,0 +1 @@ +Un Tower Defense Sandbox basado en Fábricas. diff --git a/fastlane/metadata/android/es-ES/summary.txt b/fastlane/metadata/android/es-ES/summary.txt new file mode 100644 index 0000000000..a59e404e54 --- /dev/null +++ b/fastlane/metadata/android/es-ES/summary.txt @@ -0,0 +1 @@ +Un Tower Defense Sandbox basado en Fábricas diff --git a/fastlane/metadata/android/es-ES/title.txt b/fastlane/metadata/android/es-ES/title.txt new file mode 100644 index 0000000000..e2842b447a --- /dev/null +++ b/fastlane/metadata/android/es-ES/title.txt @@ -0,0 +1 @@ +Mindustry diff --git a/fastlane/metadata/android/it-IT/changelogs/102.2.txt b/fastlane/metadata/android/it-IT/changelogs/102.2.txt new file mode 100644 index 0000000000..db62ea93f9 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/102.2.txt @@ -0,0 +1,5 @@ +- Aggiunta una nuova modalità di visualizzazione della mappa con panoramica e scorrimento +- Aggiunta regola della salute dei blocchi +- Aggiunte ulteriori squadre interne per modalità di gioco alternative +- Aggiunte funzionalità per migliorare il server modding +- Cambiamenti interni: il package ora è "mindustry" invece di "io.anuke.mindustry" (i plugin non funzioneranno) \ No newline at end of file diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt new file mode 100644 index 0000000000..1cf2ed8e9c --- /dev/null +++ b/fastlane/metadata/android/it-IT/full_description.txt @@ -0,0 +1,14 @@ +Crea elaborate catene di nastri trasportatori per rifornire di ammonizioni le tue torrette, produci materiali per la costruzione e difendi le tue strutture contro le ondate nemiche. Gioca con i tuoi amici con la modalità multigiocatore cross-platform o sfidali in partite PvP a squadre. + +Funzionalità: +- 24 mappe incluse +- Modalità campagna, completa con albero delle scoperte e aree sbloccabili +- 4 potenti ondate con boss da sconfiggere +- Sistemi di trasporto di energia, liquidi e oggetti +- 19 tipi di droni, mechs e navi +- 120+ blocchi tecnologici da padroneggiare +- 75+ blocchi ambientali +- Modalità multigiocatore cross-platform attraverso la rete locale o i server dedicati +- Regole di gioco personalizzate: modifica i costi dei blocchi, le statistiche nemiche, gli oggetti di partenza, i tempi tra le ondate e molto altro +- Un editor potente, con strumenti che permettono di generare i minerali in modo casuale, il terreno, le decorazioni e applicare simmetria alle mappe +- Ondate delle mappe completamente personalizzabili \ No newline at end of file diff --git a/fastlane/metadata/android/it-IT/short_description.txt b/fastlane/metadata/android/it-IT/short_description.txt new file mode 100644 index 0000000000..92c1aa2e38 --- /dev/null +++ b/fastlane/metadata/android/it-IT/short_description.txt @@ -0,0 +1 @@ +Un gioco sandbox basato sulla produzione e sulla difesa. \ No newline at end of file diff --git a/fastlane/metadata/android/it-IT/summary.txt b/fastlane/metadata/android/it-IT/summary.txt new file mode 100644 index 0000000000..92c1aa2e38 --- /dev/null +++ b/fastlane/metadata/android/it-IT/summary.txt @@ -0,0 +1 @@ +Un gioco sandbox basato sulla produzione e sulla difesa. \ No newline at end of file diff --git a/fastlane/metadata/android/it-IT/title.txt b/fastlane/metadata/android/it-IT/title.txt new file mode 100644 index 0000000000..2beb939017 --- /dev/null +++ b/fastlane/metadata/android/it-IT/title.txt @@ -0,0 +1 @@ +Mindustry \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/video.txt b/fastlane/metadata/android/it-IT/video.txt similarity index 100% rename from fastlane/metadata/android/en-US/video.txt rename to fastlane/metadata/android/it-IT/video.txt diff --git a/fastlane/metadata/android/ja-JP/video.txt b/fastlane/metadata/android/ja-JP/video.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/fastlane/metadata/android/ru-RU/video.txt b/fastlane/metadata/android/ru-RU/video.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/fastlane/metadata/android/uk/video.txt b/fastlane/metadata/android/uk/video.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/fastlane/metadata/steam/Traditional Chinese/achievements.vdf b/fastlane/metadata/steam/Traditional Chinese/achievements.vdf new file mode 100644 index 0000000000..09ef921316 --- /dev/null +++ b/fastlane/metadata/steam/Traditional Chinese/achievements.vdf @@ -0,0 +1,109 @@ +"lang" +{ + "Language" "tchinese" + "Tokens" + { + "NEW_ACHIEVEMENT_20_0_NAME" "驗證通過" + "NEW_ACHIEVEMENT_20_0_DESC" "完成新手教學。" + "NEW_ACHIEVEMENT_20_1_NAME" "千人斬" + "NEW_ACHIEVEMENT_20_1_DESC" "累計擊敗 1000 名敵人。" + "NEW_ACHIEVEMENT_20_2_NAME" "十萬青年十萬肝" + "NEW_ACHIEVEMENT_20_2_DESC" "累計擊敗 100,000 名敵人。" + "NEW_ACHIEVEMENT_20_3_NAME" "大氣輸送" + "NEW_ACHIEVEMENT_20_3_DESC" "累計發射 10,000 個物品。" + "NEW_ACHIEVEMENT_20_5_NAME" "出貨出不完" + "NEW_ACHIEVEMENT_20_5_DESC" "累計發射 1,000,000 個物品。" + "NEW_ACHIEVEMENT_20_6_NAME" "征服者" + "NEW_ACHIEVEMENT_20_6_DESC" "在 10 場攻擊模式中獲勝。" + "NEW_ACHIEVEMENT_20_7_NAME" "冠軍" + "NEW_ACHIEVEMENT_20_7_DESC" "在 10 場多人 PvP 遊戲中獲勝。" + "NEW_ACHIEVEMENT_20_8_NAME" "速戰速決" + "NEW_ACHIEVEMENT_20_8_DESC" "在攻擊區域中於 5 波或更少波數摧毀敵人核心。" + "NEW_ACHIEVEMENT_20_9_NAME" "核心雨" + "NEW_ACHIEVEMENT_20_9_DESC" "將您的核心發射到一個區域 30 次。" + "NEW_ACHIEVEMENT_20_10_NAME" "頑強抵抗" + "NEW_ACHIEVEMENT_20_10_DESC" "活過 100 波。" + "NEW_ACHIEVEMENT_20_11_NAME" "不可征服" + "NEW_ACHIEVEMENT_20_11_DESC" "活過 500 波。" + "NEW_ACHIEVEMENT_20_12_NAME" "研究者" + "NEW_ACHIEVEMENT_20_12_DESC" "研究所有科技。" + "NEW_ACHIEVEMENT_20_13_NAME" "變形金剛" + "NEW_ACHIEVEMENT_20_13_DESC" "解鎖並變形成所有機甲。" + "NEW_ACHIEVEMENT_20_14_NAME" "超載" + "NEW_ACHIEVEMENT_20_14_DESC" "以電力攻擊被水覆蓋的敵人。" + "NEW_ACHIEVEMENT_20_15_NAME" "以子之矛,攻子之盾" + "NEW_ACHIEVEMENT_20_15_DESC" "用敵人的子彈摧毀它自己。" + "NEW_ACHIEVEMENT_20_17_NAME" "嚴重的錯誤" + "NEW_ACHIEVEMENT_20_17_DESC" "研究路由器。" + "NEW_ACHIEVEMENT_20_18_NAME" "大興土木" + "NEW_ACHIEVEMENT_20_18_DESC" "放置 10,000 個方塊。" + "NEW_ACHIEVEMENT_20_19_NAME" "夷為平地" + "NEW_ACHIEVEMENT_20_19_DESC" "摧毀 1,000 個敵方的方塊。" + "NEW_ACHIEVEMENT_20_20_NAME" "壯觀的災難" + "NEW_ACHIEVEMENT_20_20_DESC" "造成釷反應爐過熱爆炸。" + "NEW_ACHIEVEMENT_20_21_NAME" "製圖者" + "NEW_ACHIEVEMENT_20_21_DESC" "製作 10 張新地圖。" + "NEW_ACHIEVEMENT_20_22_NAME" "瀏覽器" + "NEW_ACHIEVEMENT_20_22_DESC" "從工作坊下載地圖。" + "NEW_ACHIEVEMENT_20_23_NAME" "創作者" + "NEW_ACHIEVEMENT_20_23_DESC" "在工作坊上發佈地圖。" + "NEW_ACHIEVEMENT_20_24_NAME" "殺手" + "NEW_ACHIEVEMENT_20_24_DESC" "擊敗一次 Boss。" + "NEW_ACHIEVEMENT_20_25_NAME" "探索者" + "NEW_ACHIEVEMENT_20_25_DESC" "解鎖戰役模式中的所有區域。" + "NEW_ACHIEVEMENT_20_26_NAME" "強迫症" + "NEW_ACHIEVEMENT_20_26_DESC" "完成所有區域的任務。" + "NEW_ACHIEVEMENT_20_29_NAME" "第二材料" + "NEW_ACHIEVEMENT_20_29_DESC" "解鎖釷。" + "NEW_ACHIEVEMENT_20_31_NAME" "第一材料" + "NEW_ACHIEVEMENT_20_31_DESC" "解鎖鈦。" + "NEW_ACHIEVEMENT_21_0_NAME" "神風特攻隊" + "NEW_ACHIEVEMENT_21_0_DESC" "將您的機甲裝滿爆炸性物質並自爆。" + "NEW_ACHIEVEMENT_21_1_NAME" "開始了" + "NEW_ACHIEVEMENT_21_1_DESC" "建造尖刀機甲工廠。" + "NEW_ACHIEVEMENT_21_2_NAME" "突擊" + "NEW_ACHIEVEMENT_21_2_DESC" "用指揮中心發出攻擊指令。" + "NEW_ACHIEVEMENT_21_3_NAME" "蜂群" + "NEW_ACHIEVEMENT_21_3_DESC" "同時擁有 100 個單位。" + "NEW_ACHIEVEMENT_21_4_NAME" "建造大隊" + "NEW_ACHIEVEMENT_21_4_DESC" "同時擁有 10 個鬼怪無人機。" + "NEW_ACHIEVEMENT_21_5_NAME" "不穩定軍隊" + "NEW_ACHIEVEMENT_21_5_DESC" "同時擁有 50 個爬行者。" + "NEW_ACHIEVEMENT_21_6_NAME" "軍團" + "NEW_ACHIEVEMENT_21_6_DESC" "總共建造 1000 個單位。" + "NEW_ACHIEVEMENT_21_7_NAME" "Super" + "NEW_ACHIEVEMENT_21_7_DESC" "在任意區域達到 S 等級。" + "NEW_ACHIEVEMENT_21_8_NAME" "Super Super" + "NEW_ACHIEVEMENT_21_8_DESC" "在任意區域達到 SS 等級。" + "NEW_ACHIEVEMENT_21_9_NAME" "誰叫你不聽?" + "NEW_ACHIEVEMENT_21_9_DESC" "在敵人出生點死亡。" + "NEW_ACHIEVEMENT_21_10_NAME" "只要按 Shift" + "NEW_ACHIEVEMENT_21_10_DESC" "被淹死。" + "NEW_ACHIEVEMENT_21_11_NAME" "蒐集者" + "NEW_ACHIEVEMENT_21_11_DESC" "將核心填滿所有類型的資源。" + "NEW_ACHIEVEMENT_21_12_NAME" "人群" + "NEW_ACHIEVEMENT_21_12_DESC" "建立一個有 10 個玩家的伺服器。" + "NEW_ACHIEVEMENT_21_13_NAME" "無懈可擊" + "NEW_ACHIEVEMENT_21_13_DESC" "建造 Meltdown 與 Spectre。" + "NEW_ACHIEVEMENT_21_14_NAME" "起飛" + "NEW_ACHIEVEMENT_21_14_DESC" "使用發射臺。" + "NEW_ACHIEVEMENT_21_15_NAME" "自業自得" + "NEW_ACHIEVEMENT_21_15_DESC" "跳過兩次發射機會後,核心被敵人摧毀。" + "NEW_ACHIEVEMENT_21_16_NAME" "異端邪說" + "NEW_ACHIEVEMENT_21_16_DESC" "建造兩個彼此相鄰的路由器。" + "NEW_ACHIEVEMENT_21_17_NAME" "孤獨的守護者" + "NEW_ACHIEVEMENT_21_17_DESC" "在任意區域不放置任何方塊的情況下存活 10 波。" + "NEW_ACHIEVEMENT_21_18_NAME" "焚化" + "NEW_ACHIEVEMENT_21_18_DESC" "在任意砲塔中使用黃鐵礦做為彈藥。" + "NEW_ACHIEVEMENT_21_19_NAME" "效率" + "NEW_ACHIEVEMENT_21_19_DESC" "用水或冷卻液冷卻砲塔。" + "NEW_ACHIEVEMENT_21_20_NAME" "經典模式" + "NEW_ACHIEVEMENT_21_20_DESC" "啟用像素化。" + "NEW_ACHIEVEMENT_21_21_NAME" "學者" + "NEW_ACHIEVEMENT_21_21_DESC" "從遊戲中開啟 Wiki。" + "NEW_ACHIEVEMENT_21_22_NAME" "領先" + "NEW_ACHIEVEMENT_21_22_DESC" "攜帶 10,000 或更多的資源進入一個地區。" + "NEW_ACHIEVEMENT_21_23_NAME" "點火" + "NEW_ACHIEVEMENT_21_23_DESC" "啟動衝擊反應器。" + } +} diff --git a/fastlane/metadata/steam/Traditional Chinese/description.txt b/fastlane/metadata/steam/Traditional Chinese/description.txt new file mode 100644 index 0000000000..2bb1ea20f2 --- /dev/null +++ b/fastlane/metadata/steam/Traditional Chinese/description.txt @@ -0,0 +1,61 @@ +建立精密的輸送帶供應鏈,提供砲塔彈藥,生產建築原料,保護您的建築物並抵禦入侵的敵人。在跨平臺的多人合作遊戲中和朋友一起玩,或在團隊 PvP 比賽中向他們挑戰。 + +[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] + +[h2]基本遊戲操作[/h2] + +[list] +[*] 建造精心設計的鑽頭與輸送帶,將資源轉移到您的核心。 +[*] 使用方塊製作進階原料。 +[*] 製作無人機以自動採礦、協助建造與保護您的基地。 +[*] 分配液體並撲滅突發的火災。 +[*] 選擇性使用冷卻液與潤滑劑來提升砲塔與生產方塊的效率。 +[/list] + +[h2]戰役[/h2] + +[list] +[*] 在 12 張可重複遊玩,並有隨機生成點的內建區域中前進 +[*] 採集並發射資源 +[*] 研究新科技以持續進步 +[*] 攜帶資源到每個區域 +[*] 多樣化的任務與目標 +[*] 邀請朋友一起完成關卡 +[*] 研究 120 種以上的科技 +[*] 19 種不同類型的無人機、機甲與飛船 +[*] 達成 50 種以上的成就 +[/list] + +[h2][h2]遊戲模式[/h2][/h2] + +[list] +[*] [b]生存[/b]:建造砲塔來抵禦敵人入侵。生存愈久愈好,選擇發射您的核心並將您採集的資源用來研究新科技。為 Boss 的到來做好準備。 +[*] [b]攻擊[/b]:建造工廠並生產部隊來摧毀敵人的核心,同時保護自己的基地不受敵方單位的攻擊。建立各種不同類型的支援與攻擊單位來協助實現您的目標。 +[*] [b]PvP[/b]:與最多四個不同團隊的玩家競爭摧毀其他人的核心。建立單位或直接用您的飛船攻擊其他人的基地。 +[*] [b]沙盒[/b]:資源無限,且無敵人威脅。使用僅在沙盒模式中才有的物品與液體來源以測試設計,並根據需要生成敵人。 +[/list] + +[h2]自訂遊戲與跨平臺多人遊戲[/h2] + +[list] +[*] 除了戰役以外,還有 12 個內建地圖可用於自訂遊戲 +[*] 玩合作、PvP 或沙盒模式 +[*] 加入公開的專用伺服器,或邀請朋友加入您的私人伺服器 +[*] 自訂遊戲規則:變更方塊花費、敵方屬性、起始物品、敵人來襲的間隔時間等 +[*] 混搭遊戲模式:結合 PvP 與 PvE 遊戲模式 +[/list] + +[h2]自訂地圖編輯器[/h2] + +[list] +[*] 使用編輯器來繪製地圖 +[*] 在遊戲中編輯並預覽建築 +[*] 可設定的工具模式:變更每個工具的功能 +[*] 強大的地圖生成系統,有許多不同類型的過濾器,可用於地形的可程式化處理 +[*] 將噪音、變形、平滑、腐蝕、對稱、礦物生成與隨機地形套用到您的地圖上 +[*] 隨機設定礦物生成,並放置河流與資源 +[*] 設定敵人攻擊佈局 +[*] 在 Steam 工作坊上分享匯出的地圖 +[*] 自訂地圖的基礎規則 +[*] 使用 75 種以上不同的環境方塊 +[/list] diff --git a/fastlane/metadata/steam/Traditional Chinese/short-description.txt b/fastlane/metadata/steam/Traditional Chinese/short-description.txt new file mode 100644 index 0000000000..76738a4a74 --- /dev/null +++ b/fastlane/metadata/steam/Traditional Chinese/short-description.txt @@ -0,0 +1 @@ +一款側重資源管理的開放式塔防遊戲。 diff --git a/fastlane/metadata/steam/italian/achievements.vdf b/fastlane/metadata/steam/italian/achievements.vdf index a000858b27..dc2a1f78d3 100644 --- a/fastlane/metadata/steam/italian/achievements.vdf +++ b/fastlane/metadata/steam/italian/achievements.vdf @@ -91,7 +91,7 @@ "NEW_ACHIEVEMENT_21_15_DESC" "Salta il decollo due volte e perdi il nucleo per mano nemica." "NEW_ACHIEVEMENT_21_16_NAME" "Eresia" "NEW_ACHIEVEMENT_21_16_DESC" "Costruisci due distributori uno affianco all'altro." - "NEW_ACHIEVEMENT_21_17_NAME" "Guardiano dell'amore" + "NEW_ACHIEVEMENT_21_17_NAME" "Guardiano Solitario" "NEW_ACHIEVEMENT_21_17_DESC" "Sopravvivi a 10 ondate in qualsiasi zona senza piazzare blocchi." "NEW_ACHIEVEMENT_21_18_NAME" "Incenerimento" "NEW_ACHIEVEMENT_21_18_DESC" "Usa la Pirite in una torretta qualsiasi." diff --git a/fastlane/metadata/steam/spanish/achievements.vdf b/fastlane/metadata/steam/spanish/achievements.vdf new file mode 100644 index 0000000000..fb67d82c9d --- /dev/null +++ b/fastlane/metadata/steam/spanish/achievements.vdf @@ -0,0 +1,109 @@ +"lang" +{ + "Language" "spanish" + "Tokens" + { + "NEW_ACHIEVEMENT_20_0_NAME" "Verificado" + "NEW_ACHIEVEMENT_20_0_DESC" "Completa el tutorial." + "NEW_ACHIEVEMENT_20_1_NAME" "Scrapper" + "NEW_ACHIEVEMENT_20_1_DESC" "Destruye 1,000 unidades enemigas." + "NEW_ACHIEVEMENT_20_2_NAME" "Purga" + "NEW_ACHIEVEMENT_20_2_DESC" "Destruye 100,000 unidades enemigas." + "NEW_ACHIEVEMENT_20_3_NAME" "Transporte Atmosférico" + "NEW_ACHIEVEMENT_20_3_DESC" "Lanza 10,000 items en total." + "NEW_ACHIEVEMENT_20_5_NAME" "Envíos Sin Fin" + "NEW_ACHIEVEMENT_20_5_DESC" "Lanza un total de 1,000,000 ítems." + "NEW_ACHIEVEMENT_20_6_NAME" "Conquistador" + "NEW_ACHIEVEMENT_20_6_DESC" "Gana 10 partidas en modo Invasión" + "NEW_ACHIEVEMENT_20_7_NAME" "Campeón" + "NEW_ACHIEVEMENT_20_7_DESC" "Gana 10 partidas PvP Multijugador." + "NEW_ACHIEVEMENT_20_8_NAME" "Rápido" + "NEW_ACHIEVEMENT_20_8_DESC" "Destruye el núcleo enemigo en 5 oleadas o menos." + "NEW_ACHIEVEMENT_20_9_NAME" "Lluvia de núcleos" + "NEW_ACHIEVEMENT_20_9_DESC" "Lanza tu núcleo a una zona 30 veces." + "NEW_ACHIEVEMENT_20_10_NAME" "Tenaz" + "NEW_ACHIEVEMENT_20_10_DESC" "Sobrevive 100 oleadas." + "NEW_ACHIEVEMENT_20_11_NAME" "Unvanquished" + "NEW_ACHIEVEMENT_20_11_DESC" "Sobrevive 500 oleadas." + "NEW_ACHIEVEMENT_20_12_NAME" "Investigador" + "NEW_ACHIEVEMENT_20_12_DESC" "Investiga todo el árbol de tecnologías." + "NEW_ACHIEVEMENT_20_13_NAME" "Cambiaformas" + "NEW_ACHIEVEMENT_20_13_DESC" "Desbloquea y transformate en todos los mecanoides del juego." + "NEW_ACHIEVEMENT_20_14_NAME" "Sobrecarga" + "NEW_ACHIEVEMENT_20_14_DESC" "Ataca a un enemigo con electricidad mientras este recibe agua." + "NEW_ACHIEVEMENT_20_15_NAME" "Desviación" + "NEW_ACHIEVEMENT_20_15_DESC" "Destruye una unidad haciendo rebotar su propia bala." + "NEW_ACHIEVEMENT_20_17_NAME" "Un grave, grave error" + "NEW_ACHIEVEMENT_20_17_DESC" "Investiga el enrutador." + "NEW_ACHIEVEMENT_20_18_NAME" "Creador" + "NEW_ACHIEVEMENT_20_18_DESC" "Coloca 10,000 bloques." + "NEW_ACHIEVEMENT_20_19_NAME" "Raze" + "NEW_ACHIEVEMENT_20_19_DESC" "Destruye 1,000 bloques enemigos." + "NEW_ACHIEVEMENT_20_20_NAME" "Un desastre espectacular" + "NEW_ACHIEVEMENT_20_20_DESC" "Causa que un reactor de torio se sobre caliente y explote." + "NEW_ACHIEVEMENT_20_21_NAME" "Mapper" + "NEW_ACHIEVEMENT_20_21_DESC" "Crea un nuevo mapa 10 veces." + "NEW_ACHIEVEMENT_20_22_NAME" "Buscador" + "NEW_ACHIEVEMENT_20_22_DESC" "Descarga un mapa de la Workshop." + "NEW_ACHIEVEMENT_20_23_NAME" "Creador" + "NEW_ACHIEVEMENT_20_23_DESC" "Publca un mapa en la Workshop." + "NEW_ACHIEVEMENT_20_24_NAME" "Slayer" + "NEW_ACHIEVEMENT_20_24_DESC" "Derrota un boss." + "NEW_ACHIEVEMENT_20_25_NAME" "Explorador" + "NEW_ACHIEVEMENT_20_25_DESC" "Desbloquea todas las zonas de la campaña." + "NEW_ACHIEVEMENT_20_26_NAME" "Minucioso" + "NEW_ACHIEVEMENT_20_26_DESC" "Alcanza el requisito de configuración en todas las zonas." + "NEW_ACHIEVEMENT_20_29_NAME" "Material II" + "NEW_ACHIEVEMENT_20_29_DESC" "Desbloquea el Torio." + "NEW_ACHIEVEMENT_20_31_NAME" "Material I" + "NEW_ACHIEVEMENT_20_31_DESC" "Desbloquea el Titanio." + "NEW_ACHIEVEMENT_21_0_NAME" "Kamikaze" + "NEW_ACHIEVEMENT_21_0_DESC" "LLena tu mecanoide de explosivos y muere, creando una explosión." + "NEW_ACHIEVEMENT_21_1_NAME" "Así comienza" + "NEW_ACHIEVEMENT_21_1_DESC" "Construye una fábrica de drones Daga." + "NEW_ACHIEVEMENT_21_2_NAME" "Asalto Directo" + "NEW_ACHIEVEMENT_21_2_DESC" "Utiliza el comando ataque desde el centro de comando." + "NEW_ACHIEVEMENT_21_3_NAME" "Swarm" + "NEW_ACHIEVEMENT_21_3_DESC" "Consigue 100 unidades activas al mismo tiempo." + "NEW_ACHIEVEMENT_21_4_NAME" "Flock" + "NEW_ACHIEVEMENT_21_4_DESC" "Consigue 10 drones fantasmales activos al mismo tiempo." + "NEW_ACHIEVEMENT_21_5_NAME" "Ejército volátil" + "NEW_ACHIEVEMENT_21_5_DESC" "Consigue 50 Crawlers activos al mismo tiempo." + "NEW_ACHIEVEMENT_21_6_NAME" "Legiones" + "NEW_ACHIEVEMENT_21_6_DESC" "Construye 1,000 unidades en total." + "NEW_ACHIEVEMENT_21_7_NAME" "Super" + "NEW_ACHIEVEMENT_21_7_DESC" "Consigue el rango S en cualquier zona." + "NEW_ACHIEVEMENT_21_8_NAME" "Super Super" + "NEW_ACHIEVEMENT_21_8_DESC" "Consigue el rango SS en cualquier zona." + "NEW_ACHIEVEMENT_21_9_NAME" "Deberías haber hecho caso" + "NEW_ACHIEVEMENT_21_9_DESC" "Muere en la zona del punto de exclusión." + "NEW_ACHIEVEMENT_21_10_NAME" "Solo aprieta Shift" + "NEW_ACHIEVEMENT_21_10_DESC" "Muere ahogado, como sea." + "NEW_ACHIEVEMENT_21_11_NAME" "Coleccionista" + "NEW_ACHIEVEMENT_21_11_DESC" "Llena el núcleo con la máxima cantidad de todos los recursos." + "NEW_ACHIEVEMENT_21_12_NAME" "10 son multitud" + "NEW_ACHIEVEMENT_21_12_DESC" "Hostea un servidor con 10 jugadores." + "NEW_ACHIEVEMENT_21_13_NAME" "Invencible" + "NEW_ACHIEVEMENT_21_13_DESC" "Construye el Meltdown y el Espectro." + "NEW_ACHIEVEMENT_21_14_NAME" "Liftoff" + "NEW_ACHIEVEMENT_21_14_DESC" "Use the Launch Pad." + "NEW_ACHIEVEMENT_21_15_NAME" "Complacencia" + "NEW_ACHIEVEMENT_21_15_DESC" "Saltea lanzar dos veces, luego deja que los enemigos destruyan tu núcleo." + "NEW_ACHIEVEMENT_21_16_NAME" "Herejía" + "NEW_ACHIEVEMENT_21_16_DESC" "Construye dos enrutadores, uno al lado del otro." + "NEW_ACHIEVEMENT_21_17_NAME" "Guardián solitario" + "NEW_ACHIEVEMENT_21_17_DESC" "Sobrevive 10 oleadas sin colocar ni un solo bloque." + "NEW_ACHIEVEMENT_21_18_NAME" "Incinerador" + "NEW_ACHIEVEMENT_21_18_DESC" "Usa pirotita para cargar una torreta." + "NEW_ACHIEVEMENT_21_19_NAME" "Eficiente" + "NEW_ACHIEVEMENT_21_19_DESC" "Refrigera una torreta con líquido criogénico." + "NEW_ACHIEVEMENT_21_20_NAME" "Modo Clásico" + "NEW_ACHIEVEMENT_21_20_DESC" "Activa el modo pixelado." + "NEW_ACHIEVEMENT_21_21_NAME" "Estudiante" + "NEW_ACHIEVEMENT_21_21_DESC" "Abre la wiki desde el juego." + "NEW_ACHIEVEMENT_21_22_NAME" "Comienzo a lo grande" + "NEW_ACHIEVEMENT_21_22_DESC" "Lanzate a una zona con mas de 10.000 recursos configurados." + "NEW_ACHIEVEMENT_21_23_NAME" "Ignición" + "NEW_ACHIEVEMENT_21_23_DESC" "Alimenta con energía un generador de impacto." + } +} diff --git a/fastlane/metadata/steam/spanish/description.txt b/fastlane/metadata/steam/spanish/description.txt new file mode 100644 index 0000000000..979f2ad430 --- /dev/null +++ b/fastlane/metadata/steam/spanish/description.txt @@ -0,0 +1,61 @@ +Crea elaboradas cadenas de suministros para cargar tus torretas, produce materiales para crear estructuras y defiendelas de oleadas de enemigos. Juega con tus amigos en un multijugador cooperativo multiplataforma, o pelea contra ellos en batallas PvP por equipos. + +[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] + +[h2]Gameplay[/h2] + +[list] +[*] Crea taladros y cintas transportadoras para enviar recursos a tu núcleo +[*] Usa bloques de producción para crear materiales avanzados +[*] Construye drones para minar recursos automaticamente, construir y defender tu base de forma eficiente +[*] Distribuye liquidos y apaga posibles incendios +[*] Potencia la producción refrigerando y lubricando tus defensas y bloques de construcción +[/list] + +[h2]Campaña[/h2] + +[list] +[*] Avanza a través de 12 zonas completamente rejugables con puntos de aparición randomizados +[*] Obtén y lanza recursos para investigar nuevas tecnologías +[*] Investiga nuevos bloques para facilitar tu progreso +[*] Configura los recursos iniciales de cada área a tus necesidades +[*] Gran variedad de misiones y objetivos +[*] Juega con tus amigos y completa niveles con ellos +[*] Mas de 120 bloques por investigar y descubrir +[*] 19 tipos de drones, mecanoides y naves +[*] Mas de 50 logros para completar +[/list] + +[h2][h2]Modos de juego[/h2][/h2] + +[list] +[*] [b]Supervivencia[/b]: Construye torretas para defenderte de tus enemigos con un estilo de Tower Defense. Sobrevive tanto como puedas, lanzando tu núcleo (opcionalmente) para utilizar los recursos con propósitos de investigación. Prepara tu base para el ataque de intermitentes bosses áereos. +[*] [b]Invasión[/b]: Construye fábricas de unidades para destruir el núcleo enemigo, mientras resistes oleadas periódicamente. Utiliza distintos tipos de unidades de ataque y soporte para ayudarte en la conquista. +[*] [b]PvP[/b]: Compite contra otros jugadores en hasta 4 equipos diferentes para destruir el núcleo de los demás. Crea unidades o ataca directamente con mecanoides la base de tus enemigos. +[*] [b]Sandbox[/b]: Juega libremente con recursos infinitos y sin enemigos molestando. Usa bloques exclusivos de sandbox para facilitar la prueba de diseños. Crea oleadas a gusto. +[/list] + +[h2]Partidas personalizadas y multijugador multiplataforma[/h2] + +[list] +[*] 12 mapas integrados para partidas personalizadas, además de los de la campaña +[*] Juega en cooperativo, Sandbox o PvP +[*] Únete a un servidor dedicado, o invita amigos a tu partida privada +[*] Reglas personalizadas: Cambia costos y tiempos de tus estructuras. Regula la fuerza de tus enemigos y cada cuanto aparecen, entre otras opciones +[*] Modos de juego combinados: Juega PvP y PvE al mismo tiempo +[/list] + +[h2]Editor de mapas[/h2] + +[list] +[*] Dibuja terreno con una interfaz completa de editor +[*] Edita y visualiza estructuras in-game +[*] Configura los modos de las herramientas +[*] Poderoso algoritmo de generacion, aplica filtros de terreno. +[*] Aplica distorsión, simetria, suavidad, generación de terreno y más a tus mapas +[*] Randomiza la generacion de ores y terreno, para que cada partida sea distinta +[*] Configura las oleadas a tu gusto +[*] Comparte mapas en la Steam Workshop +[*] Personaliza las reglas de los mapas +[*] Usa mas de 75 bloques ambientales, para darle un estilo único a tus mapas +[/list] diff --git a/fastlane/metadata/steam/spanish/short-description.txt b/fastlane/metadata/steam/spanish/short-description.txt new file mode 100644 index 0000000000..0966131f11 --- /dev/null +++ b/fastlane/metadata/steam/spanish/short-description.txt @@ -0,0 +1 @@ +Un Tower Defense abierto centrado en la gestión de recursos. diff --git a/gradle.properties b/gradle.properties index 29c1e50fad..960dcb95f3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=88c1a9afe2f5be4dd06e47ac8afe070247b3da29 +archash=3121916c9e580d298879e016929f0a9cb73fca67 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6ce793f21e..5028f28f8e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/ios/build.gradle b/ios/build.gradle index 0f5e0ec6b3..7096572def 100644 --- a/ios/build.gradle +++ b/ios/build.gradle @@ -4,7 +4,7 @@ sourceCompatibility = '1.8' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' ext{ - mainClassName = "io.anuke.mindustry.IOSLauncher" + mainClassName = "mindustry.ios.IOSLauncher" } task copyAssets(){ diff --git a/ios/robovm.xml b/ios/robovm.xml index a1ce5b92bc..cc970c87a4 100644 --- a/ios/robovm.xml +++ b/ios/robovm.xml @@ -19,9 +19,9 @@ net.jpountz.lz4.** - io.anuke.arc.scene.** - io.anuke.mindustry.gen.Call - io.anuke.mindustry.net.** + arc.scene.** + mindustry.gen.Call + mindustry.net.** com.android.okhttp.HttpHandler com.android.okhttp.HttpsHandler com.android.org.conscrypt.** diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/mindustry/ios/IOSLauncher.java similarity index 95% rename from ios/src/io/anuke/mindustry/IOSLauncher.java rename to ios/src/mindustry/ios/IOSLauncher.java index 9ecbb6c75d..5e0102db79 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/mindustry/ios/IOSLauncher.java @@ -1,16 +1,17 @@ -package io.anuke.mindustry; +package mindustry.ios; +import arc.*; import com.badlogic.gdx.backends.iosrobovm.*; -import io.anuke.arc.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.io.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Saves.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.ui.*; +import arc.files.*; +import arc.func.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import arc.util.io.*; +import mindustry.*; +import mindustry.game.EventType.*; +import mindustry.game.Saves.*; +import mindustry.io.*; +import mindustry.ui.*; import org.robovm.apple.coregraphics.*; import org.robovm.apple.foundation.*; import org.robovm.apple.uikit.*; @@ -20,7 +21,7 @@ import java.io.*; import java.util.*; import java.util.zip.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; import static org.robovm.apple.foundation.NSPathUtilities.getDocumentsDirectory; public class IOSLauncher extends IOSApplication.Delegate{ diff --git a/server/build.gradle b/server/build.gradle index 09299943fa..ad1b49bf7b 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -3,7 +3,7 @@ apply plugin: "java" sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = ["src/"] -project.ext.mainClassName = "io.anuke.mindustry.server.ServerLauncher" +project.ext.mainClassName = "mindustry.server.ServerLauncher" project.ext.assetsDir = new File("../core/assets") ext.getServerFolder = { diff --git a/server/run-jar b/server/run-jar new file mode 100755 index 0000000000..2ab341566f --- /dev/null +++ b/server/run-jar @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +if [[ $# -eq 0 ]] ; then + echo 'A server jar must be supplied as the first argument.' + exit 1 +fi + +if [[ ! -e $1 ]] ; then + echo "The supplied jar file '$1' must exist." + exit 1 +fi + +while true; do +#auto-restart until ctrl-c or exit 0 +java -jar -XX:+HeapDumpOnOutOfMemoryError $1 +excode=$? +if [ $excode -eq 0 ] || [ $excode -eq 130 ]; then + exit 0 +fi +done diff --git a/run-server b/server/run-server similarity index 54% rename from run-server rename to server/run-server index 0358cb521b..4e337686a0 100755 --- a/run-server +++ b/server/run-server @@ -4,5 +4,22 @@ if [[ $# -eq 0 ]] ; then exit 1 fi +cd .. + ./gradlew server:dist -Pbuildversion=$1 + +excode=$? + +if [ $excode -ne 0 ]; then + echo $excode + exit 1 +fi + +while true; do +#auto-restart until ctrl-c or exit 0 java -jar -XX:+HeapDumpOnOutOfMemoryError server/build/libs/server-release.jar +excode=$? +if [ $excode -eq 0 ] || [ $excode -eq 130 ]; then + exit 0 +fi +done diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/mindustry/server/ServerControl.java similarity index 77% rename from server/src/io/anuke/mindustry/server/ServerControl.java rename to server/src/mindustry/server/ServerControl.java index 42eb87cbee..c62abff162 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/mindustry/server/ServerControl.java @@ -1,32 +1,32 @@ -package io.anuke.mindustry.server; +package mindustry.server; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.collection.Array.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.arc.util.Timer; -import io.anuke.arc.util.CommandHandler.*; -import io.anuke.arc.util.Timer.*; -import io.anuke.arc.util.serialization.*; -import io.anuke.arc.util.serialization.JsonValue.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.io.*; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.maps.Maps.*; -import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.net.Administration.*; -import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.type.*; +import arc.*; +import arc.files.*; +import arc.struct.*; +import arc.struct.Array.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import arc.util.Timer; +import arc.util.CommandHandler.*; +import arc.util.Timer.*; +import arc.util.serialization.*; +import arc.util.serialization.JsonValue.*; +import mindustry.*; +import mindustry.core.GameState.*; +import mindustry.core.*; +import mindustry.entities.*; +import mindustry.entities.type.*; +import mindustry.game.*; +import mindustry.game.EventType.*; +import mindustry.gen.*; +import mindustry.io.*; +import mindustry.maps.Map; +import mindustry.maps.*; +import mindustry.maps.Maps.*; +import mindustry.mod.Mods.*; +import mindustry.net.Administration.*; +import mindustry.net.Packets.*; +import mindustry.type.*; import java.io.*; import java.net.*; @@ -34,13 +34,12 @@ import java.time.*; import java.time.format.*; import java.util.*; -import static io.anuke.arc.util.Log.*; -import static io.anuke.mindustry.Vars.*; +import static arc.util.Log.*; +import static mindustry.Vars.*; public class ServerControl implements ApplicationListener{ private static final int roundExtraTime = 12; private static final int maxLogLength = 1024 * 512; - private static final int commandSocketPort = 6859; protected static String[] tags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; protected static DateTimeFormatter dateTime = DateTimeFormatter.ofPattern("MM-dd-yyyy | HH:mm:ss"); @@ -55,6 +54,7 @@ public class ServerControl implements ApplicationListener{ private @Nullable Map nextMapOverride; private Thread socketThread; + private ServerSocket serverSocket; private PrintWriter socketOutput; public ServerControl(String[] args){ @@ -63,10 +63,6 @@ public class ServerControl implements ApplicationListener{ "bans", "", "admins", "", "shufflemode", "custom", - "crashreport", false, - "port", port, - "logging", true, - "socket", false, "globalrules", "{reactorExplosions: false}" ); @@ -74,7 +70,7 @@ public class ServerControl implements ApplicationListener{ String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", args1); System.out.println(result); - if(Core.settings.getBool("logging")){ + if(Config.logging.bool()){ logToFile("[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", false, args1)); } @@ -94,11 +90,17 @@ public class ServerControl implements ApplicationListener{ registerCommands(); Core.app.post(() -> { - String[] commands = {}; + Array commands = new Array<>(); if(args.length > 0){ - commands = Strings.join(" ", args).split(","); - info("&lmFound {0} command-line arguments to parse.", commands.length); + commands.addAll(Strings.join(" ", args).split(",")); + info("&lmFound {0} command-line arguments to parse.", commands.size); + } + + if(!Config.startCommands.string().isEmpty()){ + String[] startup = Strings.join(" ", Config.startCommands.string()).split(","); + info("&lmFound {0} startup commands.", startup.length); + commands.addAll(startup); } for(String s : commands){ @@ -106,7 +108,6 @@ public class ServerControl implements ApplicationListener{ if(response.type != ResponseType.valid){ err("Invalid command argument sent: '{0}': {1}", s, response.type.name()); err("Argument usage: &lc , "); - System.exit(1); } } }); @@ -134,7 +135,7 @@ public class ServerControl implements ApplicationListener{ if(state.rules.waves){ info("&lcGame over! Reached wave &ly{0}&lc with &ly{1}&lc players online on map &ly{2}&lc.", state.wave, playerGroup.size(), Strings.capitalize(world.getMap().name())); }else{ - info("&lcGame over! Team &ly{0}&lc is victorious with &ly{1}&lc players online on map &ly{2}&lc.", event.winner.name(), playerGroup.size(), Strings.capitalize(world.getMap().name())); + info("&lcGame over! Team &ly{0}&lc is victorious with &ly{1}&lc players online on map &ly{2}&lc.", event.winner.name, playerGroup.size(), Strings.capitalize(world.getMap().name())); } //set next map to be played @@ -142,7 +143,7 @@ public class ServerControl implements ApplicationListener{ nextMapOverride = null; if(map != null){ Call.onInfoMessage((state.rules.pvp - ? "[YELLOW]The " + event.winner.name() + " team is victorious![]" : "[SCARLET]Game over![]") + ? "[YELLOW]The " + event.winner.name + " team is victorious![]" : "[SCARLET]Game over![]") + "\nNext selected map:[accent] " + map.name() + "[]" + (map.tags.containsKey("author") && !map.tags.get("author").trim().isEmpty() ? " by[accent] " + map.author() + "[]" : "") + "." + "\nNew game begins in " + roundExtraTime + "[] seconds."); @@ -157,16 +158,27 @@ public class ServerControl implements ApplicationListener{ } }); + Events.on(Trigger.socketConfigChanged, () -> { + toggleSocket(false); + toggleSocket(Config.socketInput.bool()); + }); + + Events.on(PlayEvent.class, e -> { + try{ + JsonValue value = JsonIO.json().fromJson(null, Core.settings.getString("globalrules")); + JsonIO.json().readFields(state.rules, value); + }catch(Throwable t){ + Log.err("Error applying custom rules, proceeding without them.", t); + } + }); + if(!mods.list().isEmpty()){ info("&lc{0} mods loaded.", mods.list().size); } - info("&lcServer loaded. Type &ly'help'&lc for help."); - System.out.print("> "); + toggleSocket(Config.socketInput.bool()); - if(Core.settings.getBool("socket")){ - toggleSocket(true); - } + info("&lcServer loaded. Type &ly'help'&lc for help."); } private void registerCommands(){ @@ -178,7 +190,7 @@ public class ServerControl implements ApplicationListener{ }); handler.register("version", "Displays server version info.", arg -> { - info("&lmVersion: &lyMindustry {0}-{1} {2} / build {3}", Version.number, Version.modifier, Version.type, Version.build); + info("&lmVersion: &lyMindustry {0}-{1} {2} / build {3}", Version.number, Version.modifier, Version.type, Version.build + (Version.revision == 0 ? "" : "." + Version.revision)); info("&lmJava Version: &ly{0}", System.getProperty("java.version")); }); @@ -235,32 +247,16 @@ public class ServerControl implements ApplicationListener{ try{ world.loadMap(result, result.applyRules(lastMode)); state.rules = result.applyRules(preset); - applyRules(); logic.play(); info("Map loaded."); - host(); + netServer.openServer(); }catch(MapException e){ Log.err(e.map.name() + ": " + e.getMessage()); } }); - handler.register("port", "[port]", "Sets or displays the port for hosting the server.", arg -> { - if(arg.length == 0){ - info("&lyPort: &lc{0}", Core.settings.getInt("port")); - }else{ - int port = Strings.parseInt(arg[0]); - if(port < 0 || port > 65535){ - err("Port must be a number between 0 and 65535."); - return; - } - info("&lyPort set to {0}.", port); - Core.settings.put("port", port); - Core.settings.save(); - } - }); - handler.register("maps", "Display all available maps.", arg -> { if(!maps.all().isEmpty()){ info("Maps:"); @@ -291,12 +287,12 @@ public class ServerControl implements ApplicationListener{ info(" &lyPlaying on map &fi{0}&fb &lb/&ly Wave {1}", Strings.capitalize(world.getMap().name()), state.wave); if(state.rules.waves){ - info("&ly {0} enemies.", unitGroups[Team.crux.ordinal()].size()); + info("&ly {0} enemies.", state.enemies); }else{ info("&ly {0} seconds until next wave.", (int)(state.wavetime / 60)); } - info(" &ly{0} FPS, {1} MB used.", (int)(60f / Time.delta()), Core.app.getJavaHeap() / 1024 / 1024); + info(" &ly{0} FPS, {1} MB used.", Core.graphics.getFramesPerSecond(), Core.app.getJavaHeap() / 1024 / 1024); if(playerGroup.size() > 0){ info(" &lyPlayers: {0}", playerGroup.size()); @@ -402,7 +398,7 @@ public class ServerControl implements ApplicationListener{ base.addChild(arg[1], value); Log.info("Changed rule: &ly{0}", value.toString().replace("\n", " ")); }catch(Throwable e){ - Log.err("Error parsing rule JSON", e); + Log.err("Error parsing rule JSON: {0}", e.getMessage()); } } @@ -417,34 +413,26 @@ public class ServerControl implements ApplicationListener{ return; } - try{ - Team team = arg.length == 0 ? Team.sharded : Team.valueOf(arg[0]); + Team team = arg.length == 0 ? Team.sharded : Structs.find(Team.all(), t -> t.name.equals(arg[0])); - if(state.teams.get(team).cores.isEmpty()){ - err("That team has no cores."); - return; - } - - for(Item item : content.items()){ - if(item.type == ItemType.material){ - state.teams.get(team).cores.first().entity.items.set(item, state.teams.get(team).cores.first().block().itemCapacity); - } - } - - info("Core filled."); - }catch(IllegalArgumentException ignored){ - err("No such team exists."); - } - }); - - handler.register("name", "[name...]", "Change the server display name.", arg -> { - if(arg.length == 0){ - info("Server name is currently &lc'{0}'.", Core.settings.getString("servername")); + if(team == null){ + err("No team with that name found."); return; } - Core.settings.put("servername", arg[0]); - Core.settings.save(); - info("Server name is now &lc'{0}'.", arg[0]); + + if(state.teams.cores(team).isEmpty()){ + err("That team has no cores."); + return; + } + + for(Item item : content.items()){ + if(item.type == ItemType.material){ + state.teams.cores(team).first().items.set(item, state.teams.cores(team).first().block.itemCapacity); + } + } + + info("Core filled."); + }); handler.register("playerlimit", "[off/somenumber]", "Set the server player limit.", arg -> { @@ -467,14 +455,71 @@ public class ServerControl implements ApplicationListener{ } }); - handler.register("whitelist", "[on/off...]", "Enable/disable whitelisting.", arg -> { + handler.register("config", "[name] [value...]", "Configure server settings.", arg -> { if(arg.length == 0){ - info("Whitelist is currently &lc{0}.", netServer.admins.isWhitelistEnabled() ? "on" : "off"); + info("&lyAll config values:"); + for(Config c : Config.all){ + Log.info("&ly| &lc{0}:&lm {1}", c.name(), c.get()); + Log.info("&ly| | {0}", c.description); + Log.info("&ly|"); + } return; } - boolean on = arg[0].equalsIgnoreCase("on"); - netServer.admins.setWhitelist(on); - info("Whitelist is now &lc{0}.", on ? "on" : "off"); + + try{ + Config c = Config.valueOf(arg[0]); + if(arg.length == 1){ + Log.info("&lc'{0}'&lg is currently &lc{1}.", c.name(), c.get()); + }else{ + if(c.isBool()){ + c.set(arg[1].equals("on") || arg[1].equals("true")); + }else if(c.isNum()){ + try{ + c.set(Integer.parseInt(arg[1])); + }catch(NumberFormatException e){ + Log.err("Not a valid number: {0}", arg[1]); + return; + } + }else if(c.isString()){ + c.set(arg[1]); + } + + Log.info("&lc{0}&lg set to &lc{1}.", c.name(), c.get()); + } + }catch(IllegalArgumentException e){ + err("Unknown config: '{0}'. Run the command with no arguments to get a list of valid configs.", arg[0]); + } + }); + + handler.register("subnet-ban", "[add/remove] [address]", "Ban a subnet. This simply rejects all connections with IPs starting with some string.", arg -> { + if(arg.length == 0){ + Log.info("Subnets banned: &lc{0}", netServer.admins.getSubnetBans().isEmpty() ? "" : ""); + for(String subnet : netServer.admins.getSubnetBans()){ + Log.info("&ly " + subnet + ""); + } + }else if(arg.length == 1){ + err("You must provide a subnet to add or remove."); + }else{ + if(arg[0].equals("add")){ + if(netServer.admins.getSubnetBans().contains(arg[1])){ + err("That subnet is already banned."); + return; + } + + netServer.admins.addSubnetBan(arg[1]); + Log.info("Banned &ly{0}&lc**", arg[1]); + }else if(arg[0].equals("remove")){ + if(!netServer.admins.getSubnetBans().contains(arg[1])){ + err("That subnet isn't banned."); + return; + } + + netServer.admins.removeSubnetBan(arg[1]); + Log.info("Unbanned &ly{0}&lc**", arg[1]); + }else{ + err("Incorrect usage. You must provide add/remove as the second argument."); + } + } }); handler.register("whitelisted", "List the entire whitelist.", arg -> { @@ -509,67 +554,6 @@ public class ServerControl implements ApplicationListener{ info("Player &ly'{0}'&lg has been un-whitelisted.", info.lastName); }); - handler.register("sync", "[on/off...]", "Enable/disable block sync. Experimental.", arg -> { - if(arg.length == 0){ - info("Block sync is currently &lc{0}.", Core.settings.getBool("blocksync") ? "enabled" : "disabled"); - return; - } - boolean on = arg[0].equalsIgnoreCase("on"); - Core.settings.putSave("blocksync", on); - info("Block syncing is now &lc{0}.", on ? "on" : "off"); - }); - - handler.register("crashreport", "", "Disables or enables automatic crash reporting", arg -> { - boolean value = arg[0].equalsIgnoreCase("on"); - Core.settings.put("crashreport", value); - Core.settings.save(); - info("Crash reporting is now {0}.", value ? "on" : "off"); - }); - - handler.register("logging", "", "Disables or enables server logs", arg -> { - boolean value = arg[0].equalsIgnoreCase("on"); - Core.settings.put("logging", value); - Core.settings.save(); - info("Logging is now {0}.", value ? "on" : "off"); - }); - - handler.register("strict", "", "Disables or enables strict mode", arg -> { - boolean value = arg[0].equalsIgnoreCase("on"); - netServer.admins.setStrict(value); - info("Strict mode is now {0}.", netServer.admins.getStrict() ? "on" : "off"); - }); - - handler.register("socketinput", "[on/off]", "Disables or enables a local TCP socket at port "+commandSocketPort+" to recieve commands from other applications", arg -> { - if(arg.length == 0){ - info("Socket input is currently &lc{0}.", Core.settings.getBool("socket") ? "on" : "off"); - return; - } - - boolean value = arg[0].equalsIgnoreCase("on"); - toggleSocket(value); - Core.settings.put("socket", value); - Core.settings.save(); - info("Socket input is now &lc{0}.", value ? "on" : "off"); - }); - - handler.register("allow-custom-clients", "[on/off]", "Allow or disallow custom clients.", arg -> { - if(arg.length == 0){ - info("Custom clients are currently &lc{0}.", netServer.admins.allowsCustomClients() ? "allowed" : "disallowed"); - return; - } - - String s = arg[0]; - if(s.equalsIgnoreCase("on")){ - netServer.admins.setCustomClients(true); - info("Custom clients enabled."); - }else if(s.equalsIgnoreCase("off")){ - netServer.admins.setCustomClients(false); - info("Custom clients disabled."); - }else{ - err("Incorrect command usage."); - } - }); - handler.register("shuffle", "[none/all/custom/builtin]", "Set map shuffling mode.", arg -> { if(arg.length == 0){ info("Shuffle mode current set to &ly'{0}'&lg.", maps.getShuffleMode()); @@ -758,8 +742,8 @@ public class ServerControl implements ApplicationListener{ SaveIO.load(file); state.rules.zone = null; info("Save loaded."); - host(); state.set(State.playing); + netServer.openServer(); }catch(Throwable t){ err("Failed to load save. Outdated or corrupt file."); } @@ -821,7 +805,7 @@ public class ServerControl implements ApplicationListener{ } }); - handler.register("gc", "Trigger a grabage collection. Testing only.", arg -> { + handler.register("gc", "Trigger a grabage struct. Testing only.", arg -> { int pre = (int)(Core.app.getJavaHeap() / 1024 / 1024); System.gc(); int post = (int)(Core.app.getJavaHeap() / 1024 / 1024); @@ -832,15 +816,6 @@ public class ServerControl implements ApplicationListener{ mods.eachClass(p -> p.registerClientCommands(netServer.clientCommands)); } - private void applyRules(){ - try{ - JsonValue value = JsonIO.json().fromJson(null, Core.settings.getString("globalrules")); - JsonIO.json().readFields(state.rules, value); - }catch(Throwable t){ - Log.err("Error applying custom rules, proceeding without them.", t); - } - } - private void readCommands(){ Scanner scan = new Scanner(System.in); @@ -876,8 +851,6 @@ public class ServerControl implements ApplicationListener{ }else if(response.type == ResponseType.manyArguments){ err("Too many command arguments. Usage: " + response.command.text + " " + response.command.paramText); } - - System.out.print("> "); } private void play(boolean wait, Runnable run){ @@ -893,9 +866,8 @@ public class ServerControl implements ApplicationListener{ Call.onWorldDataBegin(); run.run(); - logic.play(); state.rules = world.getMap().applyRules(lastMode); - applyRules(); + logic.play(); for(Player p : players){ if(p.con == null) continue; @@ -928,19 +900,6 @@ public class ServerControl implements ApplicationListener{ } } - private void host(){ - try{ - net.host(Core.settings.getInt("port")); - info("&lcOpened a server on port {0}.", Core.settings.getInt("port")); - }catch(BindException e){ - Log.err("Unable to host: Port already in use! Make sure no other servers are running on the same port in your network."); - state.set(State.menu); - }catch(IOException e){ - err(e); - state.set(State.menu); - } - } - private void logToFile(String text){ if(currentLogFile != null && currentLogFile.length() > maxLogLength){ String date = DateTimeFormatter.ofPattern("MM-dd-yyyy | HH:mm:ss").format(LocalDateTime.now()); @@ -964,33 +923,39 @@ public class ServerControl implements ApplicationListener{ if(on && socketThread == null){ socketThread = new Thread(() -> { try{ - try(ServerSocket socket = new ServerSocket()){ - socket.bind(new InetSocketAddress("localhost", commandSocketPort)); - while(true){ - Socket client = socket.accept(); - info("&lmRecieved command socket connection: &lb{0}", socket.getLocalSocketAddress()); - BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); - socketOutput = new PrintWriter(client.getOutputStream(), true); - String line; - while(client.isConnected() && (line = in.readLine()) != null){ - String result = line; - Core.app.post(() -> handleCommandString(result)); - } - info("&lmLost command socket connection: &lb{0}", socket.getLocalSocketAddress()); - socketOutput = null; + serverSocket = new ServerSocket(); + serverSocket.bind(new InetSocketAddress(Config.socketInputAddress.string(), Config.socketInputPort.num())); + while(true){ + Socket client = serverSocket.accept(); + info("&lmRecieved command socket connection: &lb{0}", serverSocket.getLocalSocketAddress()); + BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); + socketOutput = new PrintWriter(client.getOutputStream(), true); + String line; + while(client.isConnected() && (line = in.readLine()) != null){ + String result = line; + Core.app.post(() -> handleCommandString(result)); } + info("&lmLost command socket connection: &lb{0}", serverSocket.getLocalSocketAddress()); + socketOutput = null; } }catch(BindException b){ err("Command input socket already in use. Is another instance of the server running?"); }catch(IOException e){ - err("Terminating socket server."); - e.printStackTrace(); + if(!e.getMessage().equals("Socket closed")){ + err("Terminating socket server."); + e.printStackTrace(); + } } }); socketThread.setDaemon(true); socketThread.start(); }else if(socketThread != null){ socketThread.interrupt(); + try{ + serverSocket.close(); + }catch(IOException e){ + e.printStackTrace(); + } socketThread = null; socketOutput = null; } diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/mindustry/server/ServerLauncher.java similarity index 81% rename from server/src/io/anuke/mindustry/server/ServerLauncher.java rename to server/src/mindustry/server/ServerLauncher.java index 1210d81606..28738ceb7e 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/mindustry/server/ServerLauncher.java @@ -1,24 +1,24 @@ -package io.anuke.mindustry.server; +package mindustry.server; -import io.anuke.arc.*; -import io.anuke.arc.backends.headless.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.mod.*; -import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.net.*; +import arc.*; +import arc.backend.headless.*; +import arc.files.*; +import arc.util.*; +import mindustry.*; +import mindustry.core.*; +import mindustry.ctype.*; +import mindustry.game.EventType.*; +import mindustry.mod.*; +import mindustry.mod.Mods.*; +import mindustry.net.Net; +import mindustry.net.*; import java.time.*; -import static io.anuke.arc.util.Log.format; -import static io.anuke.mindustry.Vars.*; -import static io.anuke.mindustry.server.ServerControl.*; +import static arc.util.Log.format; +import static mindustry.Vars.*; +import static mindustry.server.ServerControl.*; public class ServerLauncher implements ApplicationListener{ static String[] args; diff --git a/servers.json b/servers.json index 0637a088a0..81ea4bf021 100644 --- a/servers.json +++ b/servers.json @@ -1 +1,5 @@ -[] \ No newline at end of file +[ + { + "address": "mindustry.us.to" + } +] diff --git a/servers_be.json b/servers_be.json new file mode 100644 index 0000000000..be72d9d6da --- /dev/null +++ b/servers_be.json @@ -0,0 +1,5 @@ +[ + { + "address": "mindustry.us.to:6568" + } +] \ No newline at end of file diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 2e706644c2..722bf246d0 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -1,28 +1,28 @@ -import io.anuke.arc.ApplicationCore; -import io.anuke.arc.Core; -import io.anuke.arc.backends.headless.HeadlessApplication; -import io.anuke.arc.collection.*; -import io.anuke.arc.math.geom.Point2; -import io.anuke.arc.util.Log; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; -import io.anuke.mindustry.entities.type.BaseUnit; -import io.anuke.mindustry.entities.type.base.*; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.io.SaveIO; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.net.*; -import io.anuke.mindustry.ctype.ContentType; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.BlockPart; +import arc.ApplicationCore; +import arc.Core; +import arc.backend.headless.HeadlessApplication; +import arc.struct.*; +import arc.math.geom.Point2; +import arc.util.Log; +import arc.util.Time; +import mindustry.Vars; +import mindustry.content.*; +import mindustry.core.GameState.State; +import mindustry.core.*; +import mindustry.entities.traits.BuilderTrait.BuildRequest; +import mindustry.entities.type.BaseUnit; +import mindustry.entities.type.base.*; +import mindustry.game.Team; +import mindustry.io.SaveIO; +import mindustry.maps.Map; +import mindustry.net.*; +import mindustry.ctype.ContentType; +import mindustry.type.Item; +import mindustry.world.*; +import mindustry.world.blocks.BlockPart; import org.junit.jupiter.api.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; import static org.junit.jupiter.api.Assertions.*; public class ApplicationTests{ @@ -106,8 +106,8 @@ public class ApplicationTests{ Time.update(); Time.update(); Time.setDeltaProvider(() -> 1f); - unitGroups[waveTeam.ordinal()].updateEvents(); - assertFalse(unitGroups[waveTeam.ordinal()].isEmpty(), "No enemies spawned."); + unitGroup.update(); + assertFalse(unitGroup.isEmpty(), "No enemies spawned."); } @Test @@ -128,7 +128,7 @@ public class ApplicationTests{ createMap(); int bx = 4; int by = 4; - world.setBlock(world.tile(bx, by), Blocks.coreShard, Team.sharded); + world.tile(bx, by).set(Blocks.coreShard, Team.sharded); assertEquals(world.tile(bx, by).getTeam(), Team.sharded); for(int x = bx - 1; x <= bx + 1; x++){ for(int y = by - 1; y <= by + 1; y++){ @@ -198,7 +198,7 @@ public class ApplicationTests{ @Test void save(){ world.loadMap(testMap); - assertTrue(state.teams.get(defaultTeam).cores.size > 0); + assertTrue(state.teams.playerCores().size > 0); SaveIO.save(saveDirectory.child("0.msav")); } @@ -213,7 +213,7 @@ public class ApplicationTests{ assertEquals(world.width(), map.width); assertEquals(world.height(), map.height); - assertTrue(state.teams.get(defaultTeam).cores.size > 0); + assertTrue(state.teams.playerCores().size > 0); } @Test @@ -379,12 +379,12 @@ public class ApplicationTests{ createMap(); Tile core = world.tile(5, 5); - world.setBlock(core, Blocks.coreShard, Team.sharded); + core.set(Blocks.coreShard, Team.sharded); for(Item item : content.items()){ core.entity.items.set(item, 3000); } - assertEquals(core, state.teams.get(Team.sharded).cores.first()); + assertEquals(core.entity, state.teams.get(Team.sharded).core()); } void depositTest(Block block, Item item){ diff --git a/tests/src/test/java/IOTests.java b/tests/src/test/java/IOTests.java index 7771b33dde..79f7a213cf 100644 --- a/tests/src/test/java/IOTests.java +++ b/tests/src/test/java/IOTests.java @@ -1,11 +1,11 @@ -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.io.TypeIO; -import org.junit.jupiter.api.Test; +import arc.util.*; +import mindustry.game.*; +import mindustry.io.*; +import org.junit.jupiter.api.*; -import java.nio.ByteBuffer; +import java.nio.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.*; public class IOTests{ @@ -49,5 +49,23 @@ public class IOTests{ assertEquals(rules.attackMode, res.attackMode); } + @Test + void writeRules2(){ + Rules rules = new Rules(); + rules.attackMode = true; + rules.tags.put("blah", "bleh"); + rules.buildSpeedMultiplier = 99.1f; + String str = JsonIO.write(rules); + Rules res = JsonIO.read(Rules.class, str); + + assertEquals(rules.buildSpeedMultiplier, res.buildSpeedMultiplier); + assertEquals(rules.attackMode, res.attackMode); + assertEquals(rules.tags.get("blah"), res.tags.get("blah")); + + String str2 = JsonIO.write(new Rules(){{ + attackMode = true; + }}); + Log.info(str2); + } } diff --git a/tests/src/test/java/ZoneTests.java b/tests/src/test/java/ZoneTests.java index eee1de8708..a238a815ee 100644 --- a/tests/src/test/java/ZoneTests.java +++ b/tests/src/test/java/ZoneTests.java @@ -1,15 +1,15 @@ -import io.anuke.arc.collection.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.io.SaveIO.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.storage.*; +import arc.struct.*; +import arc.util.*; +import mindustry.core.*; +import mindustry.core.GameState.*; +import mindustry.game.*; +import mindustry.io.SaveIO.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.storage.*; import org.junit.jupiter.api.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.DynamicTest.dynamicTest; @@ -52,7 +52,7 @@ public class ZoneTests{ if(tile.drop() != null){ resources.add(tile.drop()); } - if(tile.block() instanceof CoreBlock && tile.getTeam() == defaultTeam){ + if(tile.block() instanceof CoreBlock && tile.getTeam() == state.rules.defaultTeam){ hasSpawnPoint = true; } } @@ -69,7 +69,7 @@ public class ZoneTests{ } assertTrue(hasSpawnPoint, "Zone \"" + zone.name + "\" has no spawn points."); - assertTrue(spawner.countSpawns() > 0 || (state.rules.attackMode && !state.teams.get(waveTeam).cores.isEmpty()), "Zone \"" + zone.name + "\" has no enemy spawn points: " + spawner.countSpawns()); + assertTrue(spawner.countSpawns() > 0 || (state.rules.attackMode && state.teams.get(state.rules.waveTeam).hasCore()), "Zone \"" + zone.name + "\" has no enemy spawn points: " + spawner.countSpawns()); for(Item item : resources){ assertTrue(zone.resources.contains(item), "Zone \"" + zone.name + "\" is missing item in resource list: \"" + item.name + "\""); diff --git a/tests/src/test/java/power/DirectConsumerTests.java b/tests/src/test/java/power/DirectConsumerTests.java index 0892b13d88..19933045fe 100644 --- a/tests/src/test/java/power/DirectConsumerTests.java +++ b/tests/src/test/java/power/DirectConsumerTests.java @@ -1,12 +1,12 @@ package power; -import io.anuke.mindustry.content.Items; -import io.anuke.mindustry.content.UnitTypes; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.power.PowerGenerator; -import io.anuke.mindustry.world.blocks.power.PowerGraph; -import io.anuke.mindustry.world.blocks.units.UnitFactory; +import mindustry.content.Items; +import mindustry.content.UnitTypes; +import mindustry.type.ItemStack; +import mindustry.world.Tile; +import mindustry.world.blocks.power.PowerGenerator; +import mindustry.world.blocks.power.PowerGraph; +import mindustry.world.blocks.units.UnitFactory; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/tests/src/test/java/power/FakeGraphics.java b/tests/src/test/java/power/FakeGraphics.java index bce7d8fbff..378f675224 100644 --- a/tests/src/test/java/power/FakeGraphics.java +++ b/tests/src/test/java/power/FakeGraphics.java @@ -1,9 +1,9 @@ package power; -import io.anuke.arc.Graphics; -import io.anuke.arc.Graphics.Cursor.SystemCursor; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.glutils.GLVersion; +import arc.Graphics; +import arc.Graphics.Cursor.SystemCursor; +import arc.graphics.*; +import arc.graphics.gl.GLVersion; public class FakeGraphics extends Graphics{ static int frame; diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ItemLiquidGeneratorTests.java index 5e5a2ed034..7111c79658 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ItemLiquidGeneratorTests.java @@ -1,13 +1,13 @@ package power; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.game.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.power.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.core.*; +import mindustry.game.*; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.power.*; import org.junit.jupiter.api.*; import java.util.*; diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 1cd8930449..e5735052f5 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -1,20 +1,20 @@ package power; -import io.anuke.arc.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; -import io.anuke.mindustry.world.blocks.power.*; -import io.anuke.mindustry.world.modules.*; +import arc.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.core.*; +import mindustry.ctype.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.power.*; +import mindustry.world.modules.*; import org.junit.jupiter.api.*; import java.lang.reflect.*; -import static io.anuke.mindustry.Vars.content; +import static mindustry.Vars.content; /** * This class provides objects commonly used by power related unit tests. @@ -27,6 +27,7 @@ public class PowerTestFixture{ @BeforeAll static void initializeDependencies(){ Core.graphics = new FakeGraphics(); + Vars.state = new GameState(); Vars.content = new ContentLoader(){ @Override public void handleMappableContent(MappableContent content){ diff --git a/tests/src/test/java/power/PowerTests.java b/tests/src/test/java/power/PowerTests.java index b3353cfc2c..6815f2e880 100644 --- a/tests/src/test/java/power/PowerTests.java +++ b/tests/src/test/java/power/PowerTests.java @@ -1,11 +1,13 @@ package power; -import io.anuke.arc.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.power.*; -import io.anuke.mindustry.world.consumers.*; +import arc.*; +import arc.math.*; +import arc.util.*; +import mindustry.*; +import mindustry.core.*; +import mindustry.world.*; +import mindustry.world.blocks.power.*; +import mindustry.world.consumers.*; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; @@ -23,6 +25,7 @@ public class PowerTests extends PowerTestFixture{ @BeforeAll static void init(){ Core.graphics = new FakeGraphics(); + Vars.state = new GameState(); } @Nested diff --git a/tools/build.gradle b/tools/build.gradle index 6a2825747a..033040e96d 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -240,7 +240,7 @@ task swapColors(){ Color.argb8888ToColor(tmpc, c) if(tmpc.a < 0.1f) continue if(map.containsKey(c)){ - img.setRGB(x, y, (int) map.get(c)) + img.setRGB(x, y, (int)map.get(c)) } } } @@ -297,7 +297,7 @@ task pack(dependsOn: classes){ //run generation task; generate all needed sprites file(genFolder).mkdirs() javaexec{ - main = "io.anuke.mindustry.tools.ImagePacker" + main = "mindustry.tools.ImagePacker" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = genFolder @@ -310,7 +310,7 @@ task pack(dependsOn: classes){ } jvmArgs("-Djava.awt.headless=true") - main = "io.anuke.mindustry.tools.Upscaler" + main = "mindustry.tools.Upscaler" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../core/assets-raw/sprites_out/ui/icons" @@ -351,7 +351,7 @@ task pack(dependsOn: classes){ task genSprites(dependsOn: classes, type: JavaExec){ finalizedBy 'antialiasGen' - main = "io.anuke.mindustry.tools.ImagePacker" + main = "mindustry.tools.ImagePacker" classpath = sourceSets.main.runtimeClasspath jvmArgs("-Djava.awt.headless=true") standardInput = System.in @@ -361,7 +361,7 @@ task genSprites(dependsOn: classes, type: JavaExec){ task updateBundles(dependsOn: classes, type: JavaExec){ file(genFolder).mkdirs() - main = "io.anuke.mindustry.tools.BundleLauncher" + main = "mindustry.tools.BundleLauncher" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../core/assets/bundles/" diff --git a/tools/src/io/anuke/mindustry/tools/BundleLauncher.java b/tools/src/mindustry/tools/BundleLauncher.java similarity index 72% rename from tools/src/io/anuke/mindustry/tools/BundleLauncher.java rename to tools/src/mindustry/tools/BundleLauncher.java index 30624ea663..ab44a77ff7 100644 --- a/tools/src/io/anuke/mindustry/tools/BundleLauncher.java +++ b/tools/src/mindustry/tools/BundleLauncher.java @@ -1,23 +1,21 @@ -package io.anuke.mindustry.tools; +package mindustry.tools; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.func.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.io.*; - -import java.io.*; +import arc.files.*; +import arc.func.*; +import arc.struct.*; +import arc.util.*; +import arc.util.io.*; public class BundleLauncher{ - public static void main(String[] args) throws Exception{ - File file = new File("bundle.properties"); + public static void main(String[] args){ OrderedMap base = new OrderedMap<>(); - PropertiesUtils.load(base, new InputStreamReader(new FileInputStream(file))); + PropertiesUtils.load(base, Fi.get("bundle.properties").reader()); Array removals = new Array<>(); - Fi.get("").walk(child -> { - if(child.name().equals("bundle.properties") || child.isDirectory() || child.toString().contains("output")) - return; + String str = Fi.get("bundle.properties").readString(); + ObjectSet newlines = Array.with(str.split("\n")).select(l -> l.contains(" = ") && str.indexOf(l) + l.length() < str.length() - 2 && str.charAt(str.indexOf(l) + l.length() + 1) == '\n').map(l -> l.split(" = ")[0]).asSet(); + Fi.get(".").walk(child -> { + if(child.name().equals("bundle.properties") || child.toString().contains("output")) return; Log.info("Parsing bundle: {0}", child); @@ -46,8 +44,7 @@ public class BundleLauncher{ } } - Func2 processor = (key, value) -> (key + " = " + value).replace("\\", "\\\\").replace("\n", "\\n") + "\n"; - + Func2 processor = (key, value) -> (key + " = " + value).replace("\\", "\\\\").replace("\n", "\\n") + "\n" + (newlines.contains(key) ? "\n" : ""); Fi output = child.sibling("output/" + child.name()); Log.info("&lc{0} keys added.", added); diff --git a/tools/src/io/anuke/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java similarity index 95% rename from tools/src/io/anuke/mindustry/tools/Generators.java rename to tools/src/mindustry/tools/Generators.java index e1ad420f50..d49a55e452 100644 --- a/tools/src/io/anuke/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -1,20 +1,20 @@ -package io.anuke.mindustry.tools; +package mindustry.tools; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.noise.*; -import io.anuke.mindustry.ctype.*; -import io.anuke.mindustry.tools.ImagePacker.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import arc.util.noise.*; +import mindustry.ctype.*; +import mindustry.tools.ImagePacker.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; +import mindustry.world.blocks.*; -import static io.anuke.mindustry.Vars.*; +import static mindustry.Vars.*; public class Generators{ diff --git a/tools/src/io/anuke/mindustry/tools/Image.java b/tools/src/mindustry/tools/Image.java similarity index 94% rename from tools/src/io/anuke/mindustry/tools/Image.java rename to tools/src/mindustry/tools/Image.java index f7c987762b..0407783614 100644 --- a/tools/src/io/anuke/mindustry/tools/Image.java +++ b/tools/src/mindustry/tools/Image.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.tools; +package mindustry.tools; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.util.Structs; -import io.anuke.mindustry.tools.ImagePacker.GenRegion; +import arc.graphics.Color; +import arc.graphics.g2d.TextureRegion; +import arc.util.Structs; +import mindustry.tools.ImagePacker.GenRegion; import javax.imageio.ImageIO; import java.awt.*; diff --git a/tools/src/io/anuke/mindustry/tools/ImagePacker.java b/tools/src/mindustry/tools/ImagePacker.java similarity index 92% rename from tools/src/io/anuke/mindustry/tools/ImagePacker.java rename to tools/src/mindustry/tools/ImagePacker.java index 226155a245..74ff81e9b0 100644 --- a/tools/src/io/anuke/mindustry/tools/ImagePacker.java +++ b/tools/src/mindustry/tools/ImagePacker.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.tools; +package mindustry.tools; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.g2d.TextureAtlas.*; -import io.anuke.arc.util.*; -import io.anuke.arc.util.Log.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.*; +import arc.*; +import arc.struct.*; +import arc.files.*; +import arc.graphics.g2d.*; +import arc.graphics.g2d.TextureAtlas.*; +import arc.util.*; +import arc.util.Log.*; +import mindustry.*; +import mindustry.core.*; import javax.imageio.*; import java.awt.image.*; diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/mindustry/tools/ScriptStubGenerator.java similarity index 75% rename from tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java rename to tools/src/mindustry/tools/ScriptStubGenerator.java index c2110eb4e1..be1d9dd27d 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/mindustry/tools/ScriptStubGenerator.java @@ -1,15 +1,15 @@ -package io.anuke.mindustry.tools; +package mindustry.tools; -import io.anuke.arc.*; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.g2d.TextureAtlas.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.gen.*; +import arc.*; +import arc.struct.Array; +import arc.struct.*; +import arc.files.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.graphics.g2d.TextureAtlas.*; +import arc.math.*; +import arc.util.*; +import mindustry.gen.*; import org.reflections.*; import org.reflections.scanners.*; import org.reflections.util.*; @@ -21,17 +21,17 @@ import java.util.*; public class ScriptStubGenerator{ public static void main(String[] args){ - String base = "io.anuke.mindustry"; + String base = "mindustry"; Array blacklist = Array.with("plugin", "mod", "net", "io", "tools"); Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, - Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class, I18NBundle.class); + Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class, I18NBundle.class, Interval.class, DataInput.class, DataOutput.class, + DataInputStream.class, DataOutputStream.class, Integer.class, Float.class, Double.class, Long.class, Boolean.class, Short.class, Byte.class, Character.class); Array nopackage = Array.with("java.lang", "java"); - String fileTemplate = "package io.anuke.mindustry.mod;\n" + - "\n" + - "import io.anuke.arc.collection.*;\n" + + String fileTemplate = "package mindustry.mod;\n" + + "\nimport arc.struct.*;\n" + "//obviously autogenerated, do not touch\n" + "public class ClassAccess{\n" + "\tpublic static final ObjectSet allowedClassNames = ObjectSet.with($ALLOWED_CLASS_NAMES$);\n" + @@ -45,10 +45,11 @@ public class ScriptStubGenerator{ .setScanners(new SubTypesScanner(false), new ResourcesScanner()) .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) .filterInputsBy(new FilterBuilder() - .include(FilterBuilder.prefix("io.anuke.mindustry")) - .include(FilterBuilder.prefix("io.anuke.arc.func")) - .include(FilterBuilder.prefix("io.anuke.arc.collection")) - .include(FilterBuilder.prefix("io.anuke.arc.scene")) + .include(FilterBuilder.prefix("mindustry")) + .include(FilterBuilder.prefix("arc.func")) + .include(FilterBuilder.prefix("arc.struct")) + .include(FilterBuilder.prefix("arc.scene")) + .include(FilterBuilder.prefix("arc.math")) )); Array> classes = Array.with(reflections.getSubTypesOf(Object.class)); @@ -72,7 +73,7 @@ public class ScriptStubGenerator{ //Log.info(result); new Fi("core/assets/scripts/global.js").writeString(result.toString()); - new Fi("core/src/io/anuke/mindustry/mod/ClassAccess.java").writeString(fileTemplate + new Fi("core/src/mindustry/mod/ClassAccess.java").writeString(fileTemplate .replace("$ALLOWED_CLASSES$", classes.toString(", ", type -> type.getName() + ".class")) .replace("$ALLOWED_CLASS_NAMES$", classes.toString(", ", type -> "\"" + type.getName() + "\""))); } diff --git a/tools/src/io/anuke/mindustry/tools/SquareMarcher.java b/tools/src/mindustry/tools/SquareMarcher.java similarity index 94% rename from tools/src/io/anuke/mindustry/tools/SquareMarcher.java rename to tools/src/mindustry/tools/SquareMarcher.java index de5f142df5..2261260b46 100644 --- a/tools/src/io/anuke/mindustry/tools/SquareMarcher.java +++ b/tools/src/mindustry/tools/SquareMarcher.java @@ -1,14 +1,14 @@ -package io.anuke.mindustry.tools; +package mindustry.tools; -import io.anuke.arc.Core; -import io.anuke.arc.files.Fi; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.Pixmap; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Fill; -import io.anuke.arc.graphics.glutils.FrameBuffer; -import io.anuke.arc.util.ScreenUtils; -import io.anuke.arc.util.Tmp; +import arc.Core; +import arc.files.Fi; +import arc.graphics.Color; +import arc.graphics.Pixmap; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.graphics.gl.FrameBuffer; +import arc.util.ScreenUtils; +import arc.util.Tmp; public class SquareMarcher{ final int resolution; diff --git a/tools/src/io/anuke/mindustry/tools/Upscaler.java b/tools/src/mindustry/tools/Upscaler.java similarity index 82% rename from tools/src/io/anuke/mindustry/tools/Upscaler.java rename to tools/src/mindustry/tools/Upscaler.java index 6ba497ff98..de83fad5c0 100644 --- a/tools/src/io/anuke/mindustry/tools/Upscaler.java +++ b/tools/src/mindustry/tools/Upscaler.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry.tools; +package mindustry.tools; -import io.anuke.arc.*; -import io.anuke.arc.backends.sdl.*; -import io.anuke.arc.files.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.ui.*; +import arc.*; +import arc.backend.sdl.*; +import arc.files.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.util.*; +import mindustry.ui.*; public class Upscaler{ public static void main(String[] args){