diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 419e88052a..64b7650e62 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,9 +7,11 @@ assignees: '' --- +**Note**: Do not report any new bugs directly relating to the v6 campaign. They will not be fixed or considered at this time. + **Platform**: *Android/iOS/Mac/Windows/Linux* -**Build**: *The build number under the title in the main menu. Required.* +**Build**: *The build number under the title in the main menu. Required. "LATEST" IS NOT A VERSION, I NEED THE EXACT BUILD NUMBER OF YOUR GAME.* **Issue**: *Explain your issue in detail.* @@ -17,7 +19,7 @@ assignees: '' **Link(s) to mod(s) used**: *The mod repositories or zip files that are related to the issue, if applicable.* -**Save file**: *The save file you were playing on when the bug happened, if applicable.* +**Save file**: *The (zipped) save file you were playing on when the bug happened. THIS IS REQUIRED FOR ANY ISSUE HAPPENING IN-GAME, REGARDLESS OF WHETHER YOU THINK IT HAPPENS EVERYWHERE. DO NOT DELETE OR OMIT THIS LINE UNLESS YOU ARE SURE THAT THE ISSUE DOES NOT HAPPEN IN-GAME.* **Crash report**: *The contents of relevant crash report files. REQUIRED if you are reporting a crash.* diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 4b79df9a48..490c317f03 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -3,18 +3,6 @@ name: Java CI on: [push] jobs: - buildJava8: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - name: Set up JDK 8 - uses: actions/setup-java@v1 - with: - java-version: 8 - - name: Run unit tests with gradle and Java 8 - run: ./gradlew compileJava - buildJava14: runs-on: ubuntu-latest @@ -26,3 +14,14 @@ jobs: java-version: 14 - name: Run unit tests with gradle and Java 14 run: ./gradlew compileJava + buildJava15: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 15 + uses: actions/setup-java@v1 + with: + java-version: 15 + - name: Run unit tests with gradle and Java 15 + run: ./gradlew compileJava diff --git a/.travis.yml b/.travis.yml index f31a2d36f3..11dbe8cd1e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ script: - git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds - cd ../MindustryBuilds - echo ${TRAVIS_TAG} -- if [ -n "$TRAVIS_TAG" ]; then echo versionName=5-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi +- if [ -n "$TRAVIS_TAG" ]; then echo versionName=6-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi - git tag ${TRAVIS_BUILD_NUMBER} - git config --global user.name "Build Uploader" - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds ${TRAVIS_BUILD_NUMBER}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds; fi @@ -26,6 +26,7 @@ script: - cp -a Mindustry/core/build/docs/javadoc/. docs/ - cd docs - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git add .; git commit -m "Update ${TRAVIS_BUILD_NUMBER}"; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/docs; fi +- cd ../Mindustry deploy: - provider: releases skip_cleanup: true @@ -38,11 +39,11 @@ deploy: on: repo: Anuken/Mindustry tags: true -- provider: script - script: bash update_wiki.sh - on: - repo: Anuken/Mindustry - tags: true +#- provider: script +# script: bash update_wiki.sh +# on: +# repo: Anuken/Mindustry +# tags: true env: global: - secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8= diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 58eed0c4fd..143a73d6b8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,33 +4,38 @@ This is for code contributions. For translations, see [TRANSLATING](TRANSLATING. ## Basic Guidelines -#### Use an IDE. +### Use an IDE. Specifically, IntelliJ IDEA. Download the (free) Community Edition of it [here](https://www.jetbrains.com/idea/download/). Some people use other tools, like VS Code, but I would personally not recommend them for Java development. -#### Always test your changes. +### Always test your changes. Do not submit something without at least running the game to see if it compiles. If you are submitting a new block, make sure it has a name and description, and that it works correctly in-game. If you are changing existing block mechanics, test them out first. - -#### Do not make large changes before discussing them first. +### Do not make large changes before discussing them first. If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) (preferred method) or via e-mail (*anukendev@gmail.com*). For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it. +### Do not include packed sprites in your pull request. +When making a pull request that changes or adds new sprites, do not add the modified atlas & `spritesX.png` files to your final pull request. These are a frequent source of conflicts. + ## Style Guidelines -#### Follow the formatting guidelines. +### Follow the formatting guidelines. This means: - No spaces around parentheses: `if(condition){`, `SomeType s = (SomeType)object` - Same-line braces. - 4 spaces indentation -- `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more. +- `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more. Any reasonable IDE should highlight them for you anyway. - No underscores for anything. (Yes, I know `Bindings` violates this principle, but that's for legacy reasons and really should be cleaned up some day) - Do not use braceless `if/else` statements. `if(x) statement else statement2` should **never** be done. In very specific situations, having braceless if-statements on one line is allowed: `if(cond) return;` would be valid. +- Prefer single-line javadoc `/** @return for example */` instead of multiline javadoc whenver possible +- Short method/variable names (multipleLongWords should be avoided if it's possible to so reasonably, especially for variables) +- Use wildcard imports - `import some.package.*` - for everything. This makes incorrect class usage more obvious (*e.g. arc.util.Timer vs java.util.Timer*) and leads to cleaner-looking code. Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to get correct formatting when developing Mindustry. -#### Do not use incompatible Java features (java.util.function, java.awt). +### Do not use incompatible Java features (java.util.function, java.awt). Android and RoboVM (iOS) do not support 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 `arc.func`, which are more or less the same with different naming schemes. @@ -39,7 +44,7 @@ The same applies to any class *outside* of the standard `java.[n]io` / `java.net In general, if you are using IntelliJ, you should be warned about platform incompatiblities. -#### Use `arc` collections and classes when possible. +### Use `arc` collections and classes when possible. Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Seq`, `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`). @@ -52,21 +57,21 @@ What you'll usually need to change: - *Many others* -#### Avoid boxed types (Integer, Boolean) +### Avoid boxed types (Integer, Boolean) Never create variables or collections with boxed types `Seq` or `ObjectMap`. Use the collections specialized for this task, e.g. `IntSeq` and `IntMap`. -#### Do not allocate anything if possible. +### Do not allocate anything if possible. Never allocate `new` objects in the main loop. If you absolutely require new objects, use `Pools` to obtain and free object instances. Otherwise, use the `Tmp` variables for things like vector/shape operations, or create `static` variables for re-use. If using a list, make it a static variable and clear it every time it is used. Re-use as much as possible. -#### Avoid bloated code and unnecessary getters/setters. +### Avoid bloated code and unnecessary getters/setters. This is situational, but in essence what it means is to avoid using any sort of getters and setters unless absolutely necessary. Public or protected fields should suffice for most things. If something needs to be encapsulated in the future, IntelliJ can handle it with a few clicks. -#### Do not create methods unless necessary. +### Do not create methods unless necessary. Unless a block of code is very large or used in more than 1-2 places, don't split it up into a separate method. Making unnecessary methods only creates confusion, and may slightly decrease performance. ## Other Notes diff --git a/README.md b/README.md index 8006e6e11a..5c9c797297 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,9 @@ First, make sure you have [JDK 14](https://adoptopenjdk.net/) installed. Open a #### Windows -_Running:_ `gradlew.bat desktop:run` -_Building:_ `gradlew.bat desktop:dist` -_Sprite Packing:_ `gradlew.bat tools:pack` +_Running:_ `gradlew desktop:run` +_Building:_ `gradlew desktop:dist` +_Sprite Packing:_ `gradlew tools:pack` #### Linux/Mac OS @@ -70,3 +70,7 @@ Post feature requests and feedback [here](https://github.com/Anuken/Mindustry-Su [Get it on F-Droid](https://f-droid.org/packages/io.anuke.mindustry/) + +[Download On Flathub](https://flathub.org/apps/details/com.github.Anuken.Mindustry) diff --git a/android/build.gradle b/android/build.gradle index ef1791a9b6..3ec6b34cfe 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -34,7 +34,8 @@ dependencies{ natives "com.github.Anuken.Arc:natives-freetype-android:${getArcHash()}" natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}" - if(localArc()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar']) + //android dependencies magically disappear during compilation, thanks gradle! + if(new File(projectDir.parent, '../Arc').exists()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar']) } task deploy(type: Copy){ @@ -75,7 +76,7 @@ android{ targetSdkVersion 29 versionName versionNameResult - versionCode vcode + versionCode = (System.getenv("TRAVIS_BUILD_ID") != null ? System.getenv("TRAVIS_BUILD_ID").toInteger() : vcode) if(project.hasProperty("release")){ props['androidBuildCode'] = (vcode + 1).toString() @@ -97,15 +98,20 @@ android{ storePassword RELEASE_STORE_PASSWORD keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD + }else if(System.getenv("CI") == "true"){ + storeFile = file("../../bekeystore.jks") + storePassword = System.getenv("keystore_password") + keyAlias = System.getenv("keystore_alias") + keyPassword = System.getenv("keystore_alias_password") }else{ - println("No keystore info property found!") + println("No keystore property found. Releases will be unsigned.") } } } - if(project.hasProperty("RELEASE_STORE_FILE")) { - buildTypes { - release { + if(project.hasProperty("RELEASE_STORE_FILE") || System.getenv("CI") == "true"){ + buildTypes{ + release{ signingConfig signingConfigs.release } } diff --git a/android/src/mindustry/android/AndroidLauncher.java b/android/src/mindustry/android/AndroidLauncher.java index e2c484e50d..7400bd37a8 100644 --- a/android/src/mindustry/android/AndroidLauncher.java +++ b/android/src/mindustry/android/AndroidLauncher.java @@ -7,7 +7,6 @@ import android.content.pm.*; import android.net.*; import android.os.Build.*; import android.os.*; -import android.provider.Settings.*; import android.telephony.*; import arc.*; import arc.backend.android.*; @@ -15,7 +14,7 @@ import arc.files.*; import arc.func.*; import arc.scene.ui.layout.*; import arc.util.*; -import arc.util.serialization.*; +import dalvik.system.*; import mindustry.*; import mindustry.game.Saves.*; import mindustry.io.*; @@ -23,7 +22,6 @@ import mindustry.net.*; import mindustry.ui.dialogs.*; import java.io.*; -import java.lang.System; import java.lang.Thread.*; import java.util.*; @@ -73,12 +71,25 @@ public class AndroidLauncher extends AndroidApplication{ public void shareFile(Fi file){ } + @Override + public Class loadJar(Fi jar, String mainClass) throws Exception{ + DexClassLoader loader = new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, getClassLoader()); + return Class.forName(mainClass, true, loader); + } + @Override public void showFileChooser(boolean open, String extension, Cons cons){ + showFileChooser(open, cons, extension); + } + + void showFileChooser(boolean open, Cons cons, String... extensions){ + String extension = extensions[0]; + if(VERSION.SDK_INT >= VERSION_CODES.Q){ Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType(extension.equals("zip") && !open ? "application/zip" : "*/*"); + intent.setType(extension.equals("zip") && !open && extensions.length == 1 ? "application/zip" : "*/*"); + addResultListener(i -> startActivityForResult(intent, i), (code, in) -> { if(code == Activity.RESULT_OK && in != null && in.getData() != null){ Uri uri = in.getData(); @@ -108,7 +119,7 @@ public class AndroidLauncher extends AndroidApplication{ }); }else if(VERSION.SDK_INT >= VERSION_CODES.M && !(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){ - chooser = new FileChooser(open ? "@open" : "@save", file -> file.extension().equalsIgnoreCase(extension), open, file -> { + chooser = new FileChooser(open ? "@open" : "@save", file -> Structs.contains(extensions, file.extension().toLowerCase()), open, file -> { if(!open){ cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension)); }else{ @@ -125,10 +136,19 @@ public class AndroidLauncher extends AndroidApplication{ } requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE); }else{ - super.showFileChooser(open, extension, cons); + if(open){ + new FileChooser("@open", file -> Structs.contains(extensions, file.extension().toLowerCase()), true, cons).show(); + }else{ + super.showFileChooser(open, extension, cons); + } } } + @Override + public void showMultiFileChooser(Cons cons, String... extensions){ + showFileChooser(true, cons, extensions); + } + @Override public void beginForceLandscape(){ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); diff --git a/android/src/mindustry/android/AndroidRhinoContext.java b/android/src/mindustry/android/AndroidRhinoContext.java index c4468ecead..d3e80c7427 100644 --- a/android/src/mindustry/android/AndroidRhinoContext.java +++ b/android/src/mindustry/android/AndroidRhinoContext.java @@ -41,6 +41,11 @@ public class AndroidRhinoContext{ public Object getDynamicSecurityDomain(Object o){ return null; } + + @Override + public Object callWithDomain(Object o, Context context, Callable callable, Scriptable scriptable, Scriptable scriptable1, Object[] objects){ + return null; + } }); AndroidContextFactory factory; diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java index 05872c155b..0bd3aa6b32 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java @@ -38,6 +38,8 @@ public class EntityIO{ this.serializer = serializer; this.name = name; + json.setIgnoreUnknownFields(true); + directory.mkdirs(); //load old revisions @@ -45,6 +47,8 @@ public class EntityIO{ revisions.add(json.fromJson(Revision.class, fi)); } + revisions.sort(r -> r.version); + //next revision to be used int nextRevision = revisions.isEmpty() ? 0 : revisions.max(r -> r.version).version + 1; @@ -61,11 +65,13 @@ public class EntityIO{ //keep track of fields present in the entity presentFields.addAll(fields.map(f -> f.name)); + Revision previous = revisions.isEmpty() ? null : revisions.peek(); + //add new revision if it doesn't match or there are no revisions if(revisions.isEmpty() || !revisions.peek().equal(fields)){ revisions.add(new Revision(nextRevision, - fields.map(f -> new RevisionField(f.name, f.type.toString(), - f.type.isPrimitive() ? BaseProcessor.typeSize(f.type.toString()) : -1)))); + fields.map(f -> new RevisionField(f.name, f.type.toString())))); + Log.warn("Adding new revision @ for @.\nPre = @\nNew = @\n", nextRevision, name, previous == null ? null : previous.fields.toString(", ", f -> f.name + ":" + f.type), fields.toString(", ", f -> f.name + ":" + f.type.toString())); //write revision directory.child(nextRevision + ".json").writeString(json.toJson(revisions.peek())); } @@ -322,8 +328,7 @@ public class EntityIO{ for(int i = 0; i < fields.size; i++){ RevisionField field = fields.get(i); FieldSpec spec = specs.get(i); - //TODO when making fields, their primitive size may be overwritten by an annotation; check for that - if(!(field.type.equals(spec.type.toString()) && (!spec.type.isPrimitive() || BaseProcessor.typeSize(spec.type.toString()) == field.size))){ + if(!field.type.replace("mindustry.gen.", "").equals(spec.type.toString().replace("mindustry.gen.", ""))){ return false; } } @@ -333,11 +338,9 @@ public class EntityIO{ public static class RevisionField{ String name, type; - int size; //in bytes - RevisionField(String name, String type, int size){ + RevisionField(String name, String type){ this.name = name; - this.size = size; this.type = type; } diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index ed0796e7b0..1cd5f7c4e5 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -1,10 +1,8 @@ package mindustry.annotations.entity; -import arc.*; import arc.files.*; import arc.func.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import arc.util.pooling.Pool.*; @@ -77,7 +75,12 @@ public class EntityProcess extends BaseProcessor{ for(Smethod elem : component.methods()){ if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE)) continue; //get all statements in the method, store them - methodBlocks.put(elem.descString(), elem.tree().getBody().toString()); + methodBlocks.put(elem.descString(), elem.tree().getBody().toString() + .replaceAll("this\\.<(.*)>self\\(\\)", "this") //fix parameterized self() calls + .replaceAll("self\\(\\)", "this") //fix self() calls + .replaceAll(" yield ", "") //fix enchanced switch + .replaceAll("\\/\\*missing\\*\\/", "var") //fix vars + ); } } @@ -375,7 +378,7 @@ public class EntityProcess extends BaseProcessor{ .addModifiers(Modifier.PUBLIC) .addStatement("return $S + $L", name + "#", "id").build()); - EntityIO io = new EntityIO(type.name(), builder, allFieldSpecs, serializer, rootDirectory.child("annotations/src/main/resources/revisions").child(name)); + EntityIO io = new EntityIO(type.name(), builder, allFieldSpecs, serializer, rootDirectory.child("annotations/src/main/resources/revisions").child(type.name())); //entities with no sync comp and no serialization gen no code boolean hasIO = ann.genio() && (components.contains(s -> s.name().contains("Sync")) || ann.serialize()); @@ -516,7 +519,7 @@ public class EntityProcess extends BaseProcessor{ //add free code to remove methods - always at the end //this only gets called next frame. if(first.name().equals("remove") && ann.pooled()){ - mbuilder.addStatement("$T.app.post(() -> $T.free(this))", Core.class, Pools.class); + mbuilder.addStatement("mindustry.gen.Groups.queueFree(($T)this)", Poolable.class); } builder.addMethod(mbuilder.build()); @@ -583,6 +586,17 @@ public class EntityProcess extends BaseProcessor{ //write clear groupsBuilder.addMethod(groupClear.build()); + //add method for pool storage + groupsBuilder.addField(FieldSpec.builder(ParameterizedTypeName.get(Seq.class, Poolable.class), "freeQueue", Modifier.PRIVATE, Modifier.STATIC).initializer("new Seq<>()").build()); + + //method for freeing things + MethodSpec.Builder groupFreeQueue = MethodSpec.methodBuilder("queueFree") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addParameter(Poolable.class, "obj") + .addStatement("freeQueue.add(obj)"); + + groupsBuilder.addMethod(groupFreeQueue.build()); + //add method for resizing all necessary groups MethodSpec.Builder groupResize = MethodSpec.methodBuilder("resize") .addParameter(TypeName.FLOAT, "x").addParameter(TypeName.FLOAT, "y").addParameter(TypeName.FLOAT, "w").addParameter(TypeName.FLOAT, "h") @@ -591,6 +605,11 @@ public class EntityProcess extends BaseProcessor{ MethodSpec.Builder groupUpdate = MethodSpec.methodBuilder("update") .addModifiers(Modifier.PUBLIC, Modifier.STATIC); + //free everything pooled at the start of each updaet + groupUpdate + .addStatement("for($T p : freeQueue) $T.free(p)", Poolable.class, Pools.class) + .addStatement("freeQueue.clear()"); + //method resize for(GroupDefinition group : groupDefs){ if(group.spatial){ @@ -642,10 +661,10 @@ public class EntityProcess extends BaseProcessor{ //build mapping class for sync IDs TypeSpec.Builder idBuilder = TypeSpec.classBuilder("EntityMapping").addModifiers(Modifier.PUBLIC) - .addField(FieldSpec.builder(TypeName.get(Prov[].class), "idMap", Modifier.PRIVATE, Modifier.STATIC).initializer("new Prov[256]").build()) + .addField(FieldSpec.builder(TypeName.get(Prov[].class), "idMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new Prov[256]").build()) .addField(FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(ObjectMap.class), tname(String.class), tname(Prov.class)), - "nameMap", Modifier.PRIVATE, Modifier.STATIC).initializer("new ObjectMap<>()").build()) + "nameMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new ObjectMap<>()").build()) .addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(TypeName.get(Prov.class)).addParameter(int.class, "id").addStatement("return idMap[id]").build()) .addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC) diff --git a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java index e3e70e8ddd..8e22e33db9 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java @@ -3,6 +3,8 @@ package mindustry.annotations.impl; import arc.files.*; import arc.scene.style.*; import arc.struct.*; +import arc.util.*; +import arc.util.io.*; import arc.util.serialization.*; import com.squareup.javapoet.*; import mindustry.annotations.Annotations.*; @@ -33,6 +35,17 @@ public class AssetsProcess extends BaseProcessor{ String resources = rootDirectory + "/core/assets-raw/sprites/ui"; Jval icons = Jval.read(Fi.get(rootDirectory + "/core/assets-raw/fontgen/config.json").readString()); + ObjectMap texIcons = new OrderedMap<>(); + PropertiesUtils.load(texIcons, Fi.get(rootDirectory + "/core/assets/icons/icons.properties").reader()); + + texIcons.each((key, val) -> { + String[] split = val.split("\\|"); + String name = Strings.kebabToCamel(split[1]).replace("Medium", "").replace("Icon", ""); + if(SourceVersion.isKeyword(name) || name.equals("char")) name = name + "i"; + + ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("(char)" + key).build()); + }); + ictype.addField(FieldSpec.builder(ParameterizedTypeName.get(ObjectMap.class, String.class, TextureRegionDrawable.class), "icons", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("new ObjectMap<>()").build()); diff --git a/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java b/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java index b43a2d3eef..e28ecf13a0 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java @@ -68,9 +68,9 @@ public class CallSuperProcess extends AbstractProcessor{ } static class CodeAnalyzerTreeScanner extends TreePathScanner{ - private String methodName; - private MethodTree method; - private boolean callSuperUsed; + String methodName; + MethodTree method; + boolean callSuperUsed; @Override public Object visitClass(ClassTree classTree, Trees trees){ @@ -83,6 +83,9 @@ public class CallSuperProcess extends AbstractProcessor{ if(extendTree instanceof JCIdent){ JCIdent tree = (JCIdent)extendTree; + + if(tree == null || tree.sym == null) return super.visitClass(classTree, trees); + com.sun.tools.javac.code.Scope members = tree.sym.members(); if(checkScope(members)) diff --git a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java index eca5d84387..6e597bd002 100644 --- a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java @@ -43,9 +43,9 @@ public class LogicStatementProcessor extends BaseProcessor{ String name = c.annotation(RegisterStatement.class).value(); if(beganWrite){ - writer.nextControlFlow("else if(obj instanceof $T)", c.mirror()); + writer.nextControlFlow("else if(obj.getClass() == $T.class)", c.mirror()); }else{ - writer.beginControlFlow("if(obj instanceof $T)", c.mirror()); + writer.beginControlFlow("if(obj.getClass() == $T.class)", c.mirror()); beganWrite = true; } @@ -53,6 +53,7 @@ public class LogicStatementProcessor extends BaseProcessor{ writer.addStatement("out.append($S)", name); Seq fields = c.fields(); + fields.addAll(c.superclass().fields()); String readSt = "if(tokens[0].equals($S))"; if(beganRead){ @@ -67,7 +68,7 @@ public class LogicStatementProcessor extends BaseProcessor{ int index = 0; for(Svar field : fields){ - if(field.is(Modifier.TRANSIENT)) continue; + if(field.isAny(Modifier.TRANSIENT, Modifier.STATIC)) continue; writer.addStatement("out.append(\" \")"); writer.addStatement("out.append((($T)obj).$L$L)", c.mirror(), field.name(), diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java index c785582157..b3a473795a 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java +++ b/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java @@ -19,7 +19,7 @@ import java.util.*; }) public class RemoteProcess extends BaseProcessor{ /** Maximum size of each event packet. */ - public static final int maxPacketSize = 4096; + public static final int maxPacketSize = 8192; /** Warning on top of each autogenerated file. */ public static final String autogenWarning = "Autogenerated file. Do not modify!\n"; diff --git a/annotations/src/main/java/mindustry/annotations/util/Selement.java b/annotations/src/main/java/mindustry/annotations/util/Selement.java index 1a4c6b784a..ca7a9ce5ad 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Selement.java +++ b/annotations/src/main/java/mindustry/annotations/util/Selement.java @@ -1,7 +1,7 @@ package mindustry.annotations.util; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import com.squareup.javapoet.*; import com.sun.tools.javac.code.Attribute.*; import mindustry.annotations.*; @@ -19,7 +19,8 @@ public class Selement{ this.e = e; } - public @Nullable String doc(){ + @Nullable + public String doc(){ return BaseProcessor.elementu.getDocComment(e); } diff --git a/annotations/src/main/resources/classids.properties b/annotations/src/main/resources/classids.properties index 11943b3c8e..43a3517ff0 100644 --- a/annotations/src/main/resources/classids.properties +++ b/annotations/src/main/resources/classids.properties @@ -3,6 +3,7 @@ alpha=0 atrax=1 block=2 +corvus=24 flare=3 mace=4 mega=5 @@ -13,13 +14,18 @@ mindustry.entities.comp.EffectStateComp=9 mindustry.entities.comp.FireComp=10 mindustry.entities.comp.LaunchCoreComp=11 mindustry.entities.comp.PlayerComp=12 +mindustry.entities.comp.PosTeam=27 +mindustry.entities.comp.PosTeamDef=28 mindustry.entities.comp.PuddleComp=13 mindustry.type.Weather.WeatherStateComp=14 mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=15 mindustry.world.blocks.defense.ForceProjector.ForceDrawComp=22 mono=16 nova=17 +oct=26 poly=18 pulsar=19 +quad=23 risso=20 -spiroct=21 \ No newline at end of file +spiroct=21 +vela=25 \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMechUnit/0.json b/annotations/src/main/resources/revisions/BuilderMechUnit/0.json deleted file mode 100644 index 0588266557..0000000000 --- a/annotations/src/main/resources/revisions/BuilderMechUnit/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMinerUnit/0.json b/annotations/src/main/resources/revisions/BuilderMinerUnit/0.json deleted file mode 100644 index a4e818fd35..0000000000 --- a/annotations/src/main/resources/revisions/BuilderMinerUnit/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/Building/0.json b/annotations/src/main/resources/revisions/BuildingComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Building/0.json rename to annotations/src/main/resources/revisions/BuildingComp/0.json diff --git a/annotations/src/main/resources/revisions/Bullet/0.json b/annotations/src/main/resources/revisions/BulletComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Bullet/0.json rename to annotations/src/main/resources/revisions/BulletComp/0.json diff --git a/annotations/src/main/resources/revisions/Decal/0.json b/annotations/src/main/resources/revisions/DecalComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Decal/0.json rename to annotations/src/main/resources/revisions/DecalComp/0.json diff --git a/annotations/src/main/resources/revisions/EffectState/0.json b/annotations/src/main/resources/revisions/EffectStateComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/0.json rename to annotations/src/main/resources/revisions/EffectStateComp/0.json diff --git a/annotations/src/main/resources/revisions/EffectState/1.json b/annotations/src/main/resources/revisions/EffectStateComp/1.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/1.json rename to annotations/src/main/resources/revisions/EffectStateComp/1.json diff --git a/annotations/src/main/resources/revisions/EffectState/2.json b/annotations/src/main/resources/revisions/EffectStateComp/2.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/2.json rename to annotations/src/main/resources/revisions/EffectStateComp/2.json diff --git a/annotations/src/main/resources/revisions/EffectState/3.json b/annotations/src/main/resources/revisions/EffectStateComp/3.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/3.json rename to annotations/src/main/resources/revisions/EffectStateComp/3.json diff --git a/annotations/src/main/resources/revisions/EffectState/4.json b/annotations/src/main/resources/revisions/EffectStateComp/4.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/4.json rename to annotations/src/main/resources/revisions/EffectStateComp/4.json diff --git a/annotations/src/main/resources/revisions/EffectState/5.json b/annotations/src/main/resources/revisions/EffectStateComp/5.json similarity index 100% rename from annotations/src/main/resources/revisions/EffectState/5.json rename to annotations/src/main/resources/revisions/EffectStateComp/5.json diff --git a/annotations/src/main/resources/revisions/Fire/0.json b/annotations/src/main/resources/revisions/FireComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Fire/0.json rename to annotations/src/main/resources/revisions/FireComp/0.json diff --git a/annotations/src/main/resources/revisions/Fire/1.json b/annotations/src/main/resources/revisions/FireComp/1.json similarity index 100% rename from annotations/src/main/resources/revisions/Fire/1.json rename to annotations/src/main/resources/revisions/FireComp/1.json diff --git a/annotations/src/main/resources/revisions/ForceDraw/0.json b/annotations/src/main/resources/revisions/ForceDrawComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/ForceDraw/0.json rename to annotations/src/main/resources/revisions/ForceDrawComp/0.json diff --git a/annotations/src/main/resources/revisions/LaunchCore/0.json b/annotations/src/main/resources/revisions/LaunchCoreComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/LaunchCore/0.json rename to annotations/src/main/resources/revisions/LaunchCoreComp/0.json diff --git a/annotations/src/main/resources/revisions/LaunchPayload/0.json b/annotations/src/main/resources/revisions/LaunchPayloadComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/LaunchPayload/0.json rename to annotations/src/main/resources/revisions/LaunchPayloadComp/0.json diff --git a/annotations/src/main/resources/revisions/Player/0.json b/annotations/src/main/resources/revisions/PlayerComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Player/0.json rename to annotations/src/main/resources/revisions/PlayerComp/0.json diff --git a/annotations/src/main/resources/revisions/PosTeamDef/0.json b/annotations/src/main/resources/revisions/PosTeamDef/0.json new file mode 100644 index 0000000000..1c1e6c36ec --- /dev/null +++ b/annotations/src/main/resources/revisions/PosTeamDef/0.json @@ -0,0 +1 @@ +{fields:[{name:team,type:mindustry.game.Team},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/Puddle/0.json b/annotations/src/main/resources/revisions/PuddleComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/Puddle/0.json rename to annotations/src/main/resources/revisions/PuddleComp/0.json diff --git a/annotations/src/main/resources/revisions/WeatherState/0.json b/annotations/src/main/resources/revisions/WeatherStateComp/0.json similarity index 100% rename from annotations/src/main/resources/revisions/WeatherState/0.json rename to annotations/src/main/resources/revisions/WeatherStateComp/0.json diff --git a/annotations/src/main/resources/revisions/WeatherState/1.json b/annotations/src/main/resources/revisions/WeatherStateComp/1.json similarity index 100% rename from annotations/src/main/resources/revisions/WeatherState/1.json rename to annotations/src/main/resources/revisions/WeatherStateComp/1.json diff --git a/annotations/src/main/resources/revisions/WeatherState/2.json b/annotations/src/main/resources/revisions/WeatherStateComp/2.json similarity index 100% rename from annotations/src/main/resources/revisions/WeatherState/2.json rename to annotations/src/main/resources/revisions/WeatherStateComp/2.json diff --git a/annotations/src/main/resources/revisions/BlockUnitUnit/0.json b/annotations/src/main/resources/revisions/block/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BlockUnitUnit/0.json rename to annotations/src/main/resources/revisions/block/0.json diff --git a/annotations/src/main/resources/revisions/block/1.json b/annotations/src/main/resources/revisions/block/1.json new file mode 100644 index 0000000000..dd8fdb2784 --- /dev/null +++ b/annotations/src/main/resources/revisions/block/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/block/2.json b/annotations/src/main/resources/revisions/block/2.json new file mode 100644 index 0000000000..b9ab081fe8 --- /dev/null +++ b/annotations/src/main/resources/revisions/block/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/CommanderUnitWaterMove/0.json b/annotations/src/main/resources/revisions/corvus/0.json similarity index 100% rename from annotations/src/main/resources/revisions/CommanderUnitWaterMove/0.json rename to annotations/src/main/resources/revisions/corvus/0.json diff --git a/annotations/src/main/resources/revisions/corvus/1.json b/annotations/src/main/resources/revisions/corvus/1.json new file mode 100644 index 0000000000..dd8fdb2784 --- /dev/null +++ b/annotations/src/main/resources/revisions/corvus/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/corvus/2.json b/annotations/src/main/resources/revisions/corvus/2.json new file mode 100644 index 0000000000..b9ab081fe8 --- /dev/null +++ b/annotations/src/main/resources/revisions/corvus/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/LegsUnit/0.json b/annotations/src/main/resources/revisions/flare/0.json similarity index 100% rename from annotations/src/main/resources/revisions/LegsUnit/0.json rename to annotations/src/main/resources/revisions/flare/0.json diff --git a/annotations/src/main/resources/revisions/flare/1.json b/annotations/src/main/resources/revisions/flare/1.json new file mode 100644 index 0000000000..dd8fdb2784 --- /dev/null +++ b/annotations/src/main/resources/revisions/flare/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/flare/2.json b/annotations/src/main/resources/revisions/flare/2.json new file mode 100644 index 0000000000..b9ab081fe8 --- /dev/null +++ b/annotations/src/main/resources/revisions/flare/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/MechUnit/0.json b/annotations/src/main/resources/revisions/mace/0.json similarity index 100% rename from annotations/src/main/resources/revisions/MechUnit/0.json rename to annotations/src/main/resources/revisions/mace/0.json diff --git a/annotations/src/main/resources/revisions/mace/1.json b/annotations/src/main/resources/revisions/mace/1.json new file mode 100644 index 0000000000..66897ee06f --- /dev/null +++ b/annotations/src/main/resources/revisions/mace/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mace/2.json b/annotations/src/main/resources/revisions/mace/2.json new file mode 100644 index 0000000000..7b348dd022 --- /dev/null +++ b/annotations/src/main/resources/revisions/mace/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMinerPayloadUnit/0.json b/annotations/src/main/resources/revisions/mega/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderMinerPayloadUnit/0.json rename to annotations/src/main/resources/revisions/mega/0.json diff --git a/annotations/src/main/resources/revisions/mega/1.json b/annotations/src/main/resources/revisions/mega/1.json new file mode 100644 index 0000000000..de89770ab4 --- /dev/null +++ b/annotations/src/main/resources/revisions/mega/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:payloads,type:arc.struct.Seq,size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mega/2.json b/annotations/src/main/resources/revisions/mega/2.json new file mode 100644 index 0000000000..87371c85dd --- /dev/null +++ b/annotations/src/main/resources/revisions/mega/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/MinerUnit/0.json b/annotations/src/main/resources/revisions/mono/0.json similarity index 100% rename from annotations/src/main/resources/revisions/MinerUnit/0.json rename to annotations/src/main/resources/revisions/mono/0.json diff --git a/annotations/src/main/resources/revisions/mono/1.json b/annotations/src/main/resources/revisions/mono/1.json new file mode 100644 index 0000000000..9d58b6775a --- /dev/null +++ b/annotations/src/main/resources/revisions/mono/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mono/2.json b/annotations/src/main/resources/revisions/mono/2.json new file mode 100644 index 0000000000..6a6cc37b39 --- /dev/null +++ b/annotations/src/main/resources/revisions/mono/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnit/0.json b/annotations/src/main/resources/revisions/nova/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnit/0.json rename to annotations/src/main/resources/revisions/nova/0.json diff --git a/annotations/src/main/resources/revisions/nova/1.json b/annotations/src/main/resources/revisions/nova/1.json new file mode 100644 index 0000000000..6ed4e60191 --- /dev/null +++ b/annotations/src/main/resources/revisions/nova/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/nova/2.json b/annotations/src/main/resources/revisions/nova/2.json new file mode 100644 index 0000000000..541f5f8c57 --- /dev/null +++ b/annotations/src/main/resources/revisions/nova/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/oct/0.json b/annotations/src/main/resources/revisions/oct/0.json new file mode 100644 index 0000000000..826bd02faf --- /dev/null +++ b/annotations/src/main/resources/revisions/oct/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/oct/1.json b/annotations/src/main/resources/revisions/oct/1.json new file mode 100644 index 0000000000..1e9e8f02c7 --- /dev/null +++ b/annotations/src/main/resources/revisions/oct/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMinerTrailUnit/0.json b/annotations/src/main/resources/revisions/poly/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderMinerTrailUnit/0.json rename to annotations/src/main/resources/revisions/poly/0.json diff --git a/annotations/src/main/resources/revisions/poly/1.json b/annotations/src/main/resources/revisions/poly/1.json new file mode 100644 index 0000000000..3a92a12856 --- /dev/null +++ b/annotations/src/main/resources/revisions/poly/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/poly/2.json b/annotations/src/main/resources/revisions/poly/2.json new file mode 100644 index 0000000000..f210a1f05c --- /dev/null +++ b/annotations/src/main/resources/revisions/poly/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quad/0.json b/annotations/src/main/resources/revisions/quad/0.json new file mode 100644 index 0000000000..a85d764f8c --- /dev/null +++ b/annotations/src/main/resources/revisions/quad/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:payloads,type:arc.struct.Seq,size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quad/1.json b/annotations/src/main/resources/revisions/quad/1.json new file mode 100644 index 0000000000..8ca4ac4388 --- /dev/null +++ b/annotations/src/main/resources/revisions/quad/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:payloads,type:arc.struct.Seq,size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quad/2.json b/annotations/src/main/resources/revisions/quad/2.json new file mode 100644 index 0000000000..c0af7d53a9 --- /dev/null +++ b/annotations/src/main/resources/revisions/quad/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/UnitEntity/0.json b/annotations/src/main/resources/revisions/risso/0.json similarity index 100% rename from annotations/src/main/resources/revisions/UnitEntity/0.json rename to annotations/src/main/resources/revisions/risso/0.json diff --git a/annotations/src/main/resources/revisions/risso/1.json b/annotations/src/main/resources/revisions/risso/1.json new file mode 100644 index 0000000000..dd8fdb2784 --- /dev/null +++ b/annotations/src/main/resources/revisions/risso/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/risso/2.json b/annotations/src/main/resources/revisions/risso/2.json new file mode 100644 index 0000000000..b9ab081fe8 --- /dev/null +++ b/annotations/src/main/resources/revisions/risso/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderLegsUnit/0.json b/annotations/src/main/resources/revisions/spiroct/0.json similarity index 100% rename from annotations/src/main/resources/revisions/BuilderLegsUnit/0.json rename to annotations/src/main/resources/revisions/spiroct/0.json diff --git a/annotations/src/main/resources/revisions/spiroct/1.json b/annotations/src/main/resources/revisions/spiroct/1.json new file mode 100644 index 0000000000..885ef84f29 --- /dev/null +++ b/annotations/src/main/resources/revisions/spiroct/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/spiroct/2.json b/annotations/src/main/resources/revisions/spiroct/2.json new file mode 100644 index 0000000000..fe5760e693 --- /dev/null +++ b/annotations/src/main/resources/revisions/spiroct/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 20e2b7f0dd..e2a00358b6 100644 --- a/build.gradle +++ b/build.gradle @@ -32,11 +32,11 @@ allprojects{ ext{ versionNumber = '6' - if(!project.hasProperty("versionModifier")) versionModifier = 'pre-alpha' + if(!project.hasProperty("versionModifier")) versionModifier = 'alpha' if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' - rhinoVersion = 'eeb327d141146663ff3924bd20d2a5da8a6439cc' + rhinoVersion = '8437435dab9993769d72739608580d40c5343285' loadVersionProps = { return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } @@ -173,23 +173,38 @@ allprojects{ } tasks.withType(JavaCompile){ - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + targetCompatibility = 8 + sourceCompatibility = 14 options.encoding = "UTF-8" options.compilerArgs += ["-Xlint:deprecation"] } } -//compile with java 8 compatibility for everything except the annotati project +configure(project(":annotations")){ + tasks.withType(JavaCompile){ + targetCompatibility = 8 + sourceCompatibility = 8 + } +} + +//compile with java 8 compatibility for everything except the annotation project configure(subprojects - project(":annotations")){ tasks.withType(JavaCompile){ if(JavaVersion.current() != JavaVersion.VERSION_1_8){ - options.compilerArgs.addAll(['--release', '8']) + options.compilerArgs.addAll(['--release', '8', '--enable-preview']) + } + + doFirst{ + options.compilerArgs = options.compilerArgs.findAll{it != '--enable-preview' } } } tasks.withType(Javadoc){ - options.addStringOption('Xdoclint:none', '-quiet') + options{ + addStringOption('Xdoclint:none', '-quiet') + addBooleanOption('-enable-preview', true) + addStringOption('-release', '14') + } } } @@ -200,7 +215,6 @@ project(":desktop"){ dependencies{ implementation project(":core") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("natives:natives-desktop") implementation arcModule("natives:natives-freetype-desktop") implementation 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' @@ -239,7 +253,6 @@ project(":ios"){ implementation arcModule("natives:natives-ios") implementation arcModule("natives:natives-freetype-ios") - implementation arcModule("natives:natives-box2d-ios") implementation arcModule("backends:backend-robovm") compileOnly project(":annotations") @@ -261,7 +274,6 @@ project(":core"){ doLast{ def props = loadVersionProps() def androidVersion = props['androidBuildCode'].toInteger() - 2 - def buildVersion = props["build"] def loglines = file("../changelog").text.split("\n") def maxLength = 460 @@ -273,7 +285,6 @@ project(":core"){ } } def changelogs = file("../fastlane/metadata/android/en-US/changelogs/") - new File(changelogs, buildVersion + ".txt").text = (result) new File(changelogs, androidVersion + ".txt").text = (result) } } @@ -284,7 +295,6 @@ project(":core"){ api "org.lz4:lz4-java:1.4.1" api arcModule("arc-core") api arcModule("extensions:freetype") - api arcModule("extensions:box2d") api arcModule("extensions:g3d") api arcModule("extensions:fx") api arcModule("extensions:arcnet") @@ -293,6 +303,8 @@ project(":core"){ compileOnly project(":annotations") annotationProcessor project(":annotations") + annotationProcessor 'com.github.Anuken:jabel:40eec868af' + } } @@ -301,7 +313,6 @@ project(":server"){ dependencies{ implementation project(":core") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("backends:backend-headless") } } @@ -314,7 +325,6 @@ project(":tests"){ testImplementation "org.junit.jupiter:junit-jupiter-params:5.3.1" testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1" testImplementation arcModule("backends:backend-headless") - testImplementation arcModule("natives:natives-box2d-desktop") testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.3.1" } @@ -336,7 +346,6 @@ project(":tools"){ implementation arcModule("natives:natives-desktop") implementation arcModule("natives:natives-freetype-desktop") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("backends:backend-headless") } } diff --git a/core/assets-raw/sprites/blocks/campaign/core-silo.png b/core/assets-raw/sprites/blocks/campaign/core-silo.png deleted file mode 100644 index dbb0b6d70c..0000000000 Binary files a/core/assets-raw/sprites/blocks/campaign/core-silo.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/defense/parallax.png b/core/assets-raw/sprites/blocks/defense/parallax.png index d9224ab066..2b6109e0b1 100644 Binary files a/core/assets-raw/sprites/blocks/defense/parallax.png and b/core/assets-raw/sprites/blocks/defense/parallax.png differ diff --git a/core/assets-raw/sprites/blocks/defense/segment.png b/core/assets-raw/sprites/blocks/defense/segment.png index 57bd53d61d..57da490c5f 100644 Binary files a/core/assets-raw/sprites/blocks/defense/segment.png and b/core/assets-raw/sprites/blocks/defense/segment.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png index 5a113d8e02..2995011050 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png index 0312349cc8..4e3d884d60 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png index 97ff507f6e..ca1ca5e98f 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png index f0555606e1..b5afa99ceb 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png index caab53e98b..961cfc9290 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png index 26c760e325..3c2cb422da 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png index 652dff1730..d3e7cac664 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png index 8af227bd04..ba02b11f2f 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png index a10e7d2c30..dde9319f48 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png index babb8c9d7b..c1c73953ac 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png index 31af8a221e..5401d769aa 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png index 4bd89f0199..feb39f4ab1 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png index 5a665f713b..868b0f4798 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png index a9647797fe..2d7f0902f6 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png index fc36ed94f0..a1d8c76dd9 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png index 6db61c006e..e707dd80d4 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png index aed4c7decb..c50b281985 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png index 213168b5ea..6dfe694ec0 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png index a69604d6fe..ef313ad576 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png index 6cd887f110..e5ccf27dbb 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png index 0eaf09d5a4..5041f028ed 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png index b19a7aaab7..3f5fbf0184 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png index 16b0938f9f..0f8b73714d 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png index 98d03b428e..89ad916de7 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png index f166ec32f7..fa082af1be 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png index 0694b091f6..fd22fd478c 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/ignarock1.png b/core/assets-raw/sprites/blocks/environment/basalt1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/ignarock1.png rename to core/assets-raw/sprites/blocks/environment/basalt1.png diff --git a/core/assets-raw/sprites/blocks/environment/ignarock2.png b/core/assets-raw/sprites/blocks/environment/basalt2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/ignarock2.png rename to core/assets-raw/sprites/blocks/environment/basalt2.png diff --git a/core/assets-raw/sprites/blocks/environment/ignarock3.png b/core/assets-raw/sprites/blocks/environment/basalt3.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/ignarock3.png rename to core/assets-raw/sprites/blocks/environment/basalt3.png diff --git a/core/assets-raw/sprites/blocks/environment/cliff0.png b/core/assets-raw/sprites/blocks/environment/cliff0.png new file mode 100644 index 0000000000..17b24f68e1 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff0.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff1.png b/core/assets-raw/sprites/blocks/environment/cliff1.png new file mode 100644 index 0000000000..03ff8dbf3d Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff2.png b/core/assets-raw/sprites/blocks/environment/cliff2.png new file mode 100644 index 0000000000..dbf002cee5 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff3.png b/core/assets-raw/sprites/blocks/environment/cliff3.png new file mode 100644 index 0000000000..e78a6f27ce Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff4.png b/core/assets-raw/sprites/blocks/environment/cliff4.png new file mode 100644 index 0000000000..7800c59677 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff4.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff5.png b/core/assets-raw/sprites/blocks/environment/cliff5.png new file mode 100644 index 0000000000..2e71f802f2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff5.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff6.png b/core/assets-raw/sprites/blocks/environment/cliff6.png new file mode 100644 index 0000000000..fceb598e3e Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff6.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliff7.png b/core/assets-raw/sprites/blocks/environment/cliff7.png new file mode 100644 index 0000000000..5978387bbe Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/cliff7.png differ diff --git a/core/assets-raw/sprites/blocks/environment/cliffs1.png b/core/assets-raw/sprites/blocks/environment/cliffs1.png deleted file mode 100644 index eb60a159df..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/cliffs1.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite-wall-large.png b/core/assets-raw/sprites/blocks/environment/dacite-wall-large.png new file mode 100644 index 0000000000..93e88e2888 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite-wall1.png b/core/assets-raw/sprites/blocks/environment/dacite-wall1.png new file mode 100644 index 0000000000..3f0f70e0a2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite-wall1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite-wall2.png b/core/assets-raw/sprites/blocks/environment/dacite-wall2.png new file mode 100644 index 0000000000..07dd33ae40 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite-wall2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite1.png b/core/assets-raw/sprites/blocks/environment/dacite1.png new file mode 100644 index 0000000000..07a7a19ece Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite2.png b/core/assets-raw/sprites/blocks/environment/dacite2.png new file mode 100644 index 0000000000..f4e2ebe0d9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite3.png b/core/assets-raw/sprites/blocks/environment/dacite3.png new file mode 100644 index 0000000000..1580a22f07 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt-wall-large.png b/core/assets-raw/sprites/blocks/environment/dirt-wall-large.png new file mode 100644 index 0000000000..649410e18a Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt-wall1.png b/core/assets-raw/sprites/blocks/environment/dirt-wall1.png new file mode 100644 index 0000000000..6250affd44 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt-wall1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt-wall2.png b/core/assets-raw/sprites/blocks/environment/dirt-wall2.png new file mode 100644 index 0000000000..4840a10535 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt-wall2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt1.png b/core/assets-raw/sprites/blocks/environment/dirt1.png new file mode 100644 index 0000000000..1f2b788140 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt2.png b/core/assets-raw/sprites/blocks/environment/dirt2.png new file mode 100644 index 0000000000..40e84864b8 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt3.png b/core/assets-raw/sprites/blocks/environment/dirt3.png new file mode 100644 index 0000000000..0bf0e1c7e8 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dunerocks-large.png b/core/assets-raw/sprites/blocks/environment/dune-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/dunerocks-large.png rename to core/assets-raw/sprites/blocks/environment/dune-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/dune-wall1.png b/core/assets-raw/sprites/blocks/environment/dune-wall1.png new file mode 100644 index 0000000000..64d13b3f24 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dune-wall1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dune-wall2.png b/core/assets-raw/sprites/blocks/environment/dune-wall2.png new file mode 100644 index 0000000000..5e3efcaae0 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dune-wall2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dunerocks1.png b/core/assets-raw/sprites/blocks/environment/dunerocks1.png deleted file mode 100644 index 923945dd74..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/dunerocks1.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/dunerocks2.png b/core/assets-raw/sprites/blocks/environment/dunerocks2.png deleted file mode 100644 index 85783da449..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/dunerocks2.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/holostone1.png b/core/assets-raw/sprites/blocks/environment/holostone1.png deleted file mode 100644 index 4f25d079a3..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/holostone1.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/holostone2.png b/core/assets-raw/sprites/blocks/environment/holostone2.png deleted file mode 100644 index e226a0497b..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/holostone2.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/holostone3.png b/core/assets-raw/sprites/blocks/environment/holostone3.png deleted file mode 100644 index c11a6ce03e..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/holostone3.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/icerocks-large.png b/core/assets-raw/sprites/blocks/environment/ice-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/icerocks-large.png rename to core/assets-raw/sprites/blocks/environment/ice-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/icerocks1.png b/core/assets-raw/sprites/blocks/environment/ice-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/icerocks1.png rename to core/assets-raw/sprites/blocks/environment/ice-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/icerocks2.png b/core/assets-raw/sprites/blocks/environment/ice-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/icerocks2.png rename to core/assets-raw/sprites/blocks/environment/ice-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/metal-floor-3.png b/core/assets-raw/sprites/blocks/environment/metal-floor-3.png index 7fbb9243b4..8b87059487 100644 Binary files a/core/assets-raw/sprites/blocks/environment/metal-floor-3.png and b/core/assets-raw/sprites/blocks/environment/metal-floor-3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/mud1.png b/core/assets-raw/sprites/blocks/environment/mud1.png new file mode 100644 index 0000000000..2f5963cef9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/mud1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/mud2.png b/core/assets-raw/sprites/blocks/environment/mud2.png new file mode 100644 index 0000000000..2407ae4449 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/mud2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/mud3.png b/core/assets-raw/sprites/blocks/environment/mud3.png new file mode 100644 index 0000000000..a602c93469 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/mud3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/saltrocks-large.png b/core/assets-raw/sprites/blocks/environment/salt-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/saltrocks-large.png rename to core/assets-raw/sprites/blocks/environment/salt-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/saltrocks1.png b/core/assets-raw/sprites/blocks/environment/salt-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/saltrocks1.png rename to core/assets-raw/sprites/blocks/environment/salt-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/saltrocks2.png b/core/assets-raw/sprites/blocks/environment/salt-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/saltrocks2.png rename to core/assets-raw/sprites/blocks/environment/salt-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/sandrocks-large.png b/core/assets-raw/sprites/blocks/environment/sand-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sandrocks-large.png rename to core/assets-raw/sprites/blocks/environment/sand-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/sandrocks1.png b/core/assets-raw/sprites/blocks/environment/sand-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sandrocks1.png rename to core/assets-raw/sprites/blocks/environment/sand-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/sandrocks2.png b/core/assets-raw/sprites/blocks/environment/sand-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sandrocks2.png rename to core/assets-raw/sprites/blocks/environment/sand-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/shalerocks-large.png b/core/assets-raw/sprites/blocks/environment/shale-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/shalerocks-large.png rename to core/assets-raw/sprites/blocks/environment/shale-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/shalerocks1.png b/core/assets-raw/sprites/blocks/environment/shale-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/shalerocks1.png rename to core/assets-raw/sprites/blocks/environment/shale-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/shalerocks2.png b/core/assets-raw/sprites/blocks/environment/shale-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/shalerocks2.png rename to core/assets-raw/sprites/blocks/environment/shale-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/snowrocks-large.png b/core/assets-raw/sprites/blocks/environment/snow-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/snowrocks-large.png rename to core/assets-raw/sprites/blocks/environment/snow-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/snowrocks1.png b/core/assets-raw/sprites/blocks/environment/snow-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/snowrocks1.png rename to core/assets-raw/sprites/blocks/environment/snow-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/snowrocks2.png b/core/assets-raw/sprites/blocks/environment/snow-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/snowrocks2.png rename to core/assets-raw/sprites/blocks/environment/snow-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/space.png b/core/assets-raw/sprites/blocks/environment/space.png new file mode 100644 index 0000000000..bc38442fd1 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/space.png differ diff --git a/core/assets-raw/sprites/blocks/environment/sporerocks-large.png b/core/assets-raw/sprites/blocks/environment/spore-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sporerocks-large.png rename to core/assets-raw/sprites/blocks/environment/spore-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/sporerocks1.png b/core/assets-raw/sprites/blocks/environment/spore-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sporerocks1.png rename to core/assets-raw/sprites/blocks/environment/spore-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/sporerocks2.png b/core/assets-raw/sprites/blocks/environment/spore-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sporerocks2.png rename to core/assets-raw/sprites/blocks/environment/spore-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/rocks-large.png b/core/assets-raw/sprites/blocks/environment/stone-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/rocks-large.png rename to core/assets-raw/sprites/blocks/environment/stone-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/rocks1.png b/core/assets-raw/sprites/blocks/environment/stone-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/rocks1.png rename to core/assets-raw/sprites/blocks/environment/stone-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/rocks2.png b/core/assets-raw/sprites/blocks/environment/stone-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/rocks2.png rename to core/assets-raw/sprites/blocks/environment/stone-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/tar.png b/core/assets-raw/sprites/blocks/environment/tar.png index 8ad3f8ec68..d959f6df4b 100644 Binary files a/core/assets-raw/sprites/blocks/environment/tar.png and b/core/assets-raw/sprites/blocks/environment/tar.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png b/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png index a94e604467..4e33a6bfba 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png and b/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png b/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png index 85533fef2f..961a9f82c7 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png and b/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png b/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png index 255c710915..c1c36e33be 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png and b/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png differ diff --git a/core/assets-raw/sprites/blocks/logic/large-logic-display.png b/core/assets-raw/sprites/blocks/logic/large-logic-display.png new file mode 100644 index 0000000000..fb10d438bb Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/large-logic-display.png differ diff --git a/core/assets-raw/sprites/blocks/logic/memory-bank.png b/core/assets-raw/sprites/blocks/logic/memory-bank.png new file mode 100644 index 0000000000..59bd139f2d Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/memory-bank.png differ diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-cap.png b/core/assets-raw/sprites/blocks/power/steam-generator-cap.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-cap.png rename to core/assets-raw/sprites/blocks/power/steam-generator-cap.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-liquid.png b/core/assets-raw/sprites/blocks/power/steam-generator-liquid.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-liquid.png rename to core/assets-raw/sprites/blocks/power/steam-generator-liquid.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-top.png b/core/assets-raw/sprites/blocks/power/steam-generator-top.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-top.png rename to core/assets-raw/sprites/blocks/power/steam-generator-top.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-turbine0.png b/core/assets-raw/sprites/blocks/power/steam-generator-turbine0.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-turbine0.png rename to core/assets-raw/sprites/blocks/power/steam-generator-turbine0.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-turbine1.png b/core/assets-raw/sprites/blocks/power/steam-generator-turbine1.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-turbine1.png rename to core/assets-raw/sprites/blocks/power/steam-generator-turbine1.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator.png b/core/assets-raw/sprites/blocks/power/steam-generator.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator.png rename to core/assets-raw/sprites/blocks/power/steam-generator.png diff --git a/core/assets-raw/sprites/blocks/power/thorium-reactor-lights.png b/core/assets-raw/sprites/blocks/power/thorium-reactor-lights.png index fb10892472..5af4b45d78 100644 Binary files a/core/assets-raw/sprites/blocks/power/thorium-reactor-lights.png and b/core/assets-raw/sprites/blocks/power/thorium-reactor-lights.png differ diff --git a/core/assets-raw/sprites/blocks/production/cryofluidmixer-bottom.png b/core/assets-raw/sprites/blocks/production/cryofluid-mixer-bottom.png similarity index 100% rename from core/assets-raw/sprites/blocks/production/cryofluidmixer-bottom.png rename to core/assets-raw/sprites/blocks/production/cryofluid-mixer-bottom.png diff --git a/core/assets-raw/sprites/blocks/production/cryofluidmixer-liquid.png b/core/assets-raw/sprites/blocks/production/cryofluid-mixer-liquid.png similarity index 100% rename from core/assets-raw/sprites/blocks/production/cryofluidmixer-liquid.png rename to core/assets-raw/sprites/blocks/production/cryofluid-mixer-liquid.png diff --git a/core/assets-raw/sprites/blocks/production/cryofluid-mixer-top.png b/core/assets-raw/sprites/blocks/production/cryofluid-mixer-top.png new file mode 100644 index 0000000000..3bb5abe3cb Binary files /dev/null and b/core/assets-raw/sprites/blocks/production/cryofluid-mixer-top.png differ diff --git a/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png b/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png deleted file mode 100644 index e90db33565..0000000000 Binary files a/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/production/phase-weaver.png b/core/assets-raw/sprites/blocks/production/phase-weaver.png index 4cbda78f1b..282d9bcd6a 100644 Binary files a/core/assets-raw/sprites/blocks/production/phase-weaver.png and b/core/assets-raw/sprites/blocks/production/phase-weaver.png differ diff --git a/core/assets-raw/sprites/blocks/props/rock1.png b/core/assets-raw/sprites/blocks/props/boulder1.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/rock1.png rename to core/assets-raw/sprites/blocks/props/boulder1.png diff --git a/core/assets-raw/sprites/blocks/props/rock2.png b/core/assets-raw/sprites/blocks/props/boulder2.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/rock2.png rename to core/assets-raw/sprites/blocks/props/boulder2.png diff --git a/core/assets-raw/sprites/blocks/props/dacite-boulder1.png b/core/assets-raw/sprites/blocks/props/dacite-boulder1.png new file mode 100644 index 0000000000..ffddeef34b Binary files /dev/null and b/core/assets-raw/sprites/blocks/props/dacite-boulder1.png differ diff --git a/core/assets-raw/sprites/blocks/props/dacite-boulder2.png b/core/assets-raw/sprites/blocks/props/dacite-boulder2.png new file mode 100644 index 0000000000..aa258941cd Binary files /dev/null and b/core/assets-raw/sprites/blocks/props/dacite-boulder2.png differ diff --git a/core/assets-raw/sprites/blocks/props/snowrock1.png b/core/assets-raw/sprites/blocks/props/snow-boulder1.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/snowrock1.png rename to core/assets-raw/sprites/blocks/props/snow-boulder1.png diff --git a/core/assets-raw/sprites/blocks/props/snowrock2.png b/core/assets-raw/sprites/blocks/props/snow-boulder2.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/snowrock2.png rename to core/assets-raw/sprites/blocks/props/snow-boulder2.png diff --git a/core/assets-raw/sprites/blocks/storage/container-team.png b/core/assets-raw/sprites/blocks/storage/container-team.png new file mode 100644 index 0000000000..5ee1dd3226 Binary files /dev/null and b/core/assets-raw/sprites/blocks/storage/container-team.png differ diff --git a/core/assets-raw/sprites/blocks/storage/container.png b/core/assets-raw/sprites/blocks/storage/container.png index 368cec3a21..959e2b6edf 100644 Binary files a/core/assets-raw/sprites/blocks/storage/container.png and b/core/assets-raw/sprites/blocks/storage/container.png differ diff --git a/core/assets-raw/sprites/blocks/storage/vault-team.png b/core/assets-raw/sprites/blocks/storage/vault-team.png new file mode 100644 index 0000000000..0ce6a50222 Binary files /dev/null and b/core/assets-raw/sprites/blocks/storage/vault-team.png differ diff --git a/core/assets-raw/sprites/blocks/storage/vault.png b/core/assets-raw/sprites/blocks/storage/vault.png index 38f46d97aa..36a4ee5ea5 100644 Binary files a/core/assets-raw/sprites/blocks/storage/vault.png and b/core/assets-raw/sprites/blocks/storage/vault.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/arc.png b/core/assets-raw/sprites/blocks/turrets/arc.png index f214c4aa0f..106963aa68 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/arc.png and b/core/assets-raw/sprites/blocks/turrets/arc.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/cyclone.png b/core/assets-raw/sprites/blocks/turrets/cyclone.png index 7e1ae002b1..a0e34e20e7 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/cyclone.png and b/core/assets-raw/sprites/blocks/turrets/cyclone.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/duo.png b/core/assets-raw/sprites/blocks/turrets/duo.png index c234ccb38c..147d78f16f 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/duo.png and b/core/assets-raw/sprites/blocks/turrets/duo.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/foreshadow-heat.png b/core/assets-raw/sprites/blocks/turrets/foreshadow-heat.png new file mode 100644 index 0000000000..e0902e17d4 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/foreshadow-heat.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/foreshadow.png b/core/assets-raw/sprites/blocks/turrets/foreshadow.png new file mode 100644 index 0000000000..5a27960a73 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/foreshadow.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/fuse.png b/core/assets-raw/sprites/blocks/turrets/fuse.png index 7322029f77..61ff3c7b2d 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/fuse.png and b/core/assets-raw/sprites/blocks/turrets/fuse.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/hail.png b/core/assets-raw/sprites/blocks/turrets/hail.png index 4333d6ef7e..10001df6ed 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/hail.png and b/core/assets-raw/sprites/blocks/turrets/hail.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/lancer.png b/core/assets-raw/sprites/blocks/turrets/lancer.png index d3bbc2d909..08f1ea9e30 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/lancer.png and b/core/assets-raw/sprites/blocks/turrets/lancer.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/salvo-panel-left.png b/core/assets-raw/sprites/blocks/turrets/salvo-panel-left.png deleted file mode 100644 index de0af2f724..0000000000 Binary files a/core/assets-raw/sprites/blocks/turrets/salvo-panel-left.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/turrets/salvo-panel-right.png b/core/assets-raw/sprites/blocks/turrets/salvo-panel-right.png deleted file mode 100644 index 462f082f2a..0000000000 Binary files a/core/assets-raw/sprites/blocks/turrets/salvo-panel-right.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/turrets/salvo.png b/core/assets-raw/sprites/blocks/turrets/salvo.png index 63db15cded..4904a913a5 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/salvo.png and b/core/assets-raw/sprites/blocks/turrets/salvo.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/scatter.png b/core/assets-raw/sprites/blocks/turrets/scatter.png index 82d01d22c2..f4f0d73954 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/scatter.png and b/core/assets-raw/sprites/blocks/turrets/scatter.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/scorch.png b/core/assets-raw/sprites/blocks/turrets/scorch.png index 54616726e5..abbd3b5188 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/scorch.png and b/core/assets-raw/sprites/blocks/turrets/scorch.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/swarmer.png b/core/assets-raw/sprites/blocks/turrets/swarmer.png index c8c5cd54cf..6f98a1ba7a 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/swarmer.png and b/core/assets-raw/sprites/blocks/turrets/swarmer.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/tsunami-liquid.png b/core/assets-raw/sprites/blocks/turrets/tsunami-liquid.png new file mode 100644 index 0000000000..8c88e9a0be Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/tsunami-liquid.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/tsunami-top.png b/core/assets-raw/sprites/blocks/turrets/tsunami-top.png new file mode 100644 index 0000000000..fc3b172fd2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/tsunami-top.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/tsunami.png b/core/assets-raw/sprites/blocks/turrets/tsunami.png new file mode 100644 index 0000000000..b11d2c2307 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/tsunami.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/wave-top.png b/core/assets-raw/sprites/blocks/turrets/wave-top.png new file mode 100644 index 0000000000..66f9939101 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/wave-top.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/wave.png b/core/assets-raw/sprites/blocks/turrets/wave.png index f7823cc437..58d5d46e55 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/wave.png and b/core/assets-raw/sprites/blocks/turrets/wave.png differ diff --git a/core/assets-raw/sprites/blocks/units/command-center-team.png b/core/assets-raw/sprites/blocks/units/command-center-team.png new file mode 100644 index 0000000000..b9d27f73c9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/command-center-team.png differ diff --git a/core/assets-raw/sprites/blocks/units/command-center.png b/core/assets-raw/sprites/blocks/units/command-center.png index ac9aa45594..a0de4888a9 100644 Binary files a/core/assets-raw/sprites/blocks/units/command-center.png and b/core/assets-raw/sprites/blocks/units/command-center.png differ diff --git a/core/assets-raw/sprites/blocks/walls/copper-wall-large.png b/core/assets-raw/sprites/blocks/walls/copper-wall-large.png index dbc59dd808..00e890dabc 100644 Binary files a/core/assets-raw/sprites/blocks/walls/copper-wall-large.png and b/core/assets-raw/sprites/blocks/walls/copper-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/surge-wall-large.png b/core/assets-raw/sprites/blocks/walls/surge-wall-large.png index 285cfb52e8..e0cc1b8b86 100644 Binary files a/core/assets-raw/sprites/blocks/walls/surge-wall-large.png and b/core/assets-raw/sprites/blocks/walls/surge-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/surge-wall.png b/core/assets-raw/sprites/blocks/walls/surge-wall.png index 786ea64867..8dd6798b02 100644 Binary files a/core/assets-raw/sprites/blocks/walls/surge-wall.png and b/core/assets-raw/sprites/blocks/walls/surge-wall.png differ diff --git a/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png b/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png index 80564101f8..ef8f313f09 100644 Binary files a/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png and b/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/thorium-wall.png b/core/assets-raw/sprites/blocks/walls/thorium-wall.png index 4fb0aaf1da..deb9edeea0 100644 Binary files a/core/assets-raw/sprites/blocks/walls/thorium-wall.png and b/core/assets-raw/sprites/blocks/walls/thorium-wall.png differ diff --git a/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png b/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png index 2bf8ad2aec..9242df7d20 100644 Binary files a/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png and b/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png differ diff --git a/core/assets-raw/sprites/effects/large-bomb-back.png b/core/assets-raw/sprites/effects/large-bomb-back.png new file mode 100644 index 0000000000..7a7b643de6 Binary files /dev/null and b/core/assets-raw/sprites/effects/large-bomb-back.png differ diff --git a/core/assets-raw/sprites/effects/large-bomb.png b/core/assets-raw/sprites/effects/large-bomb.png new file mode 100644 index 0000000000..e670244c35 Binary files /dev/null and b/core/assets-raw/sprites/effects/large-bomb.png differ diff --git a/core/assets-raw/sprites/ui/button-right-disabled.9.png b/core/assets-raw/sprites/ui/button-right-disabled.9.png new file mode 100644 index 0000000000..4201ec590a Binary files /dev/null and b/core/assets-raw/sprites/ui/button-right-disabled.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right-down.9.png b/core/assets-raw/sprites/ui/button-right-down.9.png index 00b41dabe4..e0f26e84af 100644 Binary files a/core/assets-raw/sprites/ui/button-right-down.9.png and b/core/assets-raw/sprites/ui/button-right-down.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right-over.9.png b/core/assets-raw/sprites/ui/button-right-over.9.png index a8f83eee16..af7f6d1d6d 100644 Binary files a/core/assets-raw/sprites/ui/button-right-over.9.png and b/core/assets-raw/sprites/ui/button-right-over.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right.9.png b/core/assets-raw/sprites/ui/button-right.9.png index e43fe0c11c..2fd7ee856d 100644 Binary files a/core/assets-raw/sprites/ui/button-right.9.png and b/core/assets-raw/sprites/ui/button-right.9.png differ diff --git a/core/assets-raw/sprites/ui/logo.png b/core/assets-raw/sprites/ui/logo.png index 0a1778c104..e064a8a450 100644 Binary files a/core/assets-raw/sprites/ui/logo.png and b/core/assets-raw/sprites/ui/logo.png differ diff --git a/core/assets-raw/sprites/ui/wavepane.9.png b/core/assets-raw/sprites/ui/wavepane.9.png new file mode 100644 index 0000000000..29ae8b9852 Binary files /dev/null and b/core/assets-raw/sprites/ui/wavepane.9.png differ diff --git a/core/assets-raw/sprites/units/beta.png b/core/assets-raw/sprites/units/beta.png index b1bca129e6..5bba30659e 100644 Binary files a/core/assets-raw/sprites/units/beta.png and b/core/assets-raw/sprites/units/beta.png differ diff --git a/core/assets-raw/sprites/units/corvus-base.png b/core/assets-raw/sprites/units/corvus-base.png new file mode 100644 index 0000000000..448484ab53 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-base.png differ diff --git a/core/assets-raw/sprites/units/corvus-cell.png b/core/assets-raw/sprites/units/corvus-cell.png new file mode 100644 index 0000000000..a0be843703 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-cell.png differ diff --git a/core/assets-raw/sprites/units/corvus-foot.png b/core/assets-raw/sprites/units/corvus-foot.png new file mode 100644 index 0000000000..3dcb61c7fc Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-foot.png differ diff --git a/core/assets-raw/sprites/units/corvus-joint-base.png b/core/assets-raw/sprites/units/corvus-joint-base.png new file mode 100644 index 0000000000..921a27e55c Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-joint-base.png differ diff --git a/core/assets-raw/sprites/units/corvus-joint.png b/core/assets-raw/sprites/units/corvus-joint.png new file mode 100644 index 0000000000..2a83e1f3bc Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-joint.png differ diff --git a/core/assets-raw/sprites/units/corvus-leg-base.png b/core/assets-raw/sprites/units/corvus-leg-base.png new file mode 100644 index 0000000000..07d18a1a44 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-leg-base.png differ diff --git a/core/assets-raw/sprites/units/corvus-leg.png b/core/assets-raw/sprites/units/corvus-leg.png new file mode 100644 index 0000000000..581dc52032 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-leg.png differ diff --git a/core/assets-raw/sprites/units/corvus-weapon-heat.png b/core/assets-raw/sprites/units/corvus-weapon-heat.png new file mode 100644 index 0000000000..6ea3ffe1e7 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-weapon-heat.png differ diff --git a/core/assets-raw/sprites/units/corvus.png b/core/assets-raw/sprites/units/corvus.png new file mode 100644 index 0000000000..59c20e2566 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus.png differ diff --git a/core/assets-raw/sprites/units/dagger-leg.png b/core/assets-raw/sprites/units/dagger-leg.png index f67d4257cf..d27c010dbc 100644 Binary files a/core/assets-raw/sprites/units/dagger-leg.png and b/core/assets-raw/sprites/units/dagger-leg.png differ diff --git a/core/assets-raw/sprites/units/gamma.png b/core/assets-raw/sprites/units/gamma.png index bbc3c7a57a..c603be37d1 100644 Binary files a/core/assets-raw/sprites/units/gamma.png and b/core/assets-raw/sprites/units/gamma.png differ diff --git a/core/assets-raw/sprites/units/mace-leg.png b/core/assets-raw/sprites/units/mace-leg.png index 82aba38b82..bb1b501dfa 100644 Binary files a/core/assets-raw/sprites/units/mace-leg.png and b/core/assets-raw/sprites/units/mace-leg.png differ diff --git a/core/assets-raw/sprites/units/mega.png b/core/assets-raw/sprites/units/mega.png index 9fdade2d20..3cbd6cc822 100644 Binary files a/core/assets-raw/sprites/units/mega.png and b/core/assets-raw/sprites/units/mega.png differ diff --git a/core/assets-raw/sprites/units/minke.png b/core/assets-raw/sprites/units/minke.png index 99079defd5..32ec1fadfe 100644 Binary files a/core/assets-raw/sprites/units/minke.png and b/core/assets-raw/sprites/units/minke.png differ diff --git a/core/assets-raw/sprites/units/oct-cell.png b/core/assets-raw/sprites/units/oct-cell.png new file mode 100644 index 0000000000..436242ed95 Binary files /dev/null and b/core/assets-raw/sprites/units/oct-cell.png differ diff --git a/core/assets-raw/sprites/units/oct.png b/core/assets-raw/sprites/units/oct.png new file mode 100644 index 0000000000..067ebb857b Binary files /dev/null and b/core/assets-raw/sprites/units/oct.png differ diff --git a/core/assets-raw/sprites/units/omura-cannon-heat.png b/core/assets-raw/sprites/units/omura-cannon-heat.png new file mode 100644 index 0000000000..5e2b0dc212 Binary files /dev/null and b/core/assets-raw/sprites/units/omura-cannon-heat.png differ diff --git a/core/assets-raw/sprites/units/omura-cell.png b/core/assets-raw/sprites/units/omura-cell.png new file mode 100644 index 0000000000..504824b015 Binary files /dev/null and b/core/assets-raw/sprites/units/omura-cell.png differ diff --git a/core/assets-raw/sprites/units/omura.png b/core/assets-raw/sprites/units/omura.png new file mode 100644 index 0000000000..02befddd78 Binary files /dev/null and b/core/assets-raw/sprites/units/omura.png differ diff --git a/core/assets-raw/sprites/units/pulsar.png b/core/assets-raw/sprites/units/pulsar.png index eb49cd3751..af014df891 100644 Binary files a/core/assets-raw/sprites/units/pulsar.png and b/core/assets-raw/sprites/units/pulsar.png differ diff --git a/core/assets-raw/sprites/units/quad-cell.png b/core/assets-raw/sprites/units/quad-cell.png new file mode 100644 index 0000000000..13222f495b Binary files /dev/null and b/core/assets-raw/sprites/units/quad-cell.png differ diff --git a/core/assets-raw/sprites/units/quad.png b/core/assets-raw/sprites/units/quad.png new file mode 100644 index 0000000000..95435c1f38 Binary files /dev/null and b/core/assets-raw/sprites/units/quad.png differ diff --git a/core/assets-raw/sprites/units/reign-leg.png b/core/assets-raw/sprites/units/reign-leg.png index f4c8c27e6a..1bf212125e 100644 Binary files a/core/assets-raw/sprites/units/reign-leg.png and b/core/assets-raw/sprites/units/reign-leg.png differ diff --git a/core/assets-raw/sprites/units/risso.png b/core/assets-raw/sprites/units/risso.png index e063474798..6cee60313b 100644 Binary files a/core/assets-raw/sprites/units/risso.png and b/core/assets-raw/sprites/units/risso.png differ diff --git a/core/assets-raw/sprites/units/scepter-leg.png b/core/assets-raw/sprites/units/scepter-leg.png index a7df74e158..80e25079bf 100644 Binary files a/core/assets-raw/sprites/units/scepter-leg.png and b/core/assets-raw/sprites/units/scepter-leg.png differ diff --git a/core/assets-raw/sprites/units/sei-cell.png b/core/assets-raw/sprites/units/sei-cell.png new file mode 100644 index 0000000000..c440ce3ee6 Binary files /dev/null and b/core/assets-raw/sprites/units/sei-cell.png differ diff --git a/core/assets-raw/sprites/units/sei.png b/core/assets-raw/sprites/units/sei.png new file mode 100644 index 0000000000..724fe9559b Binary files /dev/null and b/core/assets-raw/sprites/units/sei.png differ diff --git a/core/assets-raw/sprites/units/vela-base.png b/core/assets-raw/sprites/units/vela-base.png new file mode 100644 index 0000000000..1ec4aac230 Binary files /dev/null and b/core/assets-raw/sprites/units/vela-base.png differ diff --git a/core/assets-raw/sprites/units/vela-cell.png b/core/assets-raw/sprites/units/vela-cell.png new file mode 100644 index 0000000000..595fbce8be Binary files /dev/null and b/core/assets-raw/sprites/units/vela-cell.png differ diff --git a/core/assets-raw/sprites/units/vela-leg.png b/core/assets-raw/sprites/units/vela-leg.png new file mode 100644 index 0000000000..80e25079bf Binary files /dev/null and b/core/assets-raw/sprites/units/vela-leg.png differ diff --git a/core/assets-raw/sprites/units/vela-weapon-heat.png b/core/assets-raw/sprites/units/vela-weapon-heat.png new file mode 100644 index 0000000000..68e264c5d3 Binary files /dev/null and b/core/assets-raw/sprites/units/vela-weapon-heat.png differ diff --git a/core/assets-raw/sprites/units/vela.png b/core/assets-raw/sprites/units/vela.png new file mode 100644 index 0000000000..db1fdbb9c7 Binary files /dev/null and b/core/assets-raw/sprites/units/vela.png differ diff --git a/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.png b/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.png index 5b85b778a7..a519b8e8c0 100644 Binary files a/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.png and b/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.png differ diff --git a/core/assets-raw/sprites/units/weapons/omura-cannon-heat.png b/core/assets-raw/sprites/units/weapons/omura-cannon-heat.png new file mode 100644 index 0000000000..c3c0d6378c Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/omura-cannon-heat.png differ diff --git a/core/assets-raw/sprites/units/weapons/omura-cannon.png b/core/assets-raw/sprites/units/weapons/omura-cannon.png new file mode 100644 index 0000000000..e751f29572 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/omura-cannon.png differ diff --git a/core/assets-raw/sprites/units/weapons/sei-launcher.png b/core/assets-raw/sprites/units/weapons/sei-launcher.png new file mode 100644 index 0000000000..0b1e0b1932 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/sei-launcher.png differ diff --git a/core/assets/baseparts/1591385575600.msch b/core/assets/baseparts/1591385575600.msch index a086e7d8a2..597351c682 100644 Binary files a/core/assets/baseparts/1591385575600.msch and b/core/assets/baseparts/1591385575600.msch differ diff --git a/core/assets/baseparts/4125616123544.msch b/core/assets/baseparts/4125616123544.msch new file mode 100644 index 0000000000..7e1ee81811 Binary files /dev/null and b/core/assets/baseparts/4125616123544.msch differ diff --git a/core/assets/baseparts/752942460573057196.msch b/core/assets/baseparts/752942460573057196.msch index 57b5e83b0a..6f81df2b4e 100644 Binary files a/core/assets/baseparts/752942460573057196.msch and b/core/assets/baseparts/752942460573057196.msch differ diff --git a/core/assets/baseparts/752980871690059906.msch b/core/assets/baseparts/752980871690059906.msch new file mode 100644 index 0000000000..360d04733b Binary files /dev/null and b/core/assets/baseparts/752980871690059906.msch differ diff --git a/core/assets/baseparts/752982341865046126.msch b/core/assets/baseparts/752982341865046126.msch new file mode 100644 index 0000000000..360d04733b Binary files /dev/null and b/core/assets/baseparts/752982341865046126.msch differ diff --git a/core/assets/baseparts/752995421667721307.msch b/core/assets/baseparts/752995421667721307.msch new file mode 100644 index 0000000000..bd3313b2c3 Binary files /dev/null and b/core/assets/baseparts/752995421667721307.msch differ diff --git a/core/assets/baseparts/753005578997071974.msch b/core/assets/baseparts/753005578997071974.msch new file mode 100644 index 0000000000..747c61f453 Binary files /dev/null and b/core/assets/baseparts/753005578997071974.msch differ diff --git a/core/assets/baseparts/753035709576642631.msch b/core/assets/baseparts/753035709576642631.msch new file mode 100644 index 0000000000..c1955436b5 Binary files /dev/null and b/core/assets/baseparts/753035709576642631.msch differ diff --git a/core/assets/baseparts/753035713162903572.msch b/core/assets/baseparts/753035713162903572.msch new file mode 100644 index 0000000000..4d262d3fa3 --- /dev/null +++ b/core/assets/baseparts/753035713162903572.msch @@ -0,0 +1,2 @@ +mschx%Q + DguBIz^C-fiMD|̃7#!Y3 KLC,=՘ޱkjP*eƗx=Ed{L<5p \ No newline at end of file diff --git a/core/assets/baseparts/753043453876895784.msch b/core/assets/baseparts/753043453876895784.msch new file mode 100644 index 0000000000..013e2b4e23 Binary files /dev/null and b/core/assets/baseparts/753043453876895784.msch differ diff --git a/core/assets/baseparts/753059583450415175.msch b/core/assets/baseparts/753059583450415175.msch new file mode 100644 index 0000000000..a3ed4cf154 --- /dev/null +++ b/core/assets/baseparts/753059583450415175.msch @@ -0,0 +1,5 @@ +mschx%Ar0E?<5Yy9Yplrت)l\B) O/Cݿ%>C~^bXχ>3>t,xݗ E^' +RDWQU$A>L* )AMHQ+N'E|Qm=;),<<f ~ l (A{i [G8?{ݻ+n)p8ehߞVgy+N\.<oF^8QpF.d2hJT:Q ]˓RZR& d +e \ No newline at end of file diff --git a/core/assets/baseparts/753938078997151744.msch b/core/assets/baseparts/753938078997151744.msch new file mode 100644 index 0000000000..6a666a246c Binary files /dev/null and b/core/assets/baseparts/753938078997151744.msch differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 3db581844c..651576c3de 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -20,7 +20,8 @@ gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]New highscore! copied = Copied. -indevpopup = [accent]v6[] is currently in [accent]pre-alpha[].\n[lightgray]This means:[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work\n- Many units are unfinished\n- The campaign is completely unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- SFX and music are unfinished/missing\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sounds load.map = Maps @@ -54,6 +55,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 +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} @@ -114,6 +116,7 @@ mod.disable = Disable mod.content = Content: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -288,6 +291,8 @@ waiting = [lightgray]Waiting... waiting.players = Waiting for players... wave.enemies = [lightgray]{0} Enemies Remaining wave.enemy = [lightgray]{0} Enemy Remaining +wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. +wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. loadimage = Load Image saveimage = Save Image unknown = Unknown @@ -326,6 +331,7 @@ editor.generation = Generation: editor.ingame = Edit In-Game editor.publish.workshop = Publish On Workshop editor.newmap = New Map +editor.center = Center workshop = Workshop waves.title = Waves waves.remove = Remove @@ -470,16 +476,9 @@ requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} -#TODO fix/remove this -launch = < LAUNCH > launch.text = Launch -launch.title = Launch Successful -launch.next = [lightgray]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. +campaign.multiplayer = While playing multiplayer in campaign, you can only research using items from [accent]your[] sectors, [scarlet]not[] the host's sector that you are on right now.\n\nTo get items to [accent]your[] sectors in multiplayer, use a [accent]launch pad[]. uncover = Uncover configure = Configure Loadout #TODO @@ -487,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} @@ -508,12 +508,19 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: sectors.production = Production: sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) #NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway sector.groundZero.name = Ground Zero @@ -568,6 +575,7 @@ info.title = Info error.title = [scarlet]An error has occured error.crashtitle = An error has occured unit.nobuild = [scarlet]Unit can't build +lastaccessed = [lightgray]Last Accessed: {0} blocks.input = Input blocks.output = Output blocks.booster = Booster @@ -583,6 +591,7 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range blocks.linkrange = Link Range @@ -591,6 +600,7 @@ blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage blocks.itemcapacity = Item Capacity +blocks.memorycapacity = Memory Capacity blocks.basepowergeneration = Base Power Generation blocks.productiontime = Production Time blocks.repairtime = Block Full Repair Time @@ -608,6 +618,8 @@ blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -619,6 +631,7 @@ bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} bar.poweroutput = Power Output: {0} +bar.powerlines = Connections: {0}/{1} bar.items = Items: {0} bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} @@ -630,6 +643,8 @@ bar.progress = Build Progress bar.input = Input bar.output = Output +units.processorcontrol = [lightgray]Processor Controlled + bullet.damage = [stat]{0}[lightgray] damage bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary @@ -650,10 +665,12 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil @@ -781,6 +798,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -812,9 +832,11 @@ mode.custom = Custom Rules rules.infiniteresources = Infinite Resources rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -836,8 +858,13 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.enemyLights = Enemy Lights +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids @@ -863,9 +890,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Speed: {0} unit.weapon = [lightgray]Weapon: {0} @@ -898,36 +927,44 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma unit.scepter.name = Scepter unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag +block.space.name = Space block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -955,13 +992,18 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder 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.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -977,10 +1019,9 @@ 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.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -1016,7 +1057,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -1029,7 +1070,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1048,6 +1089,7 @@ block.power-source.name = Power Infinite block.unloader.name = Unloader block.vault.name = Vault block.wave.name = Wave +block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple @@ -1087,6 +1129,7 @@ block.arc.name = Arc block.rtg-generator.name = RTG Generator block.spectre.name = Spectre block.meltdown.name = Meltdown +block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad @@ -1110,7 +1153,9 @@ block.micro-processor.name = Micro Processor block.logic-processor.name = Logic Processor block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = blue team.crux.name = red @@ -1171,7 +1216,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.cryofluid-mixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. @@ -1223,7 +1268,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.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.\nDoes not leak. 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. @@ -1237,7 +1282,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. 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. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 906aa492cd..f62aba4377 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -20,6 +20,8 @@ gameover = Гульня скончана gameover.pvp = [accent]{0}[] каманда перамагла! highscore = [accent]Новы рэкорд! copied = Скапіявана. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Звукі load.map = Карты @@ -63,8 +65,7 @@ stat.delivered = Рэсурсаў запушчана: stat.playtime = Час гульні:[accent] {0} stat.rank = Фінальны ранг: [accent]{0} -launcheditems = [accent]Запушчаныя прадметы -launchinfo = [unlaunched]Націсніце на кнопку [ЗАПУСК], каб атрымаць прадметы, якія адзначаны сінім колера. +globalitems = [accent]Global Items map.delete = Вы сапраўды хочаце выдаліць карту «[accent]{0}[]»? level.highscore = Рэкорд: [accent]{0} level.select = Выбар карты @@ -114,6 +115,7 @@ mod.disable = Выкл. mod.content = Content: mod.delete.error = Немагчыма выдаліць мадыфікацыю. Магчыма, файл выкарыстоўваецца. mod.requiresversion = [scarlet]Мінімальная патрабаваная версія гульні: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Не знойдзены бацькоўскія мадыфікацыі: {0} mod.erroredcontent = [scarlet]Памылкі змесціва mod.errors = Памылкі былі выкліканыя загружаным змесцівам. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Аб гульні name = Імя: noname = Для пачатку, прыдумайце[accent] сабе iмя[]. +planetmap = Planet Map +launchcore = Launch Core filename = Iмя файла: unlocked = Новы кантэнт адмыкнуты! completed = [accent]Завершаны @@ -144,6 +148,7 @@ techtree = Дрэва\n тэхналогій research.list = [lightgray]Дасьледуйце: research = Даследаваць researched = [lightgray] {0} даследавана. +research.progress = {0}% complete players = Гульцоў: {0} players.single = {0} гулец players.search = search @@ -340,6 +345,11 @@ waves.load = Загрузіць з буфера абмену waves.invalid = Няслушныя хвалі ў буферы абмену. waves.copied = Хвалі скапіяваныя. waves.none = Ворагі не былі вызначаныя. \nЗвярнiце ўвагу, што пустыя хвалі будуць аўтаматычна замененыя звычайнай хваляй. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<Па змаўчанні> details = Падрабязнасці... edit = Рэдагаваць... @@ -459,7 +469,8 @@ locked = Блякаваны complete = [lightgray]Выканаць: requirement.wave = дасягнем {0} хвалі ў зоне {1} requirement.core = Знішчыце варожае ядро ​​ў зоне {0} -requirement.unlock = разблакуюцца {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Аднавіць зону: \n[lightgray] {0} bestwave = [lightgray]Лепшая хваля: {0} launch = <Запуск> @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Забароненыя блокі addall = Дадаць всё +launch.destination = Destination: {0} configure.invalid = Колькасць павінна быць лікам паміж 0 і {0}. zone.unlocked = Зона «[lightgray] {0}» зараз адмыкнутая. zone.requirement.complete = Умовы для зоны «{0}» выкананы: [lightgray] \n {1} @@ -496,6 +508,20 @@ error.io = Сеткавая памылка ўводу-высновы. error.any = Невядомая сеткавая памылка. error.bloom = Не атрымалася ініцыялізаваць свячэнне (Bloom). \nМагчыма, зараз Вашая прылада не падтрымлівае яго. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Графіка settings.cleardata = Ачысціць гульнявыя дадзеныя... settings.clear.confirm = Вы сапраўды хочаце ачысціць свае дадзеныя? \nГэта нельга адмяніць! settings.clearall.confirm = [scarlet] АСЦЯРОЖНА![] \nГэта сатрэ ўсе дадзеныя, уключаючы захавання, карты, прагрэс кампаніі і налады кіравання. \nПосле таго як Вы націснеце [accent] [ОК][], гульня знішчыць усе дадзеныя і аўтаматычна зачыніцца. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent] <Паўза> clear = Ачысціць banned = [scarlet] Забаронена @@ -557,8 +585,11 @@ blocks.itemsmoved = Хуткасць перамяшчэння blocks.launchtime = Інтэрвал запускаў blocks.shootrange = Радыус дзеяння blocks.size = Памер +blocks.displaysize = Display Size blocks.liquidcapacity = Умяшчальнасць вадкасці blocks.powerrange = Далёкасць перадачы энергіі +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Колькасць злучэнняў blocks.poweruse = Спажывае энергіі blocks.powerdamage = Энергія/страты @@ -574,11 +605,14 @@ blocks.boosteffect = паскараўся эфект blocks.maxunits = Максімальная колькасць актыўных адзінак blocks.health = Здароўе blocks.buildtime = Час будаўніцтва +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Кошт будаўніцтва blocks.inaccuracy = Роскід blocks.shots = Стрэлы blocks.reload = Стрэлы/секунду blocks.ammo = Боепрыпасы +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Патрабуецца свідар лепей bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = вадкасных адзінак unit.powerunits = энерг. адзінак unit.degrees = град. unit.seconds = сек. +unit.minutes = mins unit.persecond = /сек +unit.perminute = /min unit.timesspeed = x хуткасць unit.percent = % +unit.shieldhealth = shield health unit.items = прадметаў unit.thousands = Тыс. unit.millions = М. +unit.billions = b category.general = Асноўныя category.power = Энергія category.liquids = Вадкасці @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Атакаваць command.rally = Кропка збору command.retreat = Адступіць +command.idle = Idle placement.blockselectkeys = \n[lightgray]Клавіша: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Рух па восі X keybind.move_y.name = Рух па восі Y keybind.mouse_move.name = наследуе курсорам +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Абраць вобласць keybind.schematic_menu.name = Меню схем @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Дыяганальнае размяшчэнн keybind.pick.name = Абраць блок keybind.break_block.name = Разбурыць блок keybind.deselect.name = Зняць вылучэнне +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Стрэл keybind.zoom.name = Маштабаванне keybind.menu.name = Меню @@ -782,6 +825,7 @@ rules.reactorexplosions = Выбухі рэактараў rules.wavetimer = Інтэрвал хваляў rules.waves = Хвалі rules.attack = Рэжым атакі +rules.buildai = AI Building rules.enemyCheat = Бясконцыя рэсурсы ІІ (чырвоная каманда) rules.blockhealthmultiplier = Множнік здароўя блокаў rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Баёў. адз. rules.title.experimental = эксперыментальнай rules.title.environment = Environment rules.lighting = Асвятленне +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Навакольны свет -rules.solarpowermultiplier = Множнік сонечнай энергіі +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Рэчывы content.liquid.name = Вадкасці @@ -830,9 +878,11 @@ liquid.water.name = Вада liquid.slag.name = Шлак liquid.oil.name = Нафта liquid.cryofluid.name = Крыягенная вадкасць + item.explosiveness = [lightgray]Выбуханебяспека: {0}% item.flammability = [lightgray]Узгаральнасць: {0}% item.radioactivity = [lightgray]Радыёактыўнасць: {0}% + unit.health = [lightgray]Здароўе: {0} unit.speed = [lightgray]Хуткасць: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Камікадзэ unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Скала block.sand-boulder.name = Пяшчаны валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Соль -block.saltrocks.name = Саляныя камяні +block.salt-wall.name = Salt Wall block.pebbles.name = Галька block.tendrils.name = Споравыя вусікі -block.sandrocks.name = Пяшчаныя камяні +block.sand-wall.name = Sand Wall block.spore-pine.name = Спорава хвоя -block.sporerocks.name = Споравыя камяні -block.rock.name = Каменны валун -block.snowrock.name = Заснежаны валун +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Заснежаная хвоя block.shale.name = Сланец block.shale-boulder.name = Сланцавы валун block.moss.name = Мох block.shrubs.name = Кусты block.spore-moss.name = Спорава мох -block.shalerocks.name = Сланцавыя камяні +block.shale-wall.name = Shale Wall block.scrap-wall.name = Сцяна з металалому block.scrap-wall-large.name = Вялікая сцяна з металалому block.scrap-wall-huge.name = Велізарная сцяна з металалому @@ -919,13 +979,17 @@ block.craters.name = Кратэры block.sand-water.name = Пясок з вадой block.darksand-water.name = Тёмный пясок з вадой block.char.name = Выпаленая зямля -block.holostone.name = Галаграфічны камень +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Заснежаны лёд -block.rocks.name = Камяні -block.icerocks.name = Ледзяныя камяні -block.snowrocks.name = Снежныя камяні -block.dunerocks.name = Цёмныя пясчаныя камяні +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Сасна +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Мёртвае белае дрэва block.white-tree.name = Белае дрэва block.spore-cluster.name = Навала спрэчка @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Цёмная панэль 4 block.dark-panel-5.name = Цёмная панэль 5 block.dark-panel-6.name = Цёмная панэль 6 block.dark-metal.name = Цёмны метал -block.ignarock.name = Абпечаны камень +block.basalt.name = Basalt block.hotrock.name = Гарачы камень block.magmarock.name = Магмавы камень -block.cliffs.name = Скалы block.copper-wall.name = Медная сцяна block.copper-wall-large.name = Вялікая медная сцяна block.titanium-wall.name = Тытанавая сцяна @@ -980,7 +1043,7 @@ block.underflow-gate.name = Залішнi шлюз block.silicon-smelter.name = Крэмнявы плавільны завод block.phase-weaver.name = Фазавы ткач block.pulverizer.name = Здрабняльнік -block.cryofluidmixer.name = Мешалка крыягеннай вадкасці +block.cryofluid-mixer.name = Мешалка крыягеннай вадкасці block.melter.name = Плавільня block.incinerator.name = Мусарасжыгатель block.spore-press.name = Споравы прэс @@ -993,7 +1056,7 @@ block.diode.name = Дыёд block.battery.name = Акумулятар block.battery-large.name = Вялікі акумулятар block.combustion-generator.name = Генератар ўнутранага згарання -block.turbine-generator.name = Паравы генератар +block.steam-generator.name = Паравы генератар block.differential-generator.name = Дыферэнцыяльны генератар block.impact-reactor.name = Імпульсны рэактар block.mechanical-drill.name = Механічны бур @@ -1055,6 +1118,7 @@ block.container.name = Кантэйнер block.launch-pad.name = Пускавая пляцоўка block.launch-pad-large.name = Вялікая пускавая пляцоўка block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Сіняя team.crux.name = Чырвоная team.sharded.name = Аскепакавая @@ -1126,7 +1199,7 @@ block.kiln.description = выплавляемым пясок і свінец ў block.plastanium-compressor.description = Вырабляе пластан з нафты ды тытана. block.phase-weaver.description = Сінтэзуе фазавую тканіна з радыеактыўнага торыя і пяску. Патрабуецца вялікая колькасць энергіі для працы. block.alloy-smelter.description = Аб'ядноўвае тытан, свінец, крэмній і медзь для вытворчасці кінэтычнага сплаву. -block.cryofluidmixer.description = змешваюцца ваду і дробны тытанавы парашок у криогеннную вадкасць. Неад'емная частка пры выкарыстання ториевого рэактара +block.cryofluid-mixer.description = змешваюцца ваду і дробны тытанавы парашок у криогеннную вадкасць. Неад'емная частка пры выкарыстання ториевого рэактара block.blast-mixer.description = расціскаюць і змешвае навалы спрэчка з пиротитом для атрымання выбуховага рэчыва. block.pyratite-mixer.description = Змешвае вугаль, свінец і пясок у гаручы піратыт block.melter.description = Плавіць металалом ў шлак для далейшай апрацоўкі або выкарыстання ў турэлях «Хваля». @@ -1192,7 +1265,7 @@ block.battery.description = Назапашвае энергію як буфер block.battery-large.description = Захоўвае значна больш энергіі, чым звычайны акумулятар. block.combustion-generator.description = вырабленай энергіі шляхам спальвання лёгкаўзгаральных матэрыялаў, такіх як вугаль. block.thermal-generator.description = Генеруе энергію, калі знаходзіцца ў гарачых месцах. -block.turbine-generator.description = Удасканалены генератар згарання. Больш эфектыўны, але дадаткова патрабуе ваду для выпрацоўкі пары. +block.steam-generator.description = Удасканалены генератар згарання. Больш эфектыўны, але дадаткова патрабуе ваду для выпрацоўкі пары. block.differential-generator.description = Генеруе вялікая колькасць энергіі. Выкарыстоўвае розніцу тэмператур паміж крыягеннай вадкасцю і падпаленым пиротитом. block.rtg-generator.description = Просты, надзейны генератар. Выкарыстоўвае цяпло распадаюцца радыеактыўных злучэнняў для вытворчасці энергіі з нізкай хуткасцю. block.solar-panel.description = Забяспечвае невялікая колькасць энергіі ад сонца. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 18d6b667e3..e0c66ff624 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -12,7 +12,7 @@ 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.suggestions.description = Navrhni něco nového do hry! +link.suggestions.description = Suggest new features 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 získání snímku obrazovky. @@ -20,6 +20,8 @@ gameover = Konec hry gameover.pvp = Vyhrál tým [accent]{0}[]! highscore = [accent]Nový rekord! copied = Zkopírováno. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = Tato část hry ještě není připravena load.sound = Zvuky load.map = Mapy @@ -63,8 +65,7 @@ stat.delivered = Materiálu vysláno: stat.playtime = Odehraný čas: [accent]{0}[] stat.rank = Celková známka: [accent]{0}[] -launcheditems = [accent]Získané předměty[] -launchinfo = [unlaunched]Je třeba vyslat zpět Tvé jádro, abys získal věci vyznačené modře.[] +globalitems = [accent]Celkové položky[] map.delete = Jsi si jistý, že chceš smazat mapu "[accent]{0}[]"? level.highscore = Nejvyšší skóre: [accent]{0}[] level.select = Výběr úrovně @@ -106,7 +107,7 @@ mods.guide = Průvodce modifikacemi mods.report = Nahlásit závadu mods.openfolder = Otevřít složku s modifikacemi mods.reload = Znovu načíst -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = Hra bude nyní ukončena, aby si znovu načetla modifikace. mod.display = [gray]Modifikace:[][orange] {0}[] mod.enabled = [lightgray]Povoleno[] mod.disabled = [scarlet]Zakázáno[] @@ -114,6 +115,7 @@ mod.disable = Zakázat mod.content = Obsah: 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.outdated = [scarlet]Nekompatibilní s V6 (chybí minGameVersion: 105) 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. @@ -125,7 +127,7 @@ mod.reloadrequired = [scarlet]Je vyžadováno znovuspuštění hry. mod.import = Importovat modifikaci mod.import.file = Importovat soubor mod.import.github = Import modifikace z GitHubu -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]JAR modifikace jsou z podstaty nebezpečné.[]Ujisti se, že je importuješ z důvěryhodného zdroje! 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 = [lightgray]Autor:[] {0} @@ -137,6 +139,8 @@ mod.scripts.disable = Tvoje zařízení nepodporuje skripty. Musíš zakázat ty about.button = O hře name = Jméno: noname = Nejdřív si vyber [accent]jméno ve hře[]. +planetmap = Planetární mapa +launchcore = Vyslat jádro filename = Název souboru: unlocked = Byl odemmknut nový blok! completed = [accent]Dokončeno[] @@ -144,6 +148,7 @@ techtree = Technologie research.list = [lightgray]Výzkum:[] research = Výzkum researched = Dokončen výzkum technologie: [lightgray]{0}[]. +research.progress = {0}% dokončeno players = Hráčů: {0} players.single = Hráč: {0} players.search = hledat @@ -198,8 +203,8 @@ server.admins.none = Žádní správci nebyli nalezeni. server.add = Přidat server server.delete = Jsi si jistý, že chceš smazat tento server? server.edit = Upravit server -server.outdated = [crimson]Zastaralá verze serveru![] -server.outdated.client = [crimson]Zastaralá verze klienta![] +server.outdated = [scarlet]Zastaralá verze serveru![] +server.outdated.client = [scarlet]Zastaralá verze klienta![] server.version = [gray]Verze: {0} {1}[] server.custombuild = [accent]Upravená verze hry[] confirmban = Jsi si jistý, že chceš zakázat hráče "{0}[white]"?[] @@ -221,7 +226,7 @@ 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.[] +server.error = [scarlet]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 @@ -231,8 +236,8 @@ save.delete.confirm = Jsi si jistý, že chceš smazat toto uložení hry? save.delete = Smazat 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.fail = [scarlet]Nepodařilo se importovat uložení hry: [accent]{0}[] +save.export.fail = [scarlet]Nepodařilo se exportovat uložení hry: [accent]{0}[] save.import = Importovat uložení hry save.newslot = Uložit hru: save.rename = Přejmenovat @@ -340,6 +345,11 @@ waves.load = Načíst ze schránky 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í. + +wavemode.counts = počty +wavemode.totals = součty +wavemode.health = zdraví + editor.default = [lightgray][] details = Podrobnosti... edit = Upravit... @@ -379,7 +389,7 @@ editor.exportimage = Exportovat obrázek terénu 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š odejít z editoru? Změny budou ztraceny. +editor.unsaved = Opravdu chceš odejít z editoru?\n[scarlet]Neuložené 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.[] @@ -459,11 +469,12 @@ locked = Zamčeno 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} +requirement.research = Vynalezeno {0} +requirement.capture = Polapeno {0} resume = Zpět do mapy:\n[lightgray]{0}[] bestwave = [lightgray]Nejvyšší vlna: {0} -launch = Vyslat do této mapy Tvé jádro -launch.text = Launch +launch = < VYSLAT > +launch.text = Vyslat 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.[] @@ -471,10 +482,11 @@ launch.confirm = Toto vyšle veškeré suroviny ve Tvém jádře zpět.\nJiž se 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í -loadout = Loadout -resources = Resources +loadout = Načtení +resources = Zdroje bannedblocks = Zakázané bloky addall = Přidat vše +launch.destination = Destination: {0} 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}. @@ -485,7 +497,7 @@ zone.objective.attack = Znič nepřátelské jádro add = Přidat... boss.health = Životy Strážce -connectfail = [crimson]Nepovedlo se připojení k serveru:\n\n[accent]{0}[] +connectfail = [scarlet]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ů. @@ -496,6 +508,20 @@ 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. +weather.rain.name = Déšť +weather.snow.name = Sníh +weather.sandstorm.name = Písečná ouře +weather.sporestorm.name = Spórová bouře + +sectors.unexplored = [lightgray]Neprozkoumáno +sectors.resources = Zdroje: +sectors.production = Výroba: +sectors.stored = Uskladněno: +sectors.resume = Pokračovat +sectors.launch = Vyslat +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Základní tábor sector.craters.name = Krátery sector.frozenForest.name = Zamrzlý les @@ -532,6 +558,8 @@ 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čí. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pozastaveno >[] clear = Vyčistit banned = [scarlet]Zakázán[] @@ -539,7 +567,7 @@ unplaceable.sectorcaptured = [scarlet]Vyžaduje polapený sektor[] yes = Ano no = Ne info.title = Informace -error.title = [crimson]Objevila se chyba[] +error.title = [scarlet]Objevila se chyba[] error.crashtitle = Objevila se chyba unit.nobuild = [scarlet]Jednotka nemůže stavět blocks.input = Vstup @@ -557,8 +585,11 @@ blocks.itemsmoved = Rychlost pohybu blocks.launchtime = Čas mezi vysláním blocks.shootrange = Dostřel blocks.size = Velikost +blocks.displaysize = Velikost zobrazovače blocks.liquidcapacity = Kapacita kapalin blocks.powerrange = Rozsah energie +blocks.linkrange = Dosah napojení +blocks.instructions = Instrukce blocks.powerconnections = Nejvyšší počet spojení blocks.poweruse = Spotřeba energie blocks.powerdamage = Energie na jednotku poškození @@ -574,15 +605,18 @@ blocks.boosteffect = Účinek posílení blocks.maxunits = Nejvýše aktivních jednotek blocks.health = Životy blocks.buildtime = Čas stavby +blocks.maxconsecutive = Nejvýše po sobě blocks.buildcost = Cena stavby blocks.inaccuracy = Nepřesnost blocks.shots = Střely blocks.reload = Střel za 1s blocks.ammo = Střelivo +blocks.shieldhealth = Zdraví štítu +blocks.cooldowntime = Čas na zchladnutí bar.drilltierreq = Je vyžadován lepší vrt -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = Chybějí zdroje +bar.corereq = Je vyžadováno základní jádro bar.drillspeed = Rychlost vrtu: {0}/s bar.pumpspeed = Rychlost pumpy: {0}/s bar.efficiency = Účinnost: {0}% @@ -593,7 +627,7 @@ bar.poweroutput = Výstup energie: {0} bar.items = Předměty: {0} bar.capacity = Kapacita: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[jednotka je vypnuta] bar.liquid = Chlazení bar.heat = Teplo bar.power = Energie @@ -621,12 +655,16 @@ unit.liquidunits = jednotek kapalin unit.powerunits = jednotek energie unit.degrees = úhly unit.seconds = sekundy +unit.minutes = minuty unit.persecond = /s +unit.perminute = /min unit.timesspeed = x větší rychlost unit.percent = % +unit.shieldhealth = zdraví štítu unit.items = předměty -unit.thousands = t -unit.millions = m +unit.thousands = tis +unit.millions = mio +unit.billions = mld category.general = Všeobecné category.power = Energie category.liquids = Kapaliny @@ -679,7 +717,7 @@ setting.blockselectkeys.name = Ukázat klávesy při práci s blokem setting.vsync.name = Vertikální synchronizace setting.pixelate.name = Rozpixlovat setting.minimap.name = Ukázat mapičku -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = Ukázat položky jádra (WIP) setting.position.name = Ukázat pozici hráče setting.musicvol.name = Hlasitost hudby setting.atmosphere.name = Ukázat atmosféru planety @@ -705,10 +743,11 @@ keybinds.mobile = [scarlet]Většina kláves nefunguje v mobilní verzi hry. Je category.general.name = Všeobecné category.view.name = Pohled category.multiplayer.name = Hra více hráčů -category.blocks.name = Block Select +category.blocks.name = Výběr bloků command.attack = Útok command.rally = Shromáždění command.retreat = Ústup +command.idle = Nečinný placement.blockselectkeys = \n[lightgray]Klávesa:[] [{0}, keybind.respawn.name = Znovuzrození keybind.control.name = Ovládací jednotka @@ -721,7 +760,8 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Pohyb vodorovně keybind.move_y.name = Pohyb svisle keybind.mouse_move.name = Následovat myš -keybind.boost.name = Boost +keybind.pan.name = Následovat kameru +keybind.boost.name = Posílení keybind.schematic_select.name = Vybrat oblast keybind.schematic_menu.name = Nabídka šablon keybind.schematic_flip_x.name = Překlopit šablona podle svislé osy @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Umisťovat úhlopříčně keybind.pick.name = Vybrat blok keybind.break_block.name = Rozbít blok keybind.deselect.name = Odznačit +keybind.pickupCargo.name = Vyzvednout náklad +keybind.dropCargo.name = Položit náklad +keybind.command.name = Velet keybind.shoot.name = Střílet keybind.zoom.name = Přiblížení keybind.menu.name = Hlavní nabídka @@ -782,6 +825,7 @@ rules.reactorexplosions = Výbuch reaktoru rules.wavetimer = Časovač vln rules.waves = Vlny rules.attack = Režim útoku +rules.buildai = Umělá inteligence staví rules.enemyCheat = Neomezeně surovin pro umělou inteligenci rules.blockhealthmultiplier = Násobek zdraví bloků rules.blockdamagemultiplier = Násobek poškození bloků @@ -803,8 +847,12 @@ rules.title.unit = Jednotky rules.title.experimental = Experimentální rules.title.environment = Environmentální rules.lighting = Světlo +rules.fire = Výstřel +rules.explosions = Výbušné poškození bloku/jednotky rules.ambientlight = Světlo prostředí -rules.solarpowermultiplier = Násobek sluneční energie +rules.weather = Počasí +rules.weather.frequency = Četnost: +rules.weather.duration = Trvání: content.item.name = Předměty content.liquid.name = Kapaliny @@ -830,9 +878,11 @@ liquid.water.name = Voda liquid.slag.name = Roztavený kov liquid.oil.name = Nafta liquid.cryofluid.name = Chladící kapalina + item.explosiveness = [lightgray]Výbušnost: {0}%[] item.flammability = [lightgray]Zápalnost: {0}%[] item.radioactivity = [lightgray]Radioaktivita: {0}%[] + unit.health = [lightgray]Životy: {0}[] unit.speed = [lightgray]Rychlost: {0}[] unit.weapon = [lightgray]Zbraň: {0} @@ -846,52 +896,62 @@ liquid.heatcapacity = [lightgray]Teplotní kapacita: {0}[] liquid.viscosity = [lightgray]Viskozita: {0}[] liquid.temperature = [lightgray]Teplota: {0}[] -unit.dagger.name = Mech Dýka -unit.mace.name = Mace -unit.fortress.name = Mech Pevnost +unit.dagger.name = Dýka +unit.mace.name = Palcát +unit.fortress.name = Pevnost unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = Mech Slídil +unit.pulsar.name = Pulzar +unit.quasar.name = Kvasar +unit.crawler.name = Slídil unit.atrax.name = Atrax -unit.spiroct.name = Spiroct +unit.spiroct.name = Spirokt unit.arkyid.name = Arkyid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith +unit.toxopid.name = Toxopid +unit.flare.name = Záře +unit.horizon.name = Horizont +unit.zenith.name = Zenit unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse +unit.eclipse.name = Zatmění unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde -unit.alpha.name = Alpha +unit.sei.name = Sei +unit.omura.name = Omura +unit.alpha.name = Alfa unit.beta.name = Beta -unit.gamma.name = Gamma +unit.gamma.name = Gama +unit.scepter.name = Žezlo +unit.reign.name = Panovník +unit.vela.name = Vela +unit.corvus.name = Corvus -block.parallax.name = Parallax -block.cliff.name = Cliff +block.resupply-point.name = Zásobovací místo +block.parallax.name = Paralaxa +block.cliff.name = Útes block.sand-boulder.name = Pískovec block.grass.name = Tráva block.slag.name = Slag block.salt.name = Sůl -block.saltrocks.name = Solný kámen +block.salt-wall.name = Solné skály block.pebbles.name = Oblázky block.tendrils.name = Úponky -block.sandrocks.name = Písečný kámen +block.sand-wall.name = Písečné skály 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.spore-wall.name = Spórové skály +block.boulder.name = Kámen +block.snow-boulder.name = Sněhový kámen 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 = Křoví block.spore-moss.name = Spórový mech -block.shalerocks.name = Břidlicové kamení +block.shale-wall.name = Břidlicové skály block.scrap-wall.name = Rozpadlá zeď block.scrap-wall-large.name = Velká rozpadlá zeď block.scrap-wall-huge.name = Obří rozpadlá zeď @@ -918,14 +978,18 @@ block.snow.name = Sníh block.craters.name = Krátery block.sand-water.name = Voda s pískem block.darksand-water.name = Voda s černým pískem -block.char.name = Char -block.holostone.name = Blok kamene +block.char.name = Dřevěné uhlí +block.dacite.name = Dacit +block.dacite-wall.name = Stěna dacitu block.ice-snow.name = Zasněžený led -block.rocks.name = Skály -block.icerocks.name = Ledové skály -block.snowrocks.name = Sněhové skály -block.dunerocks.name = Písečné duny +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ledové skály +block.snow-wall.name = Sněhové skály +block.dune-wall.name = Písečné duny block.pine.name = Borovice +block.dirt.name = Hlína +block.dirt-wall.name = Kopec hlíny +block.mud.name = Bláto block.white-tree-dead.name = Bílá souška block.white-tree.name = Bílý strom block.spore-cluster.name = Shluk spór @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Tmavá deska 4 block.dark-panel-5.name = Tmavá deska 5 block.dark-panel-6.name = Tmavá deska 6 block.dark-metal.name = Tmavý kov -block.ignarock.name = Třaskavec +block.basalt.name = Čedič block.hotrock.name = Horký kámen 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 = Titanová zeď @@ -980,7 +1043,7 @@ block.underflow-gate.name = Brána s podtokem block.silicon-smelter.name = Křemíková huť block.phase-weaver.name = Tkalcovna pro fázovou tkaninu block.pulverizer.name = Rozmělňovač -block.cryofluidmixer.name = Míchačka na chladící kapalinu +block.cryofluid-mixer.name = Míchačka na chladící kapalinu block.melter.name = Tavírna block.incinerator.name = Spalovna block.spore-press.name = Lis na spóry @@ -993,7 +1056,7 @@ block.diode.name = Bateriová dioda block.battery.name = Baterie block.battery-large.name = Velká baterie block.combustion-generator.name = Spalovací generátor -block.turbine-generator.name = Turbínový generátor +block.steam-generator.name = Turbínový generátor block.differential-generator.name = Rozdílový Generator block.impact-reactor.name = Rázový reaktor block.mechanical-drill.name = Mechanický vrt @@ -1055,18 +1118,28 @@ block.container.name = Kontejnér block.launch-pad.name = Vysílací plošina block.launch-pad-large.name = Velká vysílací plošina block.segment.name = Úsek +block.command-center.name = Velín block.ground-factory.name = Pozemní továrna block.air-factory.name = Letecká továrna block.naval-factory.name = Námořní továrna block.additive-reconstructor.name = Přídavný přestavbovač block.multiplicative-reconstructor.name = Násobný přestavbovač block.exponential-reconstructor.name = Exponenciální přestavbovač -block.tetrative-reconstructor.name = Umocňující přestavbovač -block.payload-conveyor.name = Hromadný dopravník +block.tetrative-reconstructor.name = Mocninný přestavbovač +block.payload-conveyor.name = Dopravník nákladu block.payload-router.name = Směřovač nákladu block.disassembler.name = Rozebírač -block.silicon-crucible.name = Křemíková nádoba -block.large-overdrive-projector.name = Velký urychlující projektor +block.silicon-crucible.name = Tavicí tyglík pro křemík +block.overdrive-dome.name = Velká urychlující kupole + +block.switch.name = Přepínač +block.micro-processor.name = Mikroprocesor +block.logic-processor.name = Logický procesor +block.hyper-processor.name = Hyperprocesor +block.logic-display.name = Zobrazovač logiky +block.large-logic-display.name = Velký zobrazovač logiky +block.memory-cell.name = Paměťová buňka + team.blue.name = modrý team.crux.name = červený team.sharded.name = oranžový @@ -1126,7 +1199,7 @@ block.kiln.description = Taví písek a olovo na směs známou jako metasklo. Vy block.plastanium-compressor.description = Produkuje plastanu z titanu a nafty. block.phase-weaver.description = Produkuje fázovou tkaninu z radioaktivního thoria a písku. Spotřebuje k tomu výrazné množství energie. block.alloy-smelter.description = Produkuje rázovou slitinu z titanu, olova, křemíku a mědi. -block.cryofluidmixer.description = Míchá vodu a jemný titanová prášek do chladící kapaliny, nezbytné například pro thoriový reaktor. +block.cryofluid-mixer.description = Míchá vodu a jemný titanová prášek do chladící kapaliny, nezbytné například pro thoriový reaktor. block.blast-mixer.description = Drtí a míchá shluky spór s pyratitem, čímž vzniká výbušnina. block.pyratite-mixer.description = Míchá uhlí, olovo a písek do vysoce hořlavého pyratitu. block.melter.description = Taví šrot do roztaveného kovu pro další zpracování, nebo pro munici do střílny Vlna. @@ -1162,7 +1235,7 @@ block.force-projector.description = Vytvoří okolo sebe šestihrané silové po block.shock-mine.description = Působí poškození nepřátelským jednotkám při sešlápnutí. Takřka neviditelné pro nepřátele (a i v nabídce bloků :) ). block.conveyor.description = Základní blok pro přepravu předmětů. Unáší předměty kupředu a automaticky plní vhodná úložiště (budovy, kontejnery, jádro), které po cestě potká. Lze jej otáčet dle potřeby. block.titanium-conveyor.description = Pokročilý blok pro přepravu předmětů. Přenáší předměty rychleji, než základní dopravník. -block.plastanium-conveyor.description = Přesouvá položky v dávkích.\nPřijímá položky zezadu, a vykládá je do tří směrů vepředu. +block.plastanium-conveyor.description = Přesouvá položky v dávkích.\nPřijímá položky zezadu, a vykládá je do tří směrů vepředu.\nPro špičkový průchod vyžaduje několik nakládacích a vykládacích míst. 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ály přes jedno pole. block.bridge-conveyor.description = Pokročilý blok pro přepravu předmětů. Dovoluje transport předmětů až přes tři pole, a to přes jakýkoliv terén nebo budovu. block.phase-conveyor.description = Pokročilý blok pro přepravu předmětů. Využívá energii k teleportaci předmětů na vzdálenost několika dlaždic mezi jiným propojeným fázovým dopravníkem. @@ -1192,7 +1265,7 @@ block.battery.description = Ukládá energii v případě nadbytku v síti a pos block.battery-large.description = Ukládá více energie, než základní baterie. block.combustion-generator.description = Generuje energii spalováním hořlaných materiálů, jako je například uhlí. block.thermal-generator.description = Pokud je umístěn na teplotně aktivní místo (jako je magmatický kámen), dokáže z tepla generovat energii. -block.turbine-generator.description = Pokročilý spalovací generátor. Efektivnější, ale vyžaduje dodatečný přísun vody pro produkci páry. +block.steam-generator.description = Pokročilý spalovací generátor. Efektivnější, ale vyžaduje dodatečný přísun vody pro produkci páry. 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 = Radioizotopní termoenergetický generátor (RTG) je jednoduchý, spolehlivý generátor. Využívá tepla z rozpadu radioaktivních složek ke generování menších dávek energie. block.solar-panel.description = Základní solární panel pro generování malého množství energie ze Slunce. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index f448bcafaf..0e9d2ce889 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -20,6 +20,8 @@ gameover = Game Over gameover.pvp = [accent] {0}[] hold har vundet! highscore = [accent]Ny highscore! copied = kopieret. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Lyd load.map = Bane @@ -63,8 +65,7 @@ stat.delivered = Ressourcer afsendt: stat.playtime = Spilletid:[accent] {0} stat.rank = Endelig Rang: [accent]{0} -launcheditems = [accent]Afsendte genstande -launchinfo = [unlaunched][[LAUNCH] din kerne for at modtage genstandene vist i blå. +globalitems = [accent]Global Items map.delete = Er du sikker på at du vil slette banen"[accent]{0}[]"? level.highscore = High Score: [accent]{0} level.select = Vælg bane @@ -114,6 +115,7 @@ mod.disable = Deaktiver mod.content = Content: mod.delete.error = Kan ikke slette mod. Filer er muligvis i brug. mod.requiresversion = [scarlet]Behøver minimal spil version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Mangler afhængigheder: {0} mod.erroredcontent = [scarlet]Indholds fejl mod.errors = Fejl ved afhentning af indhold. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Om name = Navn: noname = Vælg et[accent] spiller navn[] først. +planetmap = Planet Map +launchcore = Launch Core filename = Fil navn: unlocked = Nyt indhold tilgængeligt! completed = [accent]Færdiggjort @@ -144,6 +148,7 @@ techtree = Teknologi træ research.list = [lightgray]Forskning: research = Udforsk researched = [lightgray]{0} Udforsket. +research.progress = {0}% complete players = {0} spillere players.single = {0} spiller players.search = search @@ -340,6 +345,11 @@ 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. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Edit... @@ -459,7 +469,8 @@ locked = Locked complete = [lightgray]Complete: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} launch = < LAUNCH > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ 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.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil +unit.billions = b category.general = General category.power = Power category.liquids = Liquids @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move X keybind.move_y.name = Move Y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids @@ -830,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Speed: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall 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.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ 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.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1126,7 +1199,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.cryofluid-mixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. @@ -1192,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. 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. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 881ffe40be..67311e3451 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -20,6 +20,8 @@ gameover = Der Kern wurde zerstört. gameover.pvp = Das[accent] {0}[] Team ist siegreich! highscore = [accent]Neuer Highscore! copied = Kopiert. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Audio load.map = Karten @@ -63,8 +65,7 @@ stat.delivered = Übertragene Ressourcen: stat.playtime = Time Played:[accent] {0} stat.rank = Finaler Rang:[accent] {0} -launcheditems = [accent]Abgefeuerte Items -launchinfo = [unlaunched][[LAUNCH] deine Basis um blau markierte Items zu erhalten. +globalitems = [accent]Global Items map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? level.highscore = Highscore: [accent]{0} level.select = Level-Auswahl @@ -114,6 +115,7 @@ mod.disable = Deaktivieren mod.content = Content: mod.delete.error = Unfähig Mod zu löschen. Datei könnte in Benutzung sein. mod.requiresversion = [scarlet]Benötigt mindestens Version:[accent] {0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Fehlende Abhängigkeiten: {0} mod.erroredcontent = [scarlet]Inhalt-Fehler mod.errors = Beim Laden von Inhalt sind Fehler aufgetreten. @@ -137,6 +139,8 @@ mod.scripts.disable = Ihr Gerät unterstüzt keine Mods mit Scripts. Du musst di about.button = Info name = Name: noname = Wähle zunächst einen[accent] Spielernamen[]. +planetmap = Planet Map +launchcore = Launch Core filename = Dateiname: unlocked = Neuer Inhalt freigeschaltet! completed = [accent]Abgeschlossen @@ -144,6 +148,7 @@ techtree = Forschung research.list = [lightgray]Forschung: research = Erforschen researched = [lightgray]{0} erforscht. +research.progress = {0}% complete players = {0} Spieler online players.single = {0} Spieler online players.search = search @@ -340,6 +345,11 @@ waves.load = Aus der Zwischenablage laden waves.invalid = Ungültige Wellen in der Zwischenablage. waves.copied = Wellen kopiert. waves.none = Keine Gegner definiert.\nInfo: Leere Wellenentwürfe werden automatisch mit dem Standard-Entwurf ersetzt. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details edit = Bearbeiten @@ -459,7 +469,8 @@ locked = Gesperrt complete = [lightgray]Abschließen: requirement.wave = Erreiche Welle {0} in {1} requirement.core = Zerstöre den feindlichen Kern in {0} -requirement.unlock = Schalte {0} frei +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Zu Zone zurückkehren:\n[lightgray]{0} bestwave = [lightgray]Beste Welle: {0} launch = Starten @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Gesperrte Blöcke addall = Alle hinzufügen +launch.destination = Destination: {0} configure.invalid = Anzahl muss eine Zahl zwischen 0 und {0} sein. zone.unlocked = [lightgray]{0} freigeschaltet. zone.requirement.complete = Welle {0} erreicht:\n{1} Anforderungen der Zone erfüllt. @@ -496,6 +508,20 @@ error.io = Netzwerk-I/O-Fehler. error.any = Unbekannter Netzwerkfehler. error.bloom = Bloom konnte nicht initialisiert werden.\nEs kann sein, dass dein Gerät es nicht unterstützt. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafik settings.cleardata = Spieldaten zurücksetzen... settings.clear.confirm = Bist du sicher, dass du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgängig gemacht werden! settings.clearall.confirm = [scarlet]WARNUNG![]\nDas wird jegliche Spieldaten zurücksetzen, inklusive Speicherstände, Karten, Freischaltungen und Tastenbelegungen.\n Sobald du 'OK' drückst, wird alles zurückgesetzt und das Spiel schließt sich automatisch. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pausiert > clear = Leeren banned = [scarlet]Verbannt @@ -557,8 +585,11 @@ blocks.itemsmoved = Bewegungsgeschwindigkeit blocks.launchtime = Zeit zwischen Starts blocks.shootrange = Reichweite blocks.size = Größe +blocks.displaysize = Display Size blocks.liquidcapacity = Flüssigkeitskapazität blocks.powerrange = Stromreichweite +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maximale Stromverbindungen blocks.poweruse = Stromverbrauch blocks.powerdamage = Stromverbrauch/Schadenspunkt @@ -574,11 +605,14 @@ blocks.boosteffect = Verstärkungseffekt blocks.maxunits = Max. aktive Einheiten blocks.health = Lebenspunkte blocks.buildtime = Baudauer +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Baukosten blocks.inaccuracy = Ungenauigkeit blocks.shots = Schüsse blocks.reload = Schüsse/Sekunde blocks.ammo = Munition +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Besserer Bohrer Benötigt bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = Flüssigkeitseinheiten unit.powerunits = Stromeinheiten unit.degrees = Grad unit.seconds = Sekunden +unit.minutes = mins unit.persecond = /sek +unit.perminute = /min unit.timesspeed = x Geschwindigkeit unit.percent = % +unit.shieldhealth = shield health unit.items = Materialeinheiten unit.thousands = k unit.millions = mil +unit.billions = b category.general = Allgemeines category.power = Strom category.liquids = Flüssigkeiten @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Angreifen command.rally = Patrouillieren command.retreat = Rückzug +command.idle = Idle placement.blockselectkeys = \n[lightgray]Taste: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = X-Achse keybind.move_y.name = Y-Achse keybind.mouse_move.name = Der Maus folgen +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Bereich auswählen keybind.schematic_menu.name = Entwurfsmenü @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal platzieren keybind.pick.name = Block auswählen keybind.break_block.name = Block zerstören keybind.deselect.name = Auswahl aufheben +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Schießen keybind.zoom.name = Zoomen keybind.menu.name = Menü @@ -782,6 +825,7 @@ rules.reactorexplosions = Reaktor-Explosionen rules.wavetimer = Wellen-Timer rules.waves = Wellen rules.attack = Angriff-Modus +rules.buildai = AI Building rules.enemyCheat = Unbegrenzte Ressourcen für die KI (Rotes Team) rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Einheiten rules.title.experimental = Experimentell rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Materialien content.liquid.name = Flüssigkeiten @@ -830,9 +878,11 @@ liquid.water.name = Wasser liquid.slag.name = Schlacke liquid.oil.name = Öl liquid.cryofluid.name = Kryoflüssigkeit + item.explosiveness = [lightgray]Explosivität: {0} item.flammability = [lightgray]Entflammbarkeit: {0} item.radioactivity = [lightgray]Radioaktivität: {0} + unit.health = [lightgray]Lebenskraft: {0} unit.speed = [lightgray]Geschwindigkeit: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sandbrocken block.grass.name = Gras block.slag.name = Slag block.salt.name = Salz -block.saltrocks.name = Salzgestein +block.salt-wall.name = Salt Wall block.pebbles.name = Geröll block.tendrils.name = Ranken -block.sandrocks.name = Sandstein +block.sand-wall.name = Sand Wall block.spore-pine.name = Sporenkiefer -block.sporerocks.name = Sporengestein -block.rock.name = Gestein -block.snowrock.name = Schnee-Gestein +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Schnee-Kiefer block.shale.name = Schiefer block.shale-boulder.name = Schiefergeröll block.moss.name = Moos block.shrubs.name = Gestrüpp block.spore-moss.name = Moossporen -block.shalerocks.name = Schiefer-Gestein +block.shale-wall.name = Shale Wall block.scrap-wall.name = Schrottmauer block.scrap-wall-large.name = Große Schrottmauer block.scrap-wall-huge.name = Riesige Schrottmauer @@ -919,13 +979,17 @@ block.craters.name = Krater block.sand-water.name = Sandiges Wasser block.darksand-water.name = Dunkles sandiges Wasser block.char.name = Holzkohle -block.holostone.name = Holo-Stein +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Eisschnee -block.rocks.name = Felsen -block.icerocks.name = Eis-Felsen -block.snowrocks.name = Schnee-Felsen -block.dunerocks.name = Dünen-Felsen +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Kiefer +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Weißer Baum (tot) block.white-tree.name = Weißer Baum block.spore-cluster.name = Sporen-Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Dunkles Panel 4 block.dark-panel-5.name = Dunkles Panel 5 block.dark-panel-6.name = Dunkles Panel 6 block.dark-metal.name = Dunkles Metall -block.ignarock.name = Igna-Felsen +block.basalt.name = Basalt block.hotrock.name = Heißer Felsen block.magmarock.name = Magma-Felsen -block.cliffs.name = Klippen block.copper-wall.name = Kupfermauer block.copper-wall-large.name = Große Kupfermauer block.titanium-wall.name = Titanmauer @@ -980,7 +1043,7 @@ block.underflow-gate.name = Unterlauftor block.silicon-smelter.name = Silizium-Schmelzer block.phase-weaver.name = Phasenweber block.pulverizer.name = Pulverisierer -block.cryofluidmixer.name = Kryoflüssigkeitsmixer +block.cryofluid-mixer.name = Kryoflüssigkeitsmixer block.melter.name = Schmelzer block.incinerator.name = Verbrennungsanlage block.spore-press.name = Sporenpresse @@ -993,7 +1056,7 @@ block.diode.name = Batterie-Diode block.battery.name = Batterie block.battery-large.name = Große Batterie block.combustion-generator.name = Verbrennungsgenerator -block.turbine-generator.name = Turbinengenerator +block.steam-generator.name = Turbinengenerator block.differential-generator.name = Differentialgenerator block.impact-reactor.name = Schlaggenerator block.mechanical-drill.name = Mechanischer Bohrer @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launchpad block.launch-pad-large.name = Großes Launchpad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Blau team.crux.name = Rot team.sharded.name = Orange @@ -1126,7 +1199,7 @@ block.kiln.description = Schmelzt Sand und Blei zu Metaglass. Erfordert kleine M block.plastanium-compressor.description = Produziert Plastanium aus Öl und Titan. block.phase-weaver.description = Produziert Phasengewebe aus radioaktivem Thorium und großen Mengen an Sand. block.alloy-smelter.description = Verarbeitet Titan, Blei, Silizium und Kupfer zu einer Stromstoßlegierung. -block.cryofluidmixer.description = Verarbeitet Wasser mit Titan zu einer Kryoflüssigkeit, die viel effizienter kühlt. +block.cryofluid-mixer.description = Verarbeitet Wasser mit Titan zu einer Kryoflüssigkeit, die viel effizienter kühlt. block.blast-mixer.description = Verwendet Sporen, um Pyratit in eine weniger enzündliche aber explosive Mischung umzuwandeln. block.pyratite-mixer.description = Vermischt Kohle, Blei und Sand zu hochentzündlichem Pyratit. block.melter.description = Erhitzt Schrott auf extrem hohe Temperaturen, um Lava zu erhalten. @@ -1192,7 +1265,7 @@ block.battery.description = Speichert Strom, solange ein Überschuss besteht, un 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. block.thermal-generator.description = Erzeugt große Mengen Strom aus Lava. -block.turbine-generator.description = Effizienter als ein Verbrennungsgenerator, benötigt jedoch zusätzlich Wasser. +block.steam-generator.description = Effizienter als ein Verbrennungsgenerator, benötigt jedoch zusätzlich Wasser. block.differential-generator.description = Erzeugt große Mengen an Energie. Nutzt den Temperaturunterschied zwischen Kryofluid und brennendem Pyratit. block.rtg-generator.description = Ein Radioisotopengenerator, der keine Kühlung benötigt, aber weniger Strom als ein Thorium-Reaktor liefert. block.solar-panel.description = Erzeugt kleine Mengen an Strom aus Sonnenenergie. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 9fad522899..8c538a6974 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -20,6 +20,8 @@ gameover = Tu núcleo ha sido destruido. gameover.pvp = ¡El equipo[accent] {0}[] ha ganado! highscore = [accent]¡Nueva mejor puntuación! copied = Copiado. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sonidos load.map = Mapas @@ -63,8 +65,7 @@ stat.delivered = Recursos Lanzados: stat.playtime = Tiempo jugado:[accent] {0} stat.rank = Rango final: [accent]{0} -launcheditems = [accent]Recursos Lanzados -launchinfo = [unlaunched][[LAUNCH] tu núcleo core obtenga los objetos indicados en azul. +globalitems = [accent]Global Items map.delete = ¿Estás seguro que quieres borrar el mapa "[accent]{0}[]"? level.highscore = Puntuación más alta: [accent]{0} level.select = Selección de nivel @@ -114,6 +115,7 @@ mod.disable = Desactivar mod.content = Content: 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.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dependencias faltantes: {0} mod.erroredcontent = [scarlet]Errores de contenido mod.errors = Ocurrieron fallos al cargar el contenido. @@ -137,6 +139,8 @@ mod.scripts.disable = Tu dispositivo no soporta los mods con scripts. Debes desh about.button = Acerca de name = Nombre: noname = Elige un[accent] nombre de jugador[] primero. +planetmap = Planet Map +launchcore = Launch Core filename = Nombre del archivo: unlocked = ¡Nuevo Bloque Desbloqueado! completed = [accent]Completado @@ -144,6 +148,7 @@ techtree = Árbol de Tecnologías research.list = [lightgray]investigación: research = Investigación researched = [lightgray]{0} investigado. +research.progress = {0}% complete players = {0} jugadores online players.single = {0} jugador online players.search = buscar @@ -340,6 +345,11 @@ waves.load = Cargar del Portapapeles waves.invalid = Oleadas inválidaas en el portapapeles. waves.copied = Oleadas copiadas. waves.none = No hay enemigos definidos.\nNótese que las listas de oleadas vacías se sustituirán por la lista por defecto. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detalles... edit = Editar... @@ -459,7 +469,8 @@ locked = Bloqueado complete = [lightgray]Completado: requirement.wave = Alcanzar la oleada {0} en {1} requirement.core = Destruir el núcleo enemigo en {0} -requirement.unlock = Desbloquear {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Continuar Zona:\n[lightgray]{0} bestwave = [lightgray]Récord: {0} launch = Lanzar @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Bloques prohibidos addall = Añadir todo +launch.destination = Destination: {0} configure.invalid = La cantidad debe estar entre 0 y {0}. zone.unlocked = [lightgray]{0} desbloqueado. zone.requirement.complete = Oleada {0} alcanzada:\nrequerimientos de la zona {1} cumplidos. @@ -496,6 +508,20 @@ error.io = Error I/O de conexión. error.any = Error de red desconocido. error.bloom = Error al cargar el bloom.\nPuede que tu dispositivo no soporte esta característica. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ 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.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. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent] < Pausado > clear = Limpiar banned = [scarlet]Baneado @@ -557,8 +585,11 @@ blocks.itemsmoved = Velocidad de movimiento blocks.launchtime = Tiempo entre lanzamientos blocks.shootrange = Rango de Disparo blocks.size = Tamaño +blocks.displaysize = Display Size blocks.liquidcapacity = Capacidad de Líquidos blocks.powerrange = Rango de Energía +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Conexiones maximas blocks.poweruse = Consumo de Energía blocks.powerdamage = Energía/Daño @@ -574,11 +605,14 @@ blocks.boosteffect = Efecto del Potenciador blocks.maxunits = Máximo de Unidades Activas blocks.health = Vida blocks.buildtime = Tiempo de construcción +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Coste de construcción blocks.inaccuracy = Imprecisión blocks.shots = Disparos blocks.reload = Recarga blocks.ammo = Munición +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Se requiere un mejor taladro. bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = unidades de líquido unit.powerunits = unidades de energía unit.degrees = grados unit.seconds = segundos +unit.minutes = mins unit.persecond = /seg +unit.perminute = /min unit.timesspeed = x velocidad unit.percent = % +unit.shieldhealth = shield health unit.items = objetos unit.thousands = k unit.millions = M +unit.billions = b category.general = General category.power = Energía category.liquids = Líquidos @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Atacar command.rally = Patrullar command.retreat = Retirarse +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Mover x keybind.move_y.name = Mover y keybind.mouse_move.name = Seguír al ratón +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Seleccionar región keybind.schematic_menu.name = Menu de esquématicos @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Construcción Diagonal keybind.pick.name = Elegir bloque keybind.break_block.name = Destruir Bloque keybind.deselect.name = Deseleccionar +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Disparar keybind.zoom.name = Zoom keybind.menu.name = Menú @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Temportzador de Oleadas rules.waves = Oleadas rules.attack = Modo de Ataque +rules.buildai = AI Building rules.enemyCheat = Recursos infinitos de la IA rules.blockhealthmultiplier = Multiplicador de salud de bloque rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unidades rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Iluminación +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Iluminación ambiental -rules.solarpowermultiplier = Multiplicador de Potencia de Panel Solar +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Objetos content.liquid.name = Líquidos @@ -830,9 +878,11 @@ liquid.water.name = Agua liquid.slag.name = Fundido liquid.oil.name = Petróleo liquid.cryofluid.name = Criogénico + item.explosiveness = [lightgray]Explosividad: {0} item.flammability = [lightgray]Inflamabilidad: {0} item.radioactivity = [lightgray]Radioactividad: {0} + unit.health = [lightgray]Vida: {0} unit.speed = [lightgray]Velocidad: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Oruga unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Piedra de Arena block.grass.name = Hierba block.slag.name = Slag block.salt.name = Sal -block.saltrocks.name = Rocas de Sal +block.salt-wall.name = Salt Wall block.pebbles.name = Guijarros block.tendrils.name = Zarcillos -block.sandrocks.name = Rocas de arena +block.sand-wall.name = Sand Wall block.spore-pine.name = Pino de esporas -block.sporerocks.name = Rocas de espora -block.rock.name = Roca -block.snowrock.name = Roca de nieve +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pino de nieve block.shale.name = Pizarra block.shale-boulder.name = Piedra de Pizarra block.moss.name = Musgo block.shrubs.name = Arbustos block.spore-moss.name = Musgo de esporas -block.shalerocks.name = Rocas de Pizarra +block.shale-wall.name = Shale Wall 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 @@ -919,13 +979,17 @@ block.craters.name = Cráteres block.sand-water.name = Agua con Arena block.darksand-water.name = Agua con Arena Oscura block.char.name = Carbonizado -block.holostone.name = Piedra hologramatica +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Hielo Nieve -block.rocks.name = Rocas -block.icerocks.name = Rocas de hielo -block.snowrocks.name = Rocas de nieve -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pino +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Árbol Blanco Muerto block.white-tree.name = Árbol Blanco block.spore-cluster.name = Concentración de Esporas @@ -941,10 +1005,9 @@ 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 Ignea +block.basalt.name = Basalt block.hotrock.name = Roca Caliente block.magmarock.name = Roca de Magma -block.cliffs.name = Acantilados block.copper-wall.name = Muro de Cobre block.copper-wall-large.name = Muro de Cobre grande block.titanium-wall.name = Muro de Titanio @@ -980,7 +1043,7 @@ block.underflow-gate.name = Compuerta de Subdesbordamiento block.silicon-smelter.name = Horno para Silicio block.phase-weaver.name = Tejedor de Fase block.pulverizer.name = Pulverizador -block.cryofluidmixer.name = Mezclador de Criogénicos +block.cryofluid-mixer.name = Mezclador de Criogénicos block.melter.name = Fundidor block.incinerator.name = Incinerador block.spore-press.name = Prensa de Esporas @@ -993,7 +1056,7 @@ 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 -block.turbine-generator.name = Turbina +block.steam-generator.name = Turbina block.differential-generator.name = Generador Diferencial block.impact-reactor.name = Reactor de Impacto block.mechanical-drill.name = Taladro mecánico @@ -1055,6 +1118,7 @@ block.container.name = Contenedor block.launch-pad.name = Pad de Lanzamiento block.launch-pad-large.name = Pad de Lanzamiento Grande block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Azul team.crux.name = rojo team.sharded.name = naranja @@ -1126,7 +1199,7 @@ block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades 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 aleación eléctrica con titanio, plomo, silicio y cobre. -block.cryofluidmixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar. +block.cryofluid-mixer.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: el compuesto explosivo. block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable. block.melter.description = Calienta piedra a temperaturas muy altas para obtener lava. @@ -1192,7 +1265,7 @@ block.battery.description = Guarda energía cuando hay abundancia y proporciona 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 materiales 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.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional. 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. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index ea08f62c6d..d5ac8cfb74 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -20,6 +20,8 @@ gameover = Mäng läbi! gameover.pvp = Võistkond[accent] {0}[] võitis! highscore = [accent]Uus rekord! copied = Copied. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Helid load.map = Maailmad @@ -63,8 +65,7 @@ stat.delivered = Kaasavõetud ressursid: stat.playtime = Time Played:[accent] {0} stat.rank = Hinne:[accent] {0} -launcheditems = [accent]Kaasavõetud ressursid -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +globalitems = [accent]Global Items map.delete = Kas oled kindel, et soovid kustutada\nmaailma "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} level.select = Taseme valimine @@ -114,6 +115,7 @@ mod.disable = Disable mod.content = Content: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Info name = Nimi: noname = Valige kõigepealt [accent]nimi[]. +planetmap = Planet Map +launchcore = Launch Core filename = Failinimi: unlocked = Uus sisu! completed = [accent]Olemas @@ -144,6 +148,7 @@ techtree = Uurimispuu research.list = [lightgray]Vajalikud uuringud: research = Uuri researched = [lightgray]{0} uuritud. +research.progress = {0}% complete players = {0} mängijat players.single = {0} mängija players.search = search @@ -340,6 +345,11 @@ waves.load = Lae puhvrist waves.invalid = Puhvrist laeti vigane lahingulainete informatsioon. waves.copied = Lahingulainete informatsioon kopeeriti puhvrisse. waves.none = Vaenlased on täpsustamata.\n[accent]Märkus: Tühjad lahingulained asendatakse automaatselt[]\n[accent]vaikimisi lahingulainetega. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Üksikasjad... edit = Muuda... @@ -459,7 +469,8 @@ locked = Lukus complete = [lightgray]Eesmärgid: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Jätka piirkonnas:\n[lightgray]{0} bestwave = [lightgray]Parim lahingulaine: {0} launch = < LENDUTÕUS > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Arv peab olema 0 ja {0} vahel. zone.unlocked = [lightgray]{0} avatud. zone.requirement.complete = Jõudsid lahingulaineni {0}:\nPiirkonna "{1}" nõuded täidetud. @@ -496,6 +508,20 @@ 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. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Graafika settings.cleardata = Kustuta mänguandmed... settings.clear.confirm = Oled kindel, et soovid olemasolevad\nsätted kustutada?\n[accent]Seda ei saa tagasi võtta! settings.clearall.confirm = [scarlet]HOIATUS![]\nKustutatakse kõik andmed, sealhulgas salvestised, maailmad, kampaania saavutused\nja juhtnuppude sätted.\n[accent]Vajutades nupule "OK", kustutatakse\nkõik andmed ja seejärel mäng sulgub.[] +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paus > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Transportimise kiirus blocks.launchtime = Aeg lendutõusude vahel blocks.shootrange = Ulatus blocks.size = Suurus +blocks.displaysize = Display Size blocks.liquidcapacity = Vedelike mahutavus blocks.powerrange = Energia ulatus +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Energiatarve blocks.powerdamage = Energiatarve hävituspunkti kohta @@ -574,11 +605,14 @@ blocks.boosteffect = Kiirendaja mõju blocks.maxunits = Maks. aktiivseid väeüksuseid blocks.health = Elud blocks.buildtime = Ehitamise aeg +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Ehitamise maksumus blocks.inaccuracy = Ebatäpsus blocks.shots = Laske blocks.reload = Lasku/s blocks.ammo = Laskemoon +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Nõuab paremat puuri bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = vedelikuühikut unit.powerunits = energiaühikut unit.degrees = kraadi unit.seconds = s +unit.minutes = mins unit.persecond = /s +unit.perminute = /min unit.timesspeed = x kiirus unit.percent = % +unit.shieldhealth = shield health unit.items = ressursiühikut unit.thousands = k unit.millions = mil +unit.billions = b category.general = Üldinfo category.power = Energia category.liquids = Vedelikud @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Ründa command.rally = Patrulli command.retreat = Põgene +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Liigu X-teljel keybind.move_y.name = Liigu Y-teljel keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonaalne paigutamine keybind.pick.name = Vali blokk keybind.break_block.name = Hävita blokk keybind.deselect.name = Tühista valik +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Tulista keybind.zoom.name = Muuda suumi keybind.menu.name = Menüü @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Kasuta taimerit rules.waves = Kasuta lahingulaineid rules.attack = Mänguviis "Rünnak" +rules.buildai = AI Building rules.enemyCheat = [scarlet]Vaenlastel[] on lõputult ressursse rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Väeüksused rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Ressursid content.liquid.name = Vedelikud @@ -830,9 +878,11 @@ liquid.water.name = Vesi liquid.slag.name = Räbu liquid.oil.name = Nafta liquid.cryofluid.name = Krüovedelik + item.explosiveness = [lightgray]Plahvatusohtlikkus: {0}% item.flammability = [lightgray]Tuleohtlikkus: {0}% item.radioactivity = [lightgray]Radioaktiivsus: {0}% + unit.health = [lightgray]Elud: {0} unit.speed = [lightgray]Kiirus: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Plahvataja unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Liivakamakas block.grass.name = Rohi block.slag.name = Slag block.salt.name = Sool -block.saltrocks.name = Kristallsool +block.salt-wall.name = Salt Wall block.pebbles.name = Kruus block.tendrils.name = Kombitsad -block.sandrocks.name = Liivakivid +block.sand-wall.name = Sand Wall block.spore-pine.name = Spoorine puu -block.sporerocks.name = Spoorkivid -block.rock.name = Kivikamakas -block.snowrock.name = Lumine kivikamakas +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Lumine puu block.shale.name = Savikilt block.shale-boulder.name = Kivikamakas block.moss.name = Sammal block.shrubs.name = Põõsad block.spore-moss.name = Spoorsammal -block.shalerocks.name = Savikildad +block.shale-wall.name = Shale Wall block.scrap-wall.name = Vanametallist sein block.scrap-wall-large.name = Suur vanametallist sein block.scrap-wall-huge.name = Tohutu vanametallist sein @@ -919,13 +979,17 @@ block.craters.name = Kraatrid block.sand-water.name = Vesi liival block.darksand-water.name = Vesi tumedal liival block.char.name = Puusüsi -block.holostone.name = Helendav kivi +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Jäine lumi -block.rocks.name = Kivid -block.icerocks.name = Jäised kivid -block.snowrocks.name = Lumised kivid -block.dunerocks.name = Luitekivid +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Puu +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Surnud valgepuu block.white-tree.name = Valgepuu block.spore-cluster.name = Spoorikobarad @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Tume paneel 4 block.dark-panel-5.name = Tume paneel 5 block.dark-panel-6.name = Tume paneel 6 block.dark-metal.name = Tume metall -block.ignarock.name = Tardkivim +block.basalt.name = Basalt block.hotrock.name = Kuumad kivid block.magmarock.name = Magmakivim -block.cliffs.name = Rahnud block.copper-wall.name = Vasksein block.copper-wall-large.name = Suur vasksein block.titanium-wall.name = Titaansein @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Ränisulatusahi block.phase-weaver.name = Faaskangakuduja block.pulverizer.name = Metallijahvataja -block.cryofluidmixer.name = Krüosegisti +block.cryofluid-mixer.name = Krüosegisti block.melter.name = Metallisulataja block.incinerator.name = Tuhastusahi block.spore-press.name = Spooripress @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Aku block.battery-large.name = Suur aku block.combustion-generator.name = Põlemisgeneraator -block.turbine-generator.name = Aurugeneraator +block.steam-generator.name = Aurugeneraator block.differential-generator.name = Diferentseeriv generaator block.impact-reactor.name = Impulssreaktor block.mechanical-drill.name = Harilik puur @@ -1055,6 +1118,7 @@ block.container.name = Hoidla block.launch-pad.name = Stardiplatvorm block.launch-pad-large.name = Suur stardiplatvorm block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = sinine team.crux.name = punane team.sharded.name = killustunud @@ -1126,7 +1199,7 @@ block.kiln.description = Sulatab liiva ja plii metaklaasiks. Väike energiatarve block.plastanium-compressor.description = Toodab naftast ja titaanist plastiumit. block.phase-weaver.description = Sünteesib faaskangast radioaktiivsest tooriumist ja liivast. Tohutu energiatarve. block.alloy-smelter.description = Kombineerib titaaniumi, plii, räni ja vase voogsulamiks. -block.cryofluidmixer.description = Toodab krüovedelikku, segades kokku vee ja peene titaanpulbri. Hädavajalik tooriumreaktori toimimiseks. +block.cryofluid-mixer.description = Toodab krüovedelikku, segades kokku vee ja peene titaanpulbri. Hädavajalik tooriumreaktori toimimiseks. block.blast-mixer.description = Purustab spoorikobaraid ja segab neid püratiidiga, et toota lõhkeainet. block.pyratite-mixer.description = Segab söe, plii ja liiva tuleohtlikuks püratiidiks. block.melter.description = Sulatab vanametalli räbuks, mida saab kas edasi töödelda või kasutada pritskahurites. @@ -1192,7 +1265,7 @@ block.battery.description = Salvestab energiat puhvrina positiivse energiabilans 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. block.thermal-generator.description = Toodab energiat kuumades piirkondades. -block.turbine-generator.description = Täiustatud põlemisgeneraator. Tõhusam kui põlemisgeneraator, kuid vajab auru tootmiseks lisanduvat vett. +block.steam-generator.description = Täiustatud põlemisgeneraator. Tõhusam kui põlemisgeneraator, kuid vajab auru tootmiseks lisanduvat vett. block.differential-generator.description = Tekitab suurel hulgal energiat. Kasutab ära krüovedeliku ja põleva püratiidi temperatuuride erinevust. block.rtg-generator.description = Töökindel generaator, mis kasutab radioaktiivsete ühendite lagunemisel eralduvat soojust, et toota sellest aeglasel kiirusel energiat. block.solar-panel.description = Toodab vähesel määral energiat päikesekiirgusest. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 1c115f90ad..5ef1a41b71 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -20,6 +20,8 @@ gameover = Partida amaitu da gameover.pvp = [accent] {0}[] taldeak irabazi du! highscore = [accent]Marka berria! copied = Kopiatuta. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Soinuak load.map = Mapak @@ -63,8 +65,7 @@ stat.delivered = Egotzitako baliabideak: stat.playtime = Time Played:[accent] {0} stat.rank = Azken graduazioa: [accent]{0} -launcheditems = [accent]Egotzitako baliabideak -launchinfo = [unlaunched][[EGOTZI] zure muina urdinez adierazitako baliabideak eskuratzeko. +globalitems = [accent]Global Items map.delete = Ziur al zaude "[accent]{0}[]" mapa ezabatu nahi duzula? level.highscore = Marka: [accent]{0} level.select = Maila hautaketa @@ -114,6 +115,7 @@ mod.disable = Desgaitu mod.content = Content: 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.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Falta diren menpekotasunak: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Honi buruz name = Izena: noname = Hautatu[accent] jokalari-izena[] aurretik. +planetmap = Planet Map +launchcore = Launch Core filename = Fitxategi-izena: unlocked = Eduki berria desblokeatuta! completed = [accent]Ikertua @@ -144,6 +148,7 @@ techtree = Teknologia zuhaitza research.list = [lightgray]Ikertu: research = Ikertu researched = [lightgray]{0} ikertuta. +research.progress = {0}% complete players = {0} jokalari konektatuta players.single = Jokalari {0} konektatuta players.search = search @@ -340,6 +345,11 @@ waves.load = Kargatu arbeletik waves.invalid = Bolada baliogabeak arbelean. waves.copied = Boladak kopiatuta. waves.none = Ez da etsairik zehaztu.\nKontuan izan bolada hutsak lehenetsitako diseinuarekin ordeztuko direla. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Xehetasunak... edit = Editatu... @@ -459,7 +469,8 @@ locked = Blokeatuta complete = [lightgray]Helmena: requirement.wave = Iritsi {0} boladara {1} requirement.core = Suntsitu etsaiaren muina {0} -requirement.unlock = Desblokeatu {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Berrekin:\n[lightgray]{0} bestwave = [lightgray]Bolada onena: {0} launch = < EGOTZI > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Debekatutako blokeak addall = Gehitu denak +launch.destination = Destination: {0} configure.invalid = Kopurua 0 eta {0} bitarteko zenbaki bat izan behar da. zone.unlocked = [lightgray]{0} desblokeatuta. zone.requirement.complete = {0}. boladara iritsia:\n{1} Eremuaren betebeharra beteta. @@ -496,6 +508,20 @@ error.io = Sareko irteera/sarrera errorea. error.any = Sareko errore ezezaguna. error.bloom = Ezin izan da distira hasieratu.\nAgian zure gailuak ez du onartzen. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafikoak settings.cleardata = Garbitu jolasaren datuak... settings.clear.confirm = Ziur datu hauek garbitu nahi dituzula?\nEgindakoa ezin da desegin! settings.clearall.confirm = [scarlet]ABISUA![]\nHonek datu guztiak garbituko ditu, gordetako partidak, mapak, desblokeatutakoak, eta teklen konfigurazioak barne.\nBehin 'Ados' sakatzen duzula jolasak datuk guztiak ezabatuko ditu eta automatikoki irten. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pausatuta > clear = Garbitu banned = [scarlet]Debekatuta @@ -557,8 +585,11 @@ blocks.itemsmoved = Garraio-abiadura blocks.launchtime = Egozketen arteko denbora blocks.shootrange = Irismena blocks.size = Neurria +blocks.displaysize = Display Size blocks.liquidcapacity = Likido-edukiera blocks.powerrange = Energia irismena +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Gehieneko konexioak blocks.poweruse = Energia-erabilera blocks.powerdamage = Energia/Kaltea @@ -574,11 +605,14 @@ blocks.boosteffect = Indartze-efektua blocks.maxunits = Gehieneko unitate aktiboak blocks.health = Osasuna blocks.buildtime = Eraikitze-denbora +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Eraikitze-kostua blocks.inaccuracy = Zehazgabetasuna blocks.shots = Tiroak blocks.reload = Tiroak/segundoko blocks.ammo = Munizioa +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Zulagailu hobea behar da bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = likido unitate unit.powerunits = energia unitate unit.degrees = grado unit.seconds = segundo +unit.minutes = mins unit.persecond = /seg +unit.perminute = /min unit.timesspeed = x abiadura unit.percent = % +unit.shieldhealth = shield health unit.items = elementu unit.thousands = k unit.millions = mil +unit.billions = b category.general = Orokorra category.power = Energia category.liquids = Likidoak @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Eraso command.rally = Batu command.retreat = Erretreta +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Mugitu x keybind.move_y.name = Mugitu y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Hautatu eskualdea keybind.schematic_menu.name = Eskema menua @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Kokatze diagonala keybind.pick.name = Jaso blokea keybind.break_block.name = Apurtu blokea keybind.deselect.name = Deshautatu +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Tirokatu keybind.zoom.name = Zoom keybind.menu.name = Menua @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Boladen denboragailua rules.waves = Boladak rules.attack = Eraso modua +rules.buildai = AI Building rules.enemyCheat = IA-k (talde gorriak) baliabide amaigabeak ditu rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unitateak rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Solidoak content.liquid.name = Likidoak @@ -830,9 +878,11 @@ liquid.water.name = Ura liquid.slag.name = Zepa liquid.oil.name = Olioa liquid.cryofluid.name = Krio-isurkaria + item.explosiveness = [lightgray]Lehergarritasuna: {0}% item.flammability = [lightgray]Sukoitasuna: {0}% item.radioactivity = [lightgray]Erradioaktibitatea: {0}% + unit.health = [lightgray]Osasuna: {0} unit.speed = [lightgray]Abiadura: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Ibilkaria unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Hondar harkaitza block.grass.name = Belarra block.slag.name = Slag block.salt.name = Gatza -block.saltrocks.name = Gatz harkaitzak +block.salt-wall.name = Salt Wall block.pebbles.name = Harribilak block.tendrils.name = Kiribilak -block.sandrocks.name = Hondar arrokak +block.sand-wall.name = Sand Wall block.spore-pine.name = Espora pinua -block.sporerocks.name = Espora arrokak -block.rock.name = Arroka -block.snowrock.name = Elur arroka +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Elur pinua block.shale.name = Shalea block.shale-boulder.name = Shale harkaitza block.moss.name = Goroldioa block.shrubs.name = Zuhaixkak block.spore-moss.name = Espora goroldioa -block.shalerocks.name = Espora arrokak +block.shale-wall.name = Shale Wall block.scrap-wall.name = Txatarrezko horma block.scrap-wall-large.name = Txatarrezko horma handia block.scrap-wall-huge.name = Txatarrezko horma itzela @@ -919,13 +979,17 @@ block.craters.name = Kraterrak block.sand-water.name = Hondar ura block.darksand-water.name = Hondar ilun ura block.char.name = Kokea -block.holostone.name = Holo harria +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Izotz elurra -block.rocks.name = Harkaitzak -block.icerocks.name = Izotz harkaitzak -block.snowrocks.name = Elur harkaitzak -block.dunerocks.name = Duna arrokak +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pinua +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Zuhaitz zuri hila block.white-tree.name = Zuhaitz zuria block.spore-cluster.name = Espora mordoa @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Panel iluna 4 block.dark-panel-5.name = Panel iluna 5 block.dark-panel-6.name = Panel iluna 6 block.dark-metal.name = Metal iluna -block.ignarock.name = Igna arroka +block.basalt.name = Basalt block.hotrock.name = Arroka beroa block.magmarock.name = Magma arroka -block.cliffs.name = Amildegiak block.copper-wall.name = Kobrezko horma block.copper-wall-large.name = Kobrezko horma handia block.titanium-wall.name = Titaniozko horma @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silizio galdategia block.phase-weaver.name = Fase ehulea block.pulverizer.name = Birringailua -block.cryofluidmixer.name = Krio-isurkari nahasgailua +block.cryofluid-mixer.name = Krio-isurkari nahasgailua block.melter.name = Urtzailea block.incinerator.name = Erraustegia block.spore-press.name = Espora prentsa @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Bateria block.battery-large.name = Bateria handia block.combustion-generator.name = Errekuntza sorgailua -block.turbine-generator.name = Lurrin sorgailua +block.steam-generator.name = Lurrin sorgailua block.differential-generator.name = Sorgailu diferentziala block.impact-reactor.name = Talkazko erreaktorea block.mechanical-drill.name = Zulagailu mekanikoa @@ -1055,6 +1118,7 @@ block.container.name = Edukiontzia block.launch-pad.name = Egozketa-plataforma block.launch-pad-large.name = Egozketa-plataforma handia block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = urdina team.crux.name = gorria team.sharded.name = laranja @@ -1126,7 +1199,7 @@ block.kiln.description = Hondarra eta beruna galdatzen ditu metabeira izeneko ko block.plastanium-compressor.description = Plastanioa ekoizten du olioa eta titanioa erabiliz. block.phase-weaver.description = Fasezko ehuna sintetizatzen du torio erradioaktiboa eta hondarra erabiliz. Energia kopurua handia behar du jarduteko. block.alloy-smelter.description = Titanioa, beruna, silizioa eta kobrea konbinatzen ditu tirain aleazioa ekoizteko. -block.cryofluidmixer.description = Ura eta titanio hauts fina nahasten ditu krio-isurkia ekoizteko. Toriozko erreaktorea erabiltzeko ezinbestekoa. +block.cryofluid-mixer.description = Ura eta titanio hauts fina nahasten ditu krio-isurkia ekoizteko. Toriozko erreaktorea erabiltzeko ezinbestekoa. block.blast-mixer.description = Espora sortak eta piratita txikitu eta nahasten ditu lehergai konposatua ekoizteko. block.pyratite-mixer.description = Ikatza, beruna, eta hondarra nahasten ditu oso sukoia den piratita sortuz. block.melter.description = Metala zepara urtzen du, prozesatzen jarraitzeko edo olatu dorreetan erabiltzeko. @@ -1192,7 +1265,7 @@ block.battery.description = Energia biltegiratu dezake gehiegi dagoenean tarteka block.battery-large.description = Bateria arrunt batek baino energia gehiago biltegiratu dezake. block.combustion-generator.description = Energia sortzen du gai erregarriak errez, esaterako ikatza. block.thermal-generator.description = Energia sortzen du toki beroetan jarrita. -block.turbine-generator.description = Errekuntza sorgailu aurreratu bat. Eraginkorragoa. baina ur gehiago behar du lurrina sortzeko. +block.steam-generator.description = Errekuntza sorgailu aurreratu bat. Eraginkorragoa. baina ur gehiago behar du lurrina sortzeko. block.differential-generator.description = Energia kopuru handia sortzen du. Krio-isurkaria eta piratita goriaren arteko tenperatura diferentzia erabiltzen du. block.rtg-generator.description = Sorgailu sinple eta fidagarria. Konposatu erradioaktiboen hirotzearen beroa erabiltzen du geldiro energia sortzeko. block.solar-panel.description = Eguzkiaren energia kopuru txiki bat ematen du. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 93cf3feaaf..ae351b8764 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -20,6 +20,8 @@ gameover = Peli ohi gameover.pvp = [accent] {0}[] joukkue voittaa! highscore = [accent]Uusi ennätys! copied = Kopioitu. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Ääniä load.map = Karttoja @@ -63,8 +65,7 @@ stat.delivered = Resursseja laukaistu: stat.playtime = Time Played:[accent] {0} stat.rank = Lopullinen arvosana: [accent]{0} -launcheditems = [accent]Laukaistut tavarat -launchinfo = [unlaunched][[LAUKAISE] ytimesi saadaksesi sinisellä merkityt tavarat. +globalitems = [accent]Global Items map.delete = Oletko varma että haluat poistaa kartan "[accent]{0}[]"? level.highscore = Ennätys: [accent]{0} level.select = Tason valinta @@ -114,6 +115,7 @@ mod.disable = Poista käytössä mod.content = Sisältö: mod.delete.error = Modia ei pystytty poistamaan. Tiedosto voi olla käytössä. mod.requiresversion = [scarlet]Tarvitsee vähintään pelin version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Tarvitsee nämä modit: {0} mod.erroredcontent = [scarlet]Sisältövirheet mod.errors = Virheitä on tapahtunut pelin ladatessa. @@ -137,6 +139,8 @@ mod.scripts.disable = Laitteesi ei tue modeja skripteillä. Sinun on sammutettav about.button = Tietoa name = Nimi: noname = Valitse ensin[accent] pelaajanimi[]. +planetmap = Planet Map +launchcore = Launch Core filename = Tiedostonimi: unlocked = Uutta sisältöä avattu! completed = [accent]Suoritettu @@ -144,6 +148,7 @@ techtree = Tekniikkapuu research.list = [lightgray]Tutki: research = Tutki researched = [lightgray]{0} tutkittu. +research.progress = {0}% complete players = {0} pelaajaa paikalla players.single = {0} pelaaja paikalla players.search = etsiä @@ -340,6 +345,11 @@ waves.load = Lataa leikepöydältä waves.invalid = Invalid waves in clipboard. waves.copied = Tasot kopioitu. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Yksityiskohdat... edit = Muokkaa... @@ -459,7 +469,8 @@ locked = Lukittu complete = [lightgray]Reach: requirement.wave = Pääse Tasolle {0} kartassa {1} requirement.core = Tuhoa vihollisen ydin kartassa {0} -requirement.unlock = Avaa {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Paras taso: {0} launch = < LAUKAISE > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Kielletyt Palikat addall = Lisää kaikki +launch.destination = Destination: {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. @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafiikat settings.cleardata = Tyhjennä Pelin Data... settings.clear.confirm = Oletko varma että haluat tyhjentää pelin datan?\nMitä on tehty ei voi peruuttaa! settings.clearall.confirm = [scarlet]WARNING![]\nTämä poistaa kaiken datan, mukaanlukien kesken olevat pelit, kartat, avatut asiat ja kontrolliasetukset.\nKun painat 'ok' kaikki datasi poistetaan ja peli suljetaan. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pysäytetty > clear = Tyhjä banned = [scarlet]Kielletty @@ -557,8 +585,11 @@ blocks.itemsmoved = Liikkumisnopeus blocks.launchtime = Aika laukaisujen välillä blocks.shootrange = Kantama blocks.size = Koko +blocks.displaysize = Display Size blocks.liquidcapacity = Nestekapasiteetti blocks.powerrange = Energiakantama +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maksimimäärä yhdistyksiä blocks.poweruse = Energian käyttö blocks.powerdamage = Energia/Vahinko @@ -574,11 +605,14 @@ blocks.boosteffect = Tehostamisem vaikutus blocks.maxunits = Maksimimäärä yksikköjä blocks.health = Elämäpisteet blocks.buildtime = Rakentamisaika +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Rakentamishinta blocks.inaccuracy = Epätarkkuus blocks.shots = Ammusta blocks.reload = Ammusta/sekunnissa blocks.ammo = Ammus +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Parempi pora vaadittu bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = nesteyksikköä unit.powerunits = energiayksikköä unit.degrees = astetta unit.seconds = sekunttia +unit.minutes = mins unit.persecond = /s +unit.perminute = /min unit.timesspeed = x nopeus unit.percent = % +unit.shieldhealth = shield health unit.items = esinettä unit.thousands = t unit.millions = mil +unit.billions = b category.general = Yleinen category.power = Energia category.liquids = Neste @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Hyökkäys command.rally = Kokoontuminen command.retreat = Perääntyminen +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move x keybind.move_y.name = Move y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Valitse alue keybind.schematic_menu.name = Kaavio Valikko @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reaktorien räjähtäminen rules.wavetimer = Tasojen aikaraja rules.waves = Tasot rules.attack = Hyökkäystila +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Tavarat content.liquid.name = Nesteet @@ -830,9 +878,11 @@ liquid.water.name = Vesi liquid.slag.name = Kuona liquid.oil.name = Öljy liquid.cryofluid.name = Kryoneste + item.explosiveness = [lightgray]Räjädysmäisyys: {0}% item.flammability = [lightgray]Syttyvyys: {0}% item.radioactivity = [lightgray]Radioaktiivisuus: {0}% + unit.health = [lightgray]Elämäpisteet: {0} unit.speed = [lightgray]Nopeus: {0} unit.weapon = [lightgray]Ammuksia: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Indeksointirobotti unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Vuoren block.sand-boulder.name = Hiekkalohkare block.grass.name = Ruoho block.slag.name = Kuono block.salt.name = Suolapitoisuus -block.saltrocks.name = Suolakivi +block.salt-wall.name = Salt Wall block.pebbles.name = Pikkukivi block.tendrils.name = Tendrils -block.sandrocks.name = Hiekkakivet +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Mukulakivi -block.snowrock.name = Lumi kivi +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Lumimänny block.shale.name = Liuske block.shale-boulder.name = Shale Boulder block.moss.name = Sammal block.shrubs.name = Pensaikko block.spore-moss.name = Itiösammal -block.shalerocks.name = Liuskekivet +block.shale-wall.name = Shale Wall block.scrap-wall.name = Romuseinä block.scrap-wall-large.name = Suuri romuseinä block.scrap-wall-huge.name = Valtava romuseinä @@ -919,13 +979,17 @@ block.craters.name = Kraatterit block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Jääkivet -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Mänty +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Valkoinen kuollut puu block.white-tree.name = Valkoinen puu block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Tumma paneeli 4 block.dark-panel-5.name = Tumma paneeli 5 block.dark-panel-6.name = Tumma paneeli 6 block.dark-metal.name = Tumma metalli -block.ignarock.name = Igna Rock +block.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Kallio block.copper-wall.name = Kupariseinä block.copper-wall-large.name = Suuri kupariseinä block.titanium-wall.name = Titaaniseinä @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Akku block.battery-large.name = Suuri akku block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Höyrygeneraattori +block.steam-generator.name = Höyrygeneraattori block.differential-generator.name = Differential Generator block.impact-reactor.name = Törmäysreaktori block.mechanical-drill.name = Mechanical Drill @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = sininen team.crux.name = punainen team.sharded.name = orange @@ -1126,7 +1199,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.cryofluid-mixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. @@ -1192,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. 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. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index a07e8ebf76..86c3c0737a 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -20,6 +20,8 @@ gameover = Tapos Na Ang Laro gameover.pvp = Ang[accent] {0}[] team ay nanalo! highscore = [accent]Panibagong mataas na Iskor! copied = Kinopya. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Mga Tunog load.map = Mga Mapa @@ -113,6 +115,7 @@ mod.disable = 'Wag Paganahin mod.content = Nilalaman: mod.delete.error = 'Di matanggal ang mod. Maaaring ginagamit pa 'to. mod.requiresversion = [scarlet]Kinakailangan ang minimum bersyon ng laro: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Nawawalang mga Dependency: {0} mod.erroredcontent = [scarlet]Mga Error sa Nilalaman mod.errors = May mga error na naitala habang ni-lo-load ang nilalaman. @@ -136,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = About name = Name: noname = Pick a[accent] player name[] first. +planetmap = Planet Map +launchcore = Launch Core filename = File Name: unlocked = New content unlocked! completed = [accent]Completed @@ -341,7 +346,6 @@ 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. -#these are intentionally in lower case wavemode.counts = counts wavemode.totals = totals wavemode.health = health @@ -466,9 +470,9 @@ complete = [lightgray]Complete: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} -#TODO fix/remove this launch = < LAUNCH > launch.text = Launch launch.title = Launch Successful @@ -478,11 +482,11 @@ 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 -#TODO loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} @@ -504,7 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. -#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -517,10 +534,6 @@ sector.tarFields.name = Tar Fields sector.saltFlats.name = Salt Flats sector.fungalPass.name = Fungal Pass -#unused -#sector.impact0078.name = Impact 0078 -#sector.crags.name = Crags - sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.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. @@ -545,6 +558,8 @@ 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.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -570,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -587,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -634,9 +655,12 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil @@ -723,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -735,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move X keybind.move_y.name = Move Y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -762,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -796,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -817,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids @@ -844,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Speed: {0} unit.weapon = [lightgray]Weapon: {0} @@ -870,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -878,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -933,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall 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.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -955,10 +1005,9 @@ 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.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -994,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -1007,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1069,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1081,6 +1131,15 @@ block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1140,7 +1199,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.cryofluid-mixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. @@ -1206,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. 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. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index cd79e0ab9c..e7749d7347 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -20,6 +20,8 @@ gameover = Game over gameover.pvp = L'équipe [accent] {0}[] a gagné ! highscore = [accent]Nouveau meilleur score! copied = Copié. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sons load.map = Cartes @@ -63,8 +65,7 @@ stat.delivered = Ressources transférées: stat.playtime = Temps de jeu:[accent] {0} stat.rank = Rang Final: [accent]{0} -launcheditems = [accent]Ressources transférées -launchinfo = [unlaunched][[LANCER] votre noyau pour obtenir les objets indiqués en bleu. +globalitems = [accent]Global Items map.delete = Êtes-vous certain(e) de vouloir supprimer la carte "[accent]{0}[]"? level.highscore = Meilleur score: [accent]{0} level.select = Sélection du niveau @@ -114,6 +115,7 @@ mod.disable = Désactiver mod.content = Contenu: 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.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) 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. @@ -137,6 +139,8 @@ mod.scripts.disable = Votre appareil ne supporte pas les mods avec des scripts. about.button = À propos name = Nom: noname = Commencez par choisir un[accent] nom de joueur[]. +planetmap = Planet Map +launchcore = Launch Core filename = Nom du fichier: unlocked = Nouveau bloc débloqué! completed = [accent]Complété @@ -144,6 +148,7 @@ techtree = Arbre technologique research.list = [lightgray]Recherche: research = Rechercher researched = [lightgray]{0} recherché(e). +research.progress = {0}% complete players = {0} joueurs en ligne players.single = {0} joueur en ligne players.search = Recherche @@ -340,6 +345,11 @@ waves.load = Coller depuis le presse-papiers waves.invalid = Vagues invalides dans le presse-papiers. waves.copied = Vagues copiées waves.none = Aucun ennemi défini.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Détails... edit = Modifier... @@ -459,7 +469,8 @@ locked = Verrouillé complete = [lightgray]Compléter: requirement.wave = Vague {0} dans {1} requirement.core = Détruire le Noyau ennemi dans {0} -requirement.unlock = Débloque {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Reprendre la partie:\n[lightgray]{0} bestwave = [lightgray]Meilleur: {0} launch = < LANCEMENT > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Blocs Bannis addall = Ajouter TOUS +launch.destination = Destination: {0} configure.invalid = Le montant doit être un nombre compris entre 0 et {0}. zone.unlocked = [lightgray]{0} débloquée. zone.requirement.complete = Exigences pour {0} complétées:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Erreur de Réseau (I/O) error.any = Erreur réseau inconnue error.bloom = Échec de l'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Graphismes settings.cleardata = Effacer les données du jeu... settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\nAucun retour en arrière n'est possible! settings.clearall.confirm = [scarlet]ATTENTION![]\nCette action effacera toutes les données, y compris les sauvegardes, les cartes, la progression et la configuration des touches.\nUne fois que vous aurez pressé 'OK' le jeu effacera TOUTES les données et se fermera. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pause > clear = Effacer banned = [scarlet]Bannis @@ -557,8 +585,11 @@ blocks.itemsmoved = Vitesse de Déplacement blocks.launchtime = Temps entre chaque lancement blocks.shootrange = Portée de tir blocks.size = Taille +blocks.displaysize = Display Size blocks.liquidcapacity = Capacité liquide blocks.powerrange = Portée électrique +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Nombre maximal de connections blocks.poweruse = Énergie utilisée blocks.powerdamage = Dégâts d'énergie @@ -574,11 +605,14 @@ blocks.boosteffect = Effet du Boost blocks.maxunits = Unités actives max blocks.health = Santé blocks.buildtime = Durée de construction +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Coût de construction blocks.inaccuracy = Imprécision blocks.shots = Tirs blocks.reload = Tirs/Seconde blocks.ammo = Munitions +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Meilleure Foreuse Requise bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = unité de liquide unit.powerunits = unité d'énergie unit.degrees = degrés unit.seconds = secondes +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x vitesse unit.percent = % +unit.shieldhealth = shield health unit.items = objets unit.thousands = k unit.millions = M +unit.billions = b category.general = Général category.power = Énergie category.liquids = Liquides @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attaque command.rally = Rassembler command.retreat = Retraite +command.idle = Idle placement.blockselectkeys = \n[lightgray]Touche: [{0}, keybind.respawn.name = Réapparaitre keybind.control.name = Controler une Unité @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Montrer/Cacher les Status des Blocs keybind.move_x.name = Mouvement X keybind.move_y.name = Mouvement Y keybind.mouse_move.name = Suivre la Souris +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Sélectionner une Région keybind.schematic_menu.name = Menu des schémas @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Placement en diagonale keybind.pick.name = Choisir un bloc keybind.break_block.name = Supprimer un bloc keybind.deselect.name = Désélectionner +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Tirer keybind.zoom.name = Zoomer keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Explosion des Réacteurs rules.wavetimer = Minuterie pour les vagues rules.waves = Vagues rules.attack = Mode « Attaque » +rules.buildai = AI Building rules.enemyCheat = Ressources infinies pour l'IA (équipe rouge) rules.blockhealthmultiplier = Multiplicateur de Santé des Blocs rules.blockdamagemultiplier = Multiplicateur de Dégât des Blocs @@ -803,8 +847,12 @@ rules.title.unit = Unités rules.title.experimental = Expérimental rules.title.environment = Environment rules.lighting = Éclairage +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Éclairage Ambiant -rules.solarpowermultiplier = Multiplicateur d'Énergie Solaire +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Objets content.liquid.name = Liquides @@ -830,9 +878,11 @@ liquid.water.name = Eau liquid.slag.name = Scories liquid.oil.name = Pétrole liquid.cryofluid.name = Liquide Cryogénique + item.explosiveness = [lightgray]Explosivité: {0} item.flammability = [lightgray]Inflammabilité: {0} item.radioactivity = [lightgray]Radioactivité: {0} + unit.health = [lightgray]Santé: {0} unit.speed = [lightgray]Vitesse: {0} unit.weapon = [lightgray]Arme: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Rampeur unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Falaise block.sand-boulder.name = Bloc de Sable block.grass.name = Herbe block.slag.name = Scories block.salt.name = Sel -block.saltrocks.name = Roches de sel +block.salt-wall.name = Salt Wall block.pebbles.name = Cailloux block.tendrils.name = Vrilles -block.sandrocks.name = Roches de sable +block.sand-wall.name = Sand Wall block.spore-pine.name = Pin Sporeux -block.sporerocks.name = Roche Sporeuse -block.rock.name = Roche -block.snowrock.name = Roches enneigées +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pin enneigé block.shale.name = Schiste block.shale-boulder.name = Blocs de Schiste block.moss.name = Mousse block.shrubs.name = Arbustes block.spore-moss.name = Mousse Sporeuse -block.shalerocks.name = Rochers de Schiste Argileux +block.shale-wall.name = Shale Wall block.scrap-wall.name = Mur de Ferraille block.scrap-wall-large.name = Grand Mur de Ferraille block.scrap-wall-huge.name = Énorme Mur de Ferraille @@ -919,13 +979,17 @@ block.craters.name = Cratères block.sand-water.name = Eau avec fond de Sable block.darksand-water.name = Eau avec fond de Sable Sombre block.char.name = Cendre -block.holostone.name = Pierre Holographique +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Neige et Glace -block.rocks.name = Rochers -block.icerocks.name = Rochers de Glace -block.snowrocks.name = Rochers de Neige -block.dunerocks.name = Rochers de Sable +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pin +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Arbre Blanc Mort block.white-tree.name = Arbre Blanc block.spore-cluster.name = Grappe de Spores @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Panneau Sombre 4 block.dark-panel-5.name = Panneau Sombre 5 block.dark-panel-6.name = Panneau Sombre 6 block.dark-metal.name = Métal Sombre -block.ignarock.name = Roches Ignées +block.basalt.name = Basalt block.hotrock.name = Roches Chaudes block.magmarock.name = Roches Magmatiques -block.cliffs.name = Falaises block.copper-wall.name = Mur de Cuivre block.copper-wall-large.name = Grand Mur de Cuivre block.titanium-wall.name = Mur de Titane @@ -980,7 +1043,7 @@ block.underflow-gate.name = Barrière de Refoulement block.silicon-smelter.name = Fonderie de Silicium block.phase-weaver.name = Tisseur à Phase block.pulverizer.name = Pulvérisateur -block.cryofluidmixer.name = Refroidisseur +block.cryofluid-mixer.name = Refroidisseur block.melter.name = Four à Fusion block.incinerator.name = Incinérateur block.spore-press.name = Presse à Spore @@ -993,7 +1056,7 @@ block.diode.name = Diode block.battery.name = Batterie block.battery-large.name = Grande Batterie block.combustion-generator.name = Générateur à Combustion -block.turbine-generator.name = Générateur à Turbine +block.steam-generator.name = Générateur à Turbine block.differential-generator.name = Générateur Différentiel block.impact-reactor.name = Réacteur à Impact block.mechanical-drill.name = Foreuse Mécanique @@ -1055,6 +1118,7 @@ block.container.name = Conteneur block.launch-pad.name = Plateforme de Lancement block.launch-pad-large.name = Grande Plateforme de Lancement block.segment.name = Diviseur +block.command-center.name = Command Center block.ground-factory.name = Usine d'Unité Terrestre block.air-factory.name = Usine d'Unité Aérienne block.naval-factory.name = Usine d'Unité Navale @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Convoyeur de Masse block.payload-router.name = Routeur de Charge Utile block.disassembler.name = Disassembler block.silicon-crucible.name = Creuset de Silicium -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = bleu team.crux.name = rouge team.sharded.name = jaune @@ -1126,7 +1199,7 @@ block.kiln.description = Fait fondre le sable et le plomb en verre trempé. Néc block.plastanium-compressor.description = Produit du plastanium à partir de pétrole et de titane. block.phase-weaver.description = Produit du tissu phasé à partir de thoriums et de grandes quantités de sable. Nécessite une quantité massive d'énergie pour fonctionner. block.alloy-smelter.description = Produit un alliage superchargé à l'aide de titane, de plomb, de silicium et de cuivre. -block.cryofluidmixer.description = Mélange de l’eau et de la fine poudre de titane pour former du liquide cryogénique. Indispensable lors de l'utilisation de réacteurs aux thoriums. +block.cryofluid-mixer.description = Mélange de l’eau et de la fine poudre de titane pour former du liquide cryogénique. Indispensable lors de l'utilisation de réacteurs aux thoriums. block.blast-mixer.description = Écrase et mélange les amas de spores avec de la pyratite pour produire un mélange explosif. block.pyratite-mixer.description = Mélange le charbon, le plomb et le sable en pyratite hautement inflammable. block.melter.description = Fait fondre la ferraille en scories pour un traitement ultérieur ou une utilisation dans les tourelles « Onde ». @@ -1192,7 +1265,7 @@ block.battery.description = Stocke le surplus d'énergie et le redistribue en ca block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale. block.combustion-generator.description = Génère de l'énergie en brûlant du charbon ou d'autres matériaux inflammables. block.thermal-generator.description = Génère une grande quantité d'énergie à partir de zones de chaleur. -block.turbine-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau. +block.steam-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau. block.differential-generator.description = Génère de grandes quantités d'énergie en utilisant la différence de température entre le liquide cryogénique et la pyratite brûlante. block.rtg-generator.description = Un générateur thermo-électrique à radioisotope qui ne demande pas de refroidissement mais produit moins d'énergie qu'un réacteur à Thorium. block.solar-panel.description = Génère une faible quantité d'énergie grâce aux rayons du soleil. diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index aeff0d5cb8..02fe5e58b1 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -20,6 +20,8 @@ gameover = Le base a été détruite. gameover.pvp = L'équipe[accent] {0}[] a gagnée ! highscore = [accent]Nouveau meilleur score ! copied = Copié. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Son load.map = Maps @@ -63,8 +65,7 @@ stat.delivered = Ressources transférées: stat.playtime = Temps Joué:[accent] {0} stat.rank = Rang Final: [accent]{0} -launcheditems = [accent]Ressources transférées -launchinfo = [unlaunched][[LAUNCH] votre core pour obtenir les objets indiqués en bleu. +globalitems = [accent]Global Items map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"? level.highscore = Meilleur score: [accent]{0} level.select = Sélection de niveau @@ -114,6 +115,7 @@ mod.disable = Désactive mod.content = Contenu: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = À propos name = Nom: noname = Choisissez d'abord [accent]un pseudo[]. +planetmap = Planet Map +launchcore = Launch Core filename = Nom du fichier: unlocked = Nouveau bloc debloqué! completed = [accent]Terminé @@ -144,6 +148,7 @@ techtree = Arbre technologique research.list = [lightgray]Recherche: research = Recherche researched = [lightgray]{0} recherché. +research.progress = {0}% complete players = {0} joueurs players.single = {0} joueur players.search = search @@ -340,6 +345,11 @@ waves.load = Coller depuis le Presse-papiers waves.invalid = Vagues invalides dans le Presse-papiers. waves.copied = Vagues copiées. waves.none = Aucun ennemi défini.\nNotez que les dispositions vides seront automatiquement remplacées par la dispositions par défaut. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Modifier... @@ -459,7 +469,8 @@ locked = Verrouillé complete = [lightgray]Compléter: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Reprendre la partie en cours:\n[lightgray]{0} bestwave = [lightgray]Meilleur: {0} launch = Lancement @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} Débloquée. zone.requirement.complete = Vague {0} atteinte:\n{1} Exigences de la zone complétées @@ -496,6 +508,20 @@ 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. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Graphiques settings.cleardata = Effacer les données du jeu... settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\n[scarlet]Ceci est irréversible settings.clearall.confirm = [scarlet]ATTENTION![]\nCet action effacera toutes les données , incluant les sauvegarges, les cartes, les déblocages et la configuration des touches.\nUne fois que vous aurez pressé 'Ok' le jeu effacera toutes les données et se fermera. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = En pause clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Vitesse de déplacement blocks.launchtime = Temps entre chaque lancement blocks.shootrange = Portée blocks.size = Taille +blocks.displaysize = Display Size blocks.liquidcapacity = Capacité en liquide blocks.powerrange = Distance de transmission +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Énergie utilisée blocks.powerdamage = Énergie/Dégâts @@ -574,11 +605,14 @@ blocks.boosteffect = Effet boostant blocks.maxunits = Maximum d'unitée active blocks.health = Santé blocks.buildtime = Temps de construction +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Coût de construction blocks.inaccuracy = Précision blocks.shots = Tirs blocks.reload = Tirs/Seconde blocks.ammo = Munition +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = Unité de liquide unit.powerunits = Unité d'énergie unit.degrees = degrés unit.seconds = secondes +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x vitesse unit.percent = % +unit.shieldhealth = shield health unit.items = Objets unit.thousands = k unit.millions = mil +unit.billions = b category.general = Général category.power = Énergie category.liquids = Liquides @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attaquer command.rally = Rally command.retreat = Retraite +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Mouvement X keybind.move_y.name = Mouvement Y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Placement en diagonal keybind.pick.name = Choisir un bloc keybind.break_block.name = Supprimer un bloc keybind.deselect.name = Déselectionner +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Tirer keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Temps de vague rules.waves = Vague rules.attack = Mode attaque +rules.buildai = AI Building rules.enemyCheat = Ressources infinies pour l'IA rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unités rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Objets content.liquid.name = Liquides @@ -830,9 +878,11 @@ liquid.water.name = Eau liquid.slag.name = Scorie liquid.oil.name = Pétrole liquid.cryofluid.name = Liquide Cryogénique + item.explosiveness = [lightgray]Explosivité: {0} item.flammability = [lightgray]Inflammabilité: {0} item.radioactivity = [lightgray]Radioactivité: {0} + unit.health = [lightgray]Santé: {0} unit.speed = [lightgray]Vitesse: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Chenille unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sable rocheux block.grass.name = Herbe block.slag.name = Slag block.salt.name = Sel -block.saltrocks.name = Roches de sel +block.salt-wall.name = Salt Wall block.pebbles.name = Cailloux block.tendrils.name = Vrilles -block.sandrocks.name = Roche de sableuse +block.sand-wall.name = Sand Wall block.spore-pine.name = Pin sporifère -block.sporerocks.name = Roche sporifère -block.rock.name = Roche -block.snowrock.name = Roche enneigée +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Schiste block.shale-boulder.name = Rocher de schiste block.moss.name = Mousse block.shrubs.name = Arbustes block.spore-moss.name = Mousse sporifère -block.shalerocks.name = Roche de schiste +block.shale-wall.name = Shale Wall block.scrap-wall.name = Mur de ferraille block.scrap-wall-large.name = Grand mur de ferraille block.scrap-wall-huge.name = Enorme mur de ferraille @@ -919,13 +979,17 @@ block.craters.name = Cratères block.sand-water.name = Eau (sable) block.darksand-water.name = Eau (sable noir) block.char.name = Carboniser -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Neige glacée -block.rocks.name = Roche -block.icerocks.name = Roches de glace -block.snowrocks.name = Roches de neige -block.dunerocks.name = Roches de sable +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pin +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Arbre blanc mort block.white-tree.name = Arbre blanc block.spore-cluster.name = Grappe de spores @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Panneau noir 4 block.dark-panel-5.name = Panneau noir 5 block.dark-panel-6.name = Panneau noir 6 block.dark-metal.name = Métal noir -block.ignarock.name = Roche d'igna +block.basalt.name = Basalt block.hotrock.name = Roche chaude block.magmarock.name = Roche de magma -block.cliffs.name = Falaises block.copper-wall.name = Mur de cuivre block.copper-wall-large.name = Grand mur de cuivre block.titanium-wall.name = Mur de titane @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Fonderie de silicium block.phase-weaver.name = Tisseur à phase block.pulverizer.name = Pulvérisateur -block.cryofluidmixer.name = Refroidisseur +block.cryofluid-mixer.name = Refroidisseur block.melter.name = Four à Fusion block.incinerator.name = Incinérateur block.spore-press.name = Spore presse @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Batterie block.battery-large.name = Batterie large block.combustion-generator.name = Générateur à combustion -block.turbine-generator.name = Générateur à turbine +block.steam-generator.name = Générateur à turbine block.differential-generator.name = Générateur différentiel block.impact-reactor.name = Réacteur à impact block.mechanical-drill.name = Foreuse mécanique @@ -1055,6 +1118,7 @@ block.container.name = Conteneur block.launch-pad.name = Rampe de lancement block.launch-pad-large.name = Grande rampe de lancement block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Bleu team.crux.name = red team.sharded.name = orange @@ -1126,7 +1199,7 @@ block.kiln.description = Fait fondre le sable et le plomb en métaverre. Nécess block.plastanium-compressor.description = Produit du plastanium à partir de pétrole et de titane. block.phase-weaver.description = Produit un tissu de phase à partir de thorium radioactif et de grandes quantités de sable. block.alloy-smelter.description = Produit un alliage de surtension à partir de titane, plomb, silicium et cuivre. -block.cryofluidmixer.description = L'eau et le titane combinés forment un fluide cryo beaucoup plus efficace pour le refroidissement. +block.cryofluid-mixer.description = L'eau et le titane combinés forment un fluide cryo beaucoup plus efficace pour le refroidissement. block.blast-mixer.description = Utilise du pétrole pour transformer la pyratite en un composé explosif moins inflammable mais plus explosif. block.pyratite-mixer.description = Mélange le charbon, le plomb et le sable en pyratite hautement inflammable. block.melter.description = Chauffe la pierre à des températures très élevées pour obtenir de la lave. @@ -1192,7 +1265,7 @@ block.battery.description = Stocke l’énergie chaque fois qu’il ya abondance 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. block.thermal-generator.description = Génère une grande quantité d'énergie grâce à la lave. -block.turbine-generator.description = Plus efficace qu'un générateur de combustion, mais nécessite de l'eau supplémentaire. +block.steam-generator.description = Plus efficace qu'un générateur de combustion, mais nécessite de l'eau supplémentaire. block.differential-generator.description = Génère de grandes quantités d'énergie. Utilise la différence de température entre le cryofluide et la pyratite en combustion. block.rtg-generator.description = Générateur thermoélectrique à radio-isotopes ne nécessitant pas de refroidissement mais fournissant moins d'énergie qu'un réacteur à thorium. block.solar-panel.description = Fournit une petite quantité d'énergie grâce au soleil. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 6c8e0bd47d..b28d471cdd 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -20,6 +20,8 @@ gameover = Vége a játéknak gameover.pvp = A[accent] {0}[] csapat nyert! highscore = [accent]Új rekord! copied = Másolva. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Hangok load.map = Térképek @@ -63,8 +65,7 @@ stat.delivered = Elindított erőforrások: stat.playtime = Játékidő:[accent] {0} stat.rank = Végső értékelés: [accent]{0} -launcheditems = [accent]Elindított elemek -launchinfo = [unlaunched][[INDÍTSD EL] a magot hogy megszerezd a kékkel jelölt erőforrásokat. +globalitems = [accent]Global Items map.delete = Biztos, hogy törölni akarod a "[accent]{0}[]" térképet? level.highscore = Rekord: [accent]{0} level.select = Pálya választása @@ -114,6 +115,7 @@ mod.disable = Letiltás mod.content = Content: mod.delete.error = Nem lehet törölni a Modot. Lehet, hogy egy másik folyamat használja. mod.requiresversion = [scarlet]Minimális játék verzió: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Hiányzó függőségek: {0} mod.erroredcontent = [scarlet]Tartalom hiba mod.errors = Hiba történt a tartalom betöltése közben. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Közreműködők name = Név: noname = Válassz egy[accent] nevet[] előbb. +planetmap = Planet Map +launchcore = Launch Core filename = Fájl név: unlocked = Új tartalom kinyitva! completed = [accent]Kész @@ -144,6 +148,7 @@ techtree = Tech Tree research.list = [lightgray]Fedezd fel: research = Felfedezés researched = [lightgray]{0} felfedezve. +research.progress = {0}% complete players = {0} játékos players.single = {0} játékos players.search = keresés @@ -340,6 +345,11 @@ 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. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Edit... @@ -459,7 +469,8 @@ locked = Zárva complete = [lightgray]Complete: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} launch = < INDÍTÁS > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ 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.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil +unit.billions = b category.general = General category.power = Power category.liquids = Liquids @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move X keybind.move_y.name = Move Y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids @@ -830,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Robbanékonyság: {0}% item.flammability = [lightgray]Gyúlékonyság: {0}% item.radioactivity = [lightgray]Radioaktivitás: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Sebesség: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall 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.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ 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.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1126,7 +1199,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.cryofluid-mixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. @@ -1192,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. 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. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 5868526b85..32aabb9eb5 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -20,6 +20,8 @@ gameover = Permainan Habis gameover.pvp = Tim[accent] {0}[] menang! highscore = [accent]Rekor Baru! copied = Tersalin. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Suara load.map = Peta @@ -63,8 +65,7 @@ stat.delivered = Sumber Daya yang Diluncurkan: stat.playtime = Waktu Bermain:[accent] {0} stat.rank = Nilai Akhir: [accent]{0} -launcheditems = [accent]Sumber Daya -launchinfo = [unlaunched][[LAUNCH] intimu untuk mendapatkan sumber daya yang ditandakan dengan warna biru +globalitems = [accent]Global Items map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"? level.highscore = Nilai Tertinggi: [accent]{0} level.select = Pilih Level @@ -114,6 +115,7 @@ mod.disable = Aktif mod.content = konten: mod.delete.error = Tidak bisa menghapus mod. File mungkin sedang digunakan. mod.requiresversion = [scarlet]Versi game minimal yang dibutuhkan: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Ketergantungan hilang: {0} mod.erroredcontent = [scarlet]Konten Mengalami Kesalahan mod.errors = Kesalahan terjadi disaat memuat konten. @@ -137,6 +139,8 @@ mod.scripts.disable = perangkat anda tidak mendukung mod berformat skrip/JS. And about.button = Tentang name = Nama: noname = Pilih[accent] nama pemain[] dahulu. +planetmap = Planet Map +launchcore = Launch Core filename = Nama File: unlocked = Konten baru terbuka! completed = [accent]Terselesaikan @@ -144,6 +148,7 @@ techtree = Cabang Teknologi research.list = [lightgray]Penelitian: research = Penelitian researched = [lightgray]{0} telah diteliti. +research.progress = {0}% complete players = {0} pemain aktif players.single = {0} pemain aktif players.search = cari @@ -340,6 +345,11 @@ waves.load = Tempel dari Papan klip waves.invalid = Gelombang tidak valid di papan klip. waves.copied = Gelombang tersalin. waves.none = Tidak ada musuh yang didefinisikan.\nIngat bahwa susunan gelombang yang kosong akan diubah menjadi susunan gelombang standar secara otomatis. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detail... edit = Sunting... @@ -459,7 +469,8 @@ locked = Terkunci complete = [lightgray]Mencapai: requirement.wave = Capai gelombang {0} dalam {1} requirement.core = Hancurkan inti musuh dalam {0} -requirement.unlock = Buka {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Lanjutkan Zona:\n[lightgray]{0} bestwave = [lightgray]Gelombang Terbaik: {0} launch = < MELUNCUR > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Balok yang dilarang addall = Tambah Semu +launch.destination = Destination: {0} configure.invalid = Jumlah harus berupa angka diantara 0 dan {0}. zone.unlocked = [lightgray]{0} terbuka. zone.requirement.complete = Gelombang {0} terselesaikan:\nPersyaratan zona {1} tercapai. @@ -496,6 +508,20 @@ error.io = Terjadi kesalahan jaringan I/O. error.any = Terjadi kesalahan Jaringan tidak diketahui. error.bloom = Gagal untuk menginisialisasi bloom.\nPerangkat Anda mungkin tidak mendukung fitur ini. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafik settings.cleardata = Menghapus Data Permainan... settings.clear.confirm = Anda yakin ingin menghapus data ini?\nWaktu tidak bisa diulang kembali! settings.clearall.confirm = [scarlet]PERINGATAN![]\nIni akan menghapus semua data permainan, termasuk simpanan, peta, bukaan dan keybind.\nSetelah Anda menekan 'ok' permainan akan menghapus semua data dan keluar otomatis. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Jeda > clear = Bersih banned = [scarlet]Dilarang @@ -557,8 +585,11 @@ blocks.itemsmoved = Kecepatan Gerak blocks.launchtime = Waktu Diantara Peluncuran blocks.shootrange = Jarak blocks.size = Ukuran +blocks.displaysize = Display Size blocks.liquidcapacity = Kapasitas Zat Cair blocks.powerrange = Jarak Tenaga +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Koneksi Maksimal blocks.poweruse = Penggunaan Tenaga blocks.powerdamage = Tenaga/Pukulan @@ -574,11 +605,14 @@ blocks.boosteffect = Efek Pendorong blocks.maxunits = Maks Unit Aktif blocks.health = Darah blocks.buildtime = Waktu Pembuatan +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Biaya Bangunan blocks.inaccuracy = Jarak Melenceng blocks.shots = Tembakan blocks.reload = Tembakan/Detik blocks.ammo = Amunisi +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Membutuhkan Bor yang Lebih Baik bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = unit zat cair unit.powerunits = unit tenaga unit.degrees = derajat unit.seconds = detik +unit.minutes = mins unit.persecond = /detik +unit.perminute = /min unit.timesspeed = x kecepatan unit.percent = % +unit.shieldhealth = shield health unit.items = item unit.thousands = ribu unit.millions = juta +unit.billions = b category.general = Umum category.power = Tenaga category.liquids = Zat Cair @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Serang command.rally = Kumpul/Patroli command.retreat = Mundur +command.idle = Idle placement.blockselectkeys = \n[lightgray]Kunci: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Pindah x keybind.move_y.name = Pindah y keybind.mouse_move.name = Ikut Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Pilih Daerah keybind.schematic_menu.name = Menu Skema @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Penaruhan Diagonal keybind.pick.name = Memilih Blok keybind.break_block.name = Menghancurkan Blok keybind.deselect.name = Batal Memilih +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Menembak keybind.zoom.name = Perbesar keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Ledakan Reaktor rules.wavetimer = Pengaturan Waktu Gelombang rules.waves = Gelombang rules.attack = Mode Penyerangan +rules.buildai = AI Building rules.enemyCheat = Sumber Daya A.I Musuh (Tim Merah) Tak Terbatas rules.blockhealthmultiplier = Multiplikasi Darah Blok rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unit rules.title.experimental = Eksperimental rules.title.environment = Environment rules.lighting = Penerangan +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Sinar Disekeliling -rules.solarpowermultiplier = Kekuatan Panel Surya (kali) +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Item content.liquid.name = Zat Cair @@ -830,9 +878,11 @@ liquid.water.name = Air liquid.slag.name = Terak liquid.oil.name = Minyak liquid.cryofluid.name = Cairan Dingin + item.explosiveness = [lightgray]Tingkat Keledakan: {0}% item.flammability = [lightgray]Tingkat Kebakaran: {0}% item.radioactivity = [lightgray]Tingkat Radioaktif: {0}% + unit.health = [lightgray]Darah: {0} unit.speed = [lightgray]Kecepatan: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Batu Pasir block.grass.name = Rumput block.slag.name = Slag block.salt.name = Garam -block.saltrocks.name = Batu Garam +block.salt-wall.name = Salt Wall block.pebbles.name = Kerikil block.tendrils.name = Sulur -block.sandrocks.name = Batu Pasir +block.sand-wall.name = Sand Wall block.spore-pine.name = Cemara Spora -block.sporerocks.name = Batu Spora -block.rock.name = Batu -block.snowrock.name = Batu Salju +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pinus Salju block.shale.name = Serpihan block.shale-boulder.name = Serpihan Batu Besar block.moss.name = Lumut block.shrubs.name = Semak-Semak block.spore-moss.name = Lumut Spora -block.shalerocks.name = Batu Serpihan +block.shale-wall.name = Shale Wall block.scrap-wall.name = Dinding Kepingan block.scrap-wall-large.name = Dinding Kepingan Besar 1 block.scrap-wall-huge.name = Dinding Kepingan Besar 2 @@ -919,13 +979,17 @@ block.craters.name = Kawah block.sand-water.name = Air Pasir block.darksand-water.name = Air Pasir Hitam block.char.name = Bara -block.holostone.name = Batu Holo +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Salju Es -block.rocks.name = Batu -block.icerocks.name = Batu Es -block.snowrocks.name = Batu Salju -block.dunerocks.name = Bukit Pasir +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Cemara +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Pohon Putih Mati block.white-tree.name = Pohon Putih block.spore-cluster.name = Kumpulan Spora @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Panel Gelap 4 block.dark-panel-5.name = Panel Gelap 5 block.dark-panel-6.name = Panel Gelap 6 block.dark-metal.name = Besi Gelap -block.ignarock.name = Batu Igna +block.basalt.name = Basalt block.hotrock.name = Batu Panas block.magmarock.name = Batu Lahar -block.cliffs.name = Tebing block.copper-wall.name = Dinding Tembaga block.copper-wall-large.name = Dinding Tembaga Besar block.titanium-wall.name = Dinding Titanium @@ -980,7 +1043,7 @@ block.underflow-gate.name = Gerbang Tidak Meluap block.silicon-smelter.name = Pelebur Silikon block.phase-weaver.name = Pengrajut Phase block.pulverizer.name = Pulverisator -block.cryofluidmixer.name = Penyampur Cairan Dingin +block.cryofluid-mixer.name = Penyampur Cairan Dingin block.melter.name = Pencair block.incinerator.name = Penghangus block.spore-press.name = Penekan Spora @@ -993,7 +1056,7 @@ block.diode.name = Dioda Baterai block.battery.name = Baterai block.battery-large.name = Baterai Besar block.combustion-generator.name = Generator Pembakar -block.turbine-generator.name = Generator Turbin +block.steam-generator.name = Generator Turbin block.differential-generator.name = Generator Majemuk block.impact-reactor.name = Reaktor Tumbukan block.mechanical-drill.name = Bor Mekanik @@ -1055,6 +1118,7 @@ block.container.name = Kontainer block.launch-pad.name = Alas Peluncur block.launch-pad-large.name = Alas Peluncur Besar block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = biru team.crux.name = merah team.sharded.name = oranye @@ -1126,7 +1199,7 @@ block.kiln.description = Membakar pasir dan timah menjadi kaca meta. Membutuhkan block.plastanium-compressor.description = Memproduksi plastanium dari minyak dan titanium. block.phase-weaver.description = Memproduksi kain phase dari thorium dan banyak pasir. block.alloy-smelter.description = Memproduksi campuran logam dari titanium, timah, silikon dan tembaga. -block.cryofluidmixer.description = Mencampur air dan titanium menjadi cairan dingin yang lebih efisien untuk pendingin. +block.cryofluid-mixer.description = Mencampur air dan titanium menjadi cairan dingin yang lebih efisien untuk pendingin. block.blast-mixer.description = Menggunakan minyak untuk membentuk pyratite menjadi senyawa peledak yang kurang mudah terbakar tetapi lebih eksplosif. block.pyratite-mixer.description = Mencampur batu bara, timah dan pasir menjadi pyratite yang sangat mudah terbakar. block.melter.description = Melelehkan kepingan menjadi terak untuk proses selanjutnya atau digunakan menara. @@ -1192,7 +1265,7 @@ block.battery.description = Menyimpan tenaga jika ada kelimpahan dan memberikan block.battery-large.description = Menyimpan lebih banyak tenaga daripada baterai biasa. block.combustion-generator.description = Menghasilkan tenaga dengan membakar minyak atau bahan bakar. block.thermal-generator.description = Menghasilkan tenaga disaat ditaruh di lokasi yang panas. -block.turbine-generator.description = Lebih efisien daripada generator pembakar, tetapi membutuhkan tambahan air. +block.steam-generator.description = Lebih efisien daripada generator pembakar, tetapi membutuhkan tambahan air. block.differential-generator.description = Menghasilkan banyak sekali tenaga. Memanfaatkan perbedaan suhu dingin cairan pendingin dan suhu panas pyratite. block.rtg-generator.description = Generator yang tidak membutuhkan pendiginan tetapi lebih memberi sedikit tenaga daripada reaktor thorium. block.solar-panel.description = Menghasilkan jumlah tenaga kecil dari matahari. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 93e2de29d2..c10f894851 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -20,6 +20,8 @@ gameover = Il Nucleo è stato distrutto. gameover.pvp = La squadra[accent] {0}[] ha vinto! highscore = [accent]Nuovo record! copied = Copiato. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Suoni load.map = Mappe @@ -63,8 +65,7 @@ stat.delivered = Risorse Lanciate: stat.playtime = Tempo Di Gioco:[accent] {0} stat.rank = Livello Finale: [accent]{0} -launcheditems = [accent]Oggetti Lanciati -launchinfo = [unlaunched][[LANCIA] il tuo Nucleo per ottenere gli oggetti indicati in blu. +globalitems = [accent]Global Items map.delete = Sei sicuro di voler eliminare la mappa '[accent]{0}[]'? level.highscore = Miglior Punteggio: [accent]{0} level.select = Selezione del Livello @@ -114,6 +115,7 @@ mod.disable = Disabilita mod.content = Contenuto: mod.delete.error = Impossibile eliminare questa mod. Il file potrebbe essere in uso. mod.requiresversion = [scarlet]Versione minima richiesta: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dipendenze mancanti: {0} mod.erroredcontent = [scarlet]Errori di Contenuto mod.errors = Si sono verificati degli errori durante il caricamento del contenuto. @@ -137,6 +139,8 @@ mod.scripts.disable = Il tuo dispositivo non supporta le mod con gli script. Dev about.button = Info name = Nome: noname = Scegli un[accent] nome[] prima di unirti. +planetmap = Planet Map +launchcore = Launch Core filename = Nome File: unlocked = Nuovo contenuto sbloccato! completed = [accent]Completato @@ -144,6 +148,7 @@ techtree = Albero Scoperta research.list = [lightgray]Ricerca: research = Ricerca researched = [lightgray]{0} cercati. +research.progress = {0}% complete players = {0} giocatori online players.single = {0} giocatore online players.search = Cerca @@ -340,6 +345,11 @@ 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. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Dettagli... edit = Modifica... @@ -459,7 +469,8 @@ locked = Bloccato complete = [lightgray]Completato: requirement.wave = Raggiungi l'ondata {0} in {1} requirement.core = Distruggi il Nucleo Nemico in {0} -requirement.unlock = Sblocca {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Riprendi Zona:\n[lightgray]{0} bestwave = [lightgray]Ondata Migliore: {0} launch = < DECOLLARE > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Blocchi Banditi addall = Aggiungi Tutti +launch.destination = Destination: {0} configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}. zone.unlocked = [lightgray]{0} sbloccata. zone.requirement.complete = Ondata {0} raggiunta:\n[lightgray]{1}[] requisiti di zona soddisfatti. @@ -496,6 +508,20 @@ error.io = Errore I/O di rete. error.any = Errore di rete sconosciuto. error.bloom = Errore dell'avvio delle shaders.\nIl tuo dispositivo potrebbe non supportarle. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafica 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. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< In Pausa > clear = Pulisci banned = [scarlet]Bandito @@ -557,8 +585,11 @@ blocks.itemsmoved = Velocità di Movimento blocks.launchtime = Tempo fra Decolli blocks.shootrange = Raggio blocks.size = Dimensioni +blocks.displaysize = Display Size blocks.liquidcapacity = Capacità del Liquido blocks.powerrange = Raggio Energia +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Connessioni Massime blocks.poweruse = Utilizzo Energia blocks.powerdamage = Energia/Danno @@ -574,11 +605,14 @@ blocks.boosteffect = Effetto Boost blocks.maxunits = Unità Attive Max blocks.health = Salute blocks.buildtime = Tempo di Costruzione +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Costo di Costruzione blocks.inaccuracy = Inaccuratezza blocks.shots = Colpi blocks.reload = Ricarica blocks.ammo = Munizioni +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Miglior Trivella Richiesta bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = unità liquidi unit.powerunits = unità energia unit.degrees = gradi unit.seconds = secondi +unit.minutes = mins unit.persecond = /s +unit.perminute = /min unit.timesspeed = x velocità unit.percent = % +unit.shieldhealth = shield health unit.items = oggetti unit.thousands = k unit.millions = mln +unit.billions = b category.general = Generali category.power = Energia category.liquids = Liquidi @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attacca command.rally = Guardia command.retreat = Ritirata +command.idle = Idle placement.blockselectkeys = \n[lightgray]Tasto: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Attiva/Disattiva Stato Blocchi keybind.move_x.name = Muovi Orizzontalmente keybind.move_y.name = Muovi Verticalmente keybind.mouse_move.name = Segui il Mouse +keybind.pan.name = Pan View keybind.boost.name = Scatto keybind.schematic_select.name = Seleziona Regione keybind.schematic_menu.name = Menu Schematica @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Posiziona Diagonalmente keybind.pick.name = Scegli Blocco keybind.break_block.name = Rompi Blocco keybind.deselect.name = Deseleziona +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Spara keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Esplosioni Reattore rules.wavetimer = Timer Ondate rules.waves = Ondate rules.attack = Modalità Attacco +rules.buildai = AI Building rules.enemyCheat = Risorse AI Infinite rules.blockhealthmultiplier = Moltiplicatore Danno Blocco rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unità rules.title.experimental = Sperimentale rules.title.environment = Environment rules.lighting = Illuminazione +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Illuminazione\nAmbientale -rules.solarpowermultiplier = Moltiplicatore Energia Solare +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Oggetti content.liquid.name = Liquidi @@ -830,9 +878,11 @@ liquid.water.name = Acqua liquid.slag.name = Scoria liquid.oil.name = Petrolio liquid.cryofluid.name = Criofluido + 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} unit.weapon = [lightgray]Armi: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Strisciatore unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Scogliera block.sand-boulder.name = Masso di Sabbia block.grass.name = Erba block.slag.name = Scoria block.salt.name = Sale -block.saltrocks.name = Rocce Salate +block.salt-wall.name = Salt Wall block.pebbles.name = Ciottoli block.tendrils.name = Viticci -block.sandrocks.name = Rocce Sabbiose +block.sand-wall.name = Sand Wall block.spore-pine.name = Pino di Spore -block.sporerocks.name = Roccia di Spore -block.rock.name = Masso -block.snowrock.name = Masso Innevato +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pino Innevato block.shale.name = Scisto block.shale-boulder.name = Masso di Scisto block.moss.name = Muschio block.shrubs.name = Arbusti block.spore-moss.name = Muschio di Spore -block.shalerocks.name = Rocce di Scisto +block.shale-wall.name = Shale Wall block.scrap-wall.name = Muro di Rottami block.scrap-wall-large.name = Muro di Rottami Grande block.scrap-wall-huge.name = Muro di Rottami Enorme @@ -919,13 +979,17 @@ block.craters.name = Crateri block.sand-water.name = Acqua Sabbiosa block.darksand-water.name = Acqua Sabbiosa Scura block.char.name = Carbone -block.holostone.name = Pietra Holo +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Neve Ghiacciata -block.rocks.name = Rocce -block.icerocks.name = Rocce Ghiacciate -block.snowrocks.name = Rocce Innevate -block.dunerocks.name = Rocce delle Dune +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pino +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Albero Bianco Morto block.white-tree.name = Albero Morto block.spore-cluster.name = Agglomerato di Spore @@ -941,10 +1005,9 @@ 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.basalt.name = Basalt 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 di Rame Grande block.titanium-wall.name = Muro di Titanio @@ -980,7 +1043,7 @@ block.underflow-gate.name = Separatore per Eccesso Inverso block.silicon-smelter.name = Fonderia block.phase-weaver.name = Tessitore di Fase block.pulverizer.name = Polverizzatore -block.cryofluidmixer.name = Miscelatore di Liquidi +block.cryofluid-mixer.name = Miscelatore di Liquidi block.melter.name = Fonditore block.incinerator.name = Inceneritore block.spore-press.name = Pressa di Spore @@ -993,7 +1056,7 @@ block.diode.name = Diodo block.battery.name = Batteria block.battery-large.name = Batteria Grande block.combustion-generator.name = Generatore a Combustibile -block.turbine-generator.name = Turbina a Vapore +block.steam-generator.name = Turbina a Vapore block.differential-generator.name = Generatore Differenziale block.impact-reactor.name = Reattore ad Impatto block.mechanical-drill.name = Trivella Meccanica @@ -1055,6 +1118,7 @@ block.container.name = Contenitore block.launch-pad.name = Ascensore Spaziale block.launch-pad-large.name = Ascensore Spaziale Avanzato block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blu team.crux.name = rosso team.sharded.name = arancione @@ -1126,7 +1199,7 @@ block.kiln.description = Fonde la sabbia ed il piombo in vetro metallico. Richie block.plastanium-compressor.description = Produce plastanio da petrolio e titanio. 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.cryofluid-mixer.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.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. @@ -1192,7 +1265,7 @@ block.battery.description = Accumula energia ogni volta che c'è abbondanza e fo 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. -block.turbine-generator.description = Più efficiente di un generatore a combustione, ma richiede l'aggiunta di acqua. +block.steam-generator.description = Più efficiente di un generatore a combustione, ma richiede l'aggiunta di acqua. 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. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 933ae1992a..fdb915ff96 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -20,6 +20,8 @@ gameover = ゲームオーバー gameover.pvp = [accent] {0}[] チームの勝利! highscore = [accent]ハイスコアを更新! copied = コピーしました。 +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = サウンド load.map = マップ @@ -63,8 +65,7 @@ stat.delivered = 獲得した資源: stat.playtime = プレイ時間:[accent] {0} stat.rank = 最終ランク: [accent]{0} -launcheditems = [accent]回収したアイテム -launchinfo = [unlaunched][[発射] コアを発射すると青色で示されたアイテムを入手します。 +globalitems = [accent]Global Items map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? level.highscore = ハイスコア: [accent]{0} level.select = レベル選択 @@ -114,6 +115,7 @@ mod.disable = 無効化 mod.content = コンテンツ: mod.delete.error = MODを削除することができませんでした。 mod.requiresversion = [scarlet]Modが要求する最低バージョン: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]依存関係がありません。: {0} mod.erroredcontent = [scarlet]コンテンツエラー mod.errors = コンテンツの読み込み中にエラーが発生しました。 @@ -137,6 +139,8 @@ mod.scripts.disable = お使いのデバイスはScriptを使用したModをサ about.button = 情報 name = 名前: noname = [accent]プレイヤー名[]を入力してください。 +planetmap = Planet Map +launchcore = Launch Core filename = ファイル名: unlocked = 新しい要素をアンロック! completed = [accent]完了 @@ -144,6 +148,7 @@ techtree = テックツリー research.list = [lightgray]研究: research = 研究 researched = [lightgray]{0} の研究が完了しました +research.progress = {0}% complete players = {0} 人がオンライン players.single = {0} 人がオンライン players.search = 検索 @@ -340,6 +345,11 @@ waves.load = クリップボードから読み込む waves.invalid = クリップボードのウェーブは無効なウェーブです。 waves.copied = ウェーブをコピーしました。 waves.none = 敵が定義されていません。\n空のウェーブレイアウトはデフォルトのレイアウトに自動的に置き換えられます。 + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<デフォルト> details = 詳細... edit = 編集... @@ -459,7 +469,8 @@ locked = ロック complete = [lightgray]達成済み: requirement.wave = {1} でウェーブ {0} に到達 requirement.core = {0} の敵のコアを破壊 -requirement.unlock = ロック解除 {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = 再開:\n[lightgray]{0} bestwave = [lightgray]最高ウェーブ: {0} launch = < 発射 > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = 禁止ブロック addall = すべて追加 +launch.destination = Destination: {0} configure.invalid = 値は 0 から {0} の間でなければなりません。 zone.unlocked = [lightgray]{0} がアンロックされました. zone.requirement.complete = ウェーブ {0} を達成:\n{1} の開放条件を達成しました。 @@ -496,6 +508,20 @@ error.io = ネットワークエラーです。 error.any = 不明なネットワークエラーです。 error.bloom = ブルームの初期化に失敗しました。\n恐らくあなたのデバイスではブルームがサポートされていません。 +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = グラフィック settings.cleardata = データを削除... settings.clear.confirm = データを削除してもよろしいですか?\nこれを元に戻すことはできません! settings.clearall.confirm = [scarlet]警告![]\nこれはすべてのデータが削除されます。これにはセーブデータ、マップ、アンロック、キーバインドが含まれます。\n「ok」 を押すと、すべてのデータが削除され、自動的に終了します。 +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< ポーズ > clear = 消去 banned = [scarlet]使用禁止 @@ -557,8 +585,11 @@ blocks.itemsmoved = 輸送速度 blocks.launchtime = 発射の待機時間 blocks.shootrange = 範囲 blocks.size = 大きさ +blocks.displaysize = Display Size blocks.liquidcapacity = 液体容量 blocks.powerrange = 電力範囲 +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = 最大接続数 blocks.poweruse = 電力使用量 blocks.powerdamage = 電力/ダメージ @@ -574,11 +605,14 @@ blocks.boosteffect = ブースト効果 blocks.maxunits = 最大ユニット数 blocks.health = 耐久値 blocks.buildtime = 建設時間 +blocks.maxconsecutive = Max Consecutive blocks.buildcost = 建設費用 blocks.inaccuracy = 誤差 blocks.shots = ショット blocks.reload = リロード速度 blocks.ammo = 弾薬 +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = より高性能なドリルを使用してください bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = 液体 unit.powerunits = 電力 unit.degrees = 度 unit.seconds = 秒 +unit.minutes = mins unit.persecond = /秒 +unit.perminute = /min unit.timesspeed = 倍の速度 unit.percent = % +unit.shieldhealth = shield health unit.items = アイテム unit.thousands = k unit.millions = mil +unit.billions = b category.general = 一般 category.power = 電力 category.liquids = 液体 @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = 攻撃 command.rally = 結集 command.retreat = 後退 +command.idle = Idle placement.blockselectkeys = \n[lightgray]キー: [{0}, keybind.respawn.name = リスポーン keybind.control.name = ユニットをコントロール @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = ブロックの状態表示の切り替え keybind.move_x.name = 左右移動 keybind.move_y.name = 上下移動 keybind.mouse_move.name = マウスを追う +keybind.pan.name = Pan View keybind.boost.name = ブースト keybind.schematic_select.name = 地域の選択 keybind.schematic_menu.name = 設計図メニュー @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = 斜め設置 keybind.pick.name = ブロックの選択 keybind.break_block.name = ブロックの破壊 keybind.deselect.name = 選択解除 +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = ショット keybind.zoom.name = ズーム keybind.menu.name = メニュー @@ -782,6 +825,7 @@ rules.reactorexplosions = リアクターの爆発 rules.wavetimer = ウェーブの自動進行 rules.waves = ウェーブ rules.attack = アタックモード +rules.buildai = AI Building rules.enemyCheat = 敵(赤チーム)の資源の無限化 rules.blockhealthmultiplier = ブロックの体力倍率 rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = ユニット rules.title.experimental = 実験的なゲームプレイ rules.title.environment = Environment rules.lighting = 霧 +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = 霧の色 -rules.solarpowermultiplier = 太陽光効率 +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = アイテム content.liquid.name = 液体 @@ -830,9 +878,11 @@ liquid.water.name = 水 liquid.slag.name = スラグ liquid.oil.name = 石油 liquid.cryofluid.name = 冷却水 + item.explosiveness = [lightgray]爆発性: {0}% item.flammability = [lightgray]可燃性: {0}% item.radioactivity = [lightgray]放射能: {0}% + unit.health = [lightgray]耐久値: {0} unit.speed = [lightgray]速度: {0} unit.weapon = [lightgray]武器: {0} @@ -856,6 +906,7 @@ unit.crawler.name = クローラー unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = 崖 block.sand-boulder.name = 巨大な礫 block.grass.name = 草 block.slag.name = スラグ block.salt.name = 岩塩氷河 -block.saltrocks.name = 岩塩 +block.salt-wall.name = Salt Wall block.pebbles.name = 小石 block.tendrils.name = つる -block.sandrocks.name = 砂岩 +block.sand-wall.name = Sand Wall block.spore-pine.name = 胞子の松の木 -block.sporerocks.name = 胞子の岩 -block.rock.name = 岩 -block.snowrock.name = 雪の積もった岩 +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = 松の木 block.shale.name = 泥板岩 block.shale-boulder.name = 泥板岩の丸石 block.moss.name = コケ block.shrubs.name = 低木 block.spore-moss.name = 胞子のコケ -block.shalerocks.name = 泥板岩の岩 +block.shale-wall.name = Shale Wall block.scrap-wall.name = スクラップの壁 block.scrap-wall-large.name = 大きなスクラップの壁 block.scrap-wall-huge.name = とても大きなスクラップの壁 @@ -919,13 +979,17 @@ block.craters.name = クレーター block.sand-water.name = 濁った水 block.darksand-water.name = 黒い砂で濁った水 block.char.name = 焦げ跡 -block.holostone.name = ホロストーン +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = 雪氷 -block.rocks.name = 岩 -block.icerocks.name = 氷岩 -block.snowrocks.name = 雪の積もった岩 -block.dunerocks.name = 砂丘の岩 +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = 松の木 +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = 白い枯れた樹木 block.white-tree.name = 白い樹木 block.spore-cluster.name = 胞子の房 @@ -941,10 +1005,9 @@ block.dark-panel-4.name = ダークパネル 4 block.dark-panel-5.name = ダークパネル 5 block.dark-panel-6.name = ダークパネル 6 block.dark-metal.name = ダークメタル -block.ignarock.name = イグナロック +block.basalt.name = Basalt block.hotrock.name = ホットロック block.magmarock.name = マグマの岩 -block.cliffs.name = 崖 block.copper-wall.name = 銅の壁 block.copper-wall-large.name = 巨大な銅の壁 block.titanium-wall.name = チタンの壁 @@ -980,7 +1043,7 @@ block.underflow-gate.name = アンダーフローゲート block.silicon-smelter.name = シリコン溶鉱炉 block.phase-weaver.name = フェーズ織機 block.pulverizer.name = 粉砕機 -block.cryofluidmixer.name = 冷却ミキサー +block.cryofluid-mixer.name = 冷却ミキサー block.melter.name = 融合機 block.incinerator.name = 焼却炉 block.spore-press.name = 胞子圧縮機 @@ -993,7 +1056,7 @@ block.diode.name = バッテリーダイオード block.battery.name = バッテリー block.battery-large.name = 大型バッテリー block.combustion-generator.name = 火力発電機 -block.turbine-generator.name = タービン発電機 +block.steam-generator.name = タービン発電機 block.differential-generator.name = 差動発電機 block.impact-reactor.name = インパクトリアクター block.mechanical-drill.name = 機械ドリル @@ -1055,6 +1118,7 @@ block.container.name = コンテナー block.launch-pad.name = 発射台 block.launch-pad-large.name = 大型発射台 block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = ブルー team.crux.name = レッド team.sharded.name = オレンジ @@ -1126,7 +1199,7 @@ block.kiln.description = 砂と鉛を溶かしてメタガラスを生成しま block.plastanium-compressor.description = オイルとチタンからプラスタニウムを製造します。 block.phase-weaver.description = 放射性トリウムと多量の砂からフェーズファイバーを製造します。 block.alloy-smelter.description = チタンや鉛、シリコン、銅からサージ合金を製造します。 -block.cryofluidmixer.description = 水とチタンから冷却に効率的な冷却水を製造します。 +block.cryofluid-mixer.description = 水とチタンから冷却に効率的な冷却水を製造します。 block.blast-mixer.description = 可燃性のピラタイトを石油を使用してさらに爆発性化合物にします。 block.pyratite-mixer.description = 石炭、鉛、砂から燃えやすいピラタイトを製造します。 block.melter.description = 石を熱で溶かして溶岩を生成します。 @@ -1192,7 +1265,7 @@ block.battery.description = 余分な電力の充電して、貯めておくこ block.battery-large.description = 通常のバッテリーよりもたくさんの電力を溜めておくことができます。 block.combustion-generator.description = 石油や可燃性の物質を燃やして発電します。 block.thermal-generator.description = 溶岩から大量の電力を発電します。 -block.turbine-generator.description = 水を使って火力発電機より効率的に発電します。 +block.steam-generator.description = 水を使って火力発電機より効率的に発電します。 block.differential-generator.description = 大量の電力を生成します。冷却水と燃焼したピラタイトの温度差を利用します。 block.rtg-generator.description = トリウムリアクターよりも発電量は少ないですが、冷却を必要としない放射性同位体熱発電機(RTG)です。 block.solar-panel.description = 太陽光から少量の電力を発電します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index cedeaaf039..87f3d00a1b 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -20,6 +20,8 @@ gameover = 게임 오버 gameover.pvp = [accent]{0}[] 팀이 승리했습니다! highscore = [accent]새로운 최고 점수! copied = 복사됨. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = 소리 load.map = 맵 @@ -63,8 +65,7 @@ stat.delivered = 얻은 자원: stat.playtime = 플레이 시간: [accent] {0} stat.rank = 최종 순위: [accent]{0} -launcheditems = [accent]보유 자원 -launchinfo = [출격되지 않음][[출격]파랑색으로 표시된 자원들을 얻습니다. +globalitems = [accent]Global Items map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? level.highscore = 최고 점수: [accent]{0} level.select = 맵 선택 @@ -114,6 +115,7 @@ mod.disable = 비활성화 mod.content = 콘텐츠: mod.delete.error = 모드를 삭제할 수 없습니다. 파일이 사용 중일 수 있습니다. mod.requiresversion = [scarlet]필요한 최소 게임 버전: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]누락된 요구 모드: {0} mod.erroredcontent = [scarlet]콘텐츠 오류 mod.errors = 콘텐츠를 로드하는 동안 오류가 발생함. @@ -126,7 +128,7 @@ mod.import = 모드 가져오기 mod.import.file = 파일 가져오기 mod.import.github = Github 에서 모드 가져오기 mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 소스에서 얻은 모드만을 사용해야 합니다! -mod.item.remove = 이 아이템은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. +mod.item.remove = 이 자원은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. mod.remove.confirm = 이 모드가 삭제될 것입니다. mod.author = [lightgray]제작자:[] {0} mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 더 이상 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러 오시겠습니까?\n[lighthray]모드들:\n{0} @@ -137,6 +139,8 @@ mod.scripts.disable = 이 기기는 스크립트가 있는 모드를 지원하 about.button = 정보 name = 이름: noname = 먼저 [accent]플레이어 이름[]을 설정하세요. +planetmap = Planet Map +launchcore = Launch Core filename = 파일 이름: unlocked = 새로운 콘텐츠가 해금되었습니다! completed = [accent]완료됨 @@ -144,6 +148,7 @@ techtree = 연구 기록 research.list = [lightgray]연구: research = 연구 researched = [lightgray]{0} 연구 완료. +research.progress = {0}% complete players = {0} 플레이어들 players.single = {0} 플레이어 players.search = 검색 @@ -340,6 +345,11 @@ waves.load = 클립보드에서 불러오기 waves.invalid = 클립보드에 잘못된 웨이브 데이터가 있습니다. waves.copied = 웨이브 복사됨 waves.none = 적 웨이브가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 웨이브로 설정됩니다. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<기본값> details = 설명 edit = 편집 @@ -459,7 +469,8 @@ locked = 잠김 complete = [lightgray]해금 조건 : requirement.wave = {1}지역에서 {0}웨이브 달성 requirement.core = {0}지역에서 적 코어를 파괴 -requirement.unlock = {0}지역 해금 +requirement.research = Research {0} +requirement.capture = Capture {0} resume = 지역 재개:\n[lightgray]{0} bestwave = [lightgray]최고 웨이브: {0} launch = < 출격 > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = 금지된 블록들 addall = 모두 추가 +launch.destination = Destination: {0} configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다. zone.unlocked = [lightgray]{0} 해금됨. zone.requirement.complete = {0}에 대한 요구 사항 충족:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = 네트워크 I/O 오류. error.any = 알 수 없는 네트워크 오류. error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = 전초기지 sector.craters.name = 크레이터 sector.frozenForest.name = 얼어붙은 숲 @@ -532,6 +558,8 @@ settings.graphics = 그래픽 settings.cleardata = 게임 데이터 초기화... settings.clear.confirm = 정말로 이 데이터를 지우시겠습니까?\n완료된 작업은 취소할 수 없습니다! settings.clearall.confirm = [scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 키 매핑, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< 일시정지 > clear = 초기화 banned = [scarlet]차단됨 @@ -541,7 +569,7 @@ no = 아니오 info.title = 정보 error.title = [scarlet]오류가 발생했습니다. error.crashtitle = 오류가 발생했습니다 -unit.nobuild = [scarlet]유닛을 만들 수 없습니다 +unit.nobuild = [scarlet]이 유닛은 건설할 수 없습니다. blocks.input = 입력 blocks.output = 출력 blocks.booster = 가속 @@ -554,11 +582,14 @@ blocks.damage = 공격력 blocks.targetsair = 공중 공격 blocks.targetsground = 지상 공격 blocks.itemsmoved = 이동 속도 -blocks.launchtime = 출격 사이의 시간 +blocks.launchtime = 출격 간격 blocks.shootrange = 사거리 blocks.size = 크기 +blocks.displaysize = Display Size blocks.liquidcapacity = 액체 용량 blocks.powerrange = 전력 범위 +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = 최대 연결 수 blocks.poweruse = 전력 사용 blocks.powerdamage = 전력/데미지 @@ -574,13 +605,16 @@ blocks.boosteffect = 가속 효과 blocks.maxunits = 최대 활성 유닛수 blocks.health = 체력 blocks.buildtime = 건설 시간 +blocks.maxconsecutive = Max Consecutive blocks.buildcost = 건설 재료 blocks.inaccuracy = 오차각 blocks.shots = 공격 속도 blocks.reload = 발/초 blocks.ammo = 탄약 +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time -bar.drilltierreq = 더 좋은 드릴이 요구됨 +bar.drilltierreq = 더 좋은 드릴이 필요 bar.noresources = 자원 부족 bar.corereq = 코어 기지 필요 bar.drillspeed = 드릴 속도: {0}/s @@ -593,7 +627,7 @@ bar.poweroutput = 전력 출력: {0} bar.items = 자원량: {0} bar.capacity = 용량: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[장비를 정지합니다] bar.liquid = 액체 bar.heat = 발열 bar.power = 전력 @@ -607,7 +641,7 @@ bullet.incendiary = [stat]방화 bullet.homing = [stat]유도 bullet.shock = [stat]전격 bullet.frag = [stat]파편 -bullet.knockback = [stat]{0}[lightgray] 밀어내기 +bullet.knockback = [stat]{0}[lightgray] 밀침 bullet.freezing = [stat]빙결 bullet.tarred = [stat]타르 bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수 @@ -621,19 +655,23 @@ unit.liquidunits = 액체 unit.powerunits = 전력 unit.degrees = 도 unit.seconds = 초 +unit.minutes = mins unit.persecond = /초 +unit.perminute = /min unit.timesspeed = x 배 unit.percent = % +unit.shieldhealth = shield health unit.items = 자원 unit.thousands = 천 unit.millions = 백만 +unit.billions = b category.general = 일반 category.power = 전력 category.liquids = 액체 -category.items = 아이템 +category.items = 자원 category.crafting = 입력/출력 category.shooting = 사격 -category.optional = 보조 아이템 +category.optional = 보조 자원 setting.landscape.name = 가로화면 잠금 setting.shadows.name = 그림자 setting.blockreplace.name = 자동 블록 제안 @@ -679,7 +717,7 @@ setting.blockselectkeys.name = 블록 선택 키 표시 setting.vsync.name = 수직 동기화 setting.pixelate.name = 픽셀화 setting.minimap.name = 미니맵 표시 -setting.coreitems.name = 코어에 있는 아이템 표시 +setting.coreitems.name = 코어에 있는 자원 표시 setting.position.name = 플레이어 위치 표시 setting.musicvol.name = 음악 크기 setting.atmosphere.name = 행성 배경화면 표시 @@ -699,7 +737,7 @@ public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모 public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다. uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다... uiscale.cancel = 취소 후 나가기 -setting.bloom.name = 블룸 +setting.bloom.name = 화려한 효과 keybind.title = 조작키 설정 keybinds.mobile = [scarlet]대부분의 키 맵핑은 모바일에서 작동하지 않습니다. 기본 이동만 지원됩니다. category.general.name = 일반 @@ -709,6 +747,7 @@ category.blocks.name = 블록 선택 command.attack = 공격 command.rally = 순찰 command.retreat = 후퇴 +command.idle = Idle placement.blockselectkeys = \n[lightgray]키: [{0}, keybind.respawn.name = 리스폰 keybind.control.name = 유닛 제어 @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = 블록 상태 토글 keybind.move_x.name = X축 이동 keybind.move_y.name = Y축 이동 keybind.mouse_move.name = 커서를 따라서 이동 +keybind.pan.name = Pan View keybind.boost.name = 부스트 keybind.schematic_select.name = 영역 설정 keybind.schematic_menu.name = 설계도 메뉴 @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = 대각선 설치 keybind.pick.name = 블록 선택 keybind.break_block.name = 블록 파괴 keybind.deselect.name = 선택해제 +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = 사격 keybind.zoom.name = 확대 keybind.menu.name = 메뉴 @@ -782,6 +825,7 @@ rules.reactorexplosions = 원자로 폭발 rules.wavetimer = 웨이브 시간 rules.waves = 웨이브 rules.attack = 공격 모드 +rules.buildai = AI Building rules.enemyCheat = 무한 AI (빨간팀) 자원 rules.blockhealthmultiplier = 블록 체력 배수 rules.blockdamagemultiplier = 블록 공격력 배수 @@ -803,10 +847,14 @@ rules.title.unit = 유닛 rules.title.experimental = 실험적인 기능 rules.title.environment = 환경 rules.lighting = 조명 -rules.ambientlight = 주변 조명 -rules.solarpowermultiplier = 태양광 발전 배수 +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage +rules.ambientlight = 자연 조명 +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: -content.item.name = 아이템 +content.item.name = 자원 content.liquid.name = 액체 content.unit.name = 유닛 content.block.name = 블록 @@ -820,78 +868,90 @@ item.silicon.name = 실리콘 item.plastanium.name = 플라스터늄 item.phase-fabric.name = 메타 item.surge-alloy.name = 설금 -item.spore-pod.name = 포자 포드 +item.spore-pod.name = 포자 버섯 item.sand.name = 모래 -item.blast-compound.name = 화합물 +item.blast-compound.name = 폭발물 item.pyratite.name = 파이라타이트 -item.metaglass.name = 금속유리 +item.metaglass.name = 강화 유리 item.scrap.name = 고철 liquid.water.name = 물 liquid.slag.name = 광재 liquid.oil.name = 기름 -liquid.cryofluid.name = 냉각 +liquid.cryofluid.name = 냉각수 + item.explosiveness = [lightgray]폭발성: {0} item.flammability = [lightgray]인화성: {0} item.radioactivity = [lightgray]방사능: {0} + unit.health = [lightgray]체력: {0} unit.speed = [lightgray]속도: {0} unit.weapon = [lightgray]무기: {0} -unit.itemcapacity = [lightgray]아이템 수용량: {0} +unit.itemcapacity = [lightgray]자원 수용량: {0} unit.minespeed = [lightgray]채광 속도: {0}% unit.minepower = [lightgray]채광 레벨: {0} unit.ability = [lightgray]능력: {0} unit.buildspeed = [lightgray]건설 속도: {0}% -liquid.heatcapacity = [lightgray]발열 용량: {0} +liquid.heatcapacity = [lightgray]비열: {0} liquid.viscosity = [lightgray]점도: {0} liquid.temperature = [lightgray]온도: {0} -unit.dagger.name = Dagger -unit.mace.name = Mace -unit.fortress.name = Fortress -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = Crawler -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma +unit.dagger.name = 대거 +unit.mace.name = 메이스 +unit.fortress.name = 포트리스 +unit.nova.name = 노바 +unit.pulsar.name = 펄서 +unit.quasar.name = 퀘이사 +unit.crawler.name = 크롤러 +unit.atrax.name = 아트락스 +unit.spiroct.name = 스피록트 +unit.arkyid.name = 아키드 +unit.toxopid.name = Toxopid +unit.flare.name = 플레어 +unit.horizon.name = 호라이즌 +unit.zenith.name = 제니스 +unit.antumbra.name = 안텀브라 +unit.eclipse.name = 이클립스 +unit.mono.name = 모노 +unit.poly.name = 폴리 +unit.mega.name = 메가 +unit.quad.name = Quad +unit.oct.name = Oct +unit.risso.name = 리소 +unit.minke.name = 민케 +unit.bryde.name = 브리드 +unit.sei.name = 세이 +unit.omura.name = 오무라 +unit.alpha.name = 알파 +unit.beta.name = 베타 +unit.gamma.name = 감마 +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus -block.parallax.name = Parallax +block.resupply-point.name = Resupply Point +block.parallax.name = 시차 block.cliff.name = 낭떠러지 block.sand-boulder.name = 사암 block.grass.name = 잔디 block.slag.name = 광재 block.salt.name = 소금 -block.saltrocks.name = 소금 바위 +block.salt-wall.name = 소금 벽 block.pebbles.name = 조약돌 block.tendrils.name = 덩굴 -block.sandrocks.name = 모래 바위 +block.sand-wall.name = 모래 벽 block.spore-pine.name = 포자 덮인 소나무 -block.sporerocks.name = 포자 바위 -block.rock.name = 돌 -block.snowrock.name = 눈덩이 +block.spore-wall.name = 포자 벽 +block.boulder.name = 돌 +block.snow-boulder.name = 눈덩이 block.snow-pine.name = 눈 덮인 소나무 block.shale.name = 이판암 block.shale-boulder.name = 둥근 이판암 block.moss.name = 이끼 block.shrubs.name = 관목 block.spore-moss.name = 포자 이끼 -block.shalerocks.name = 이판암 바위 +block.shale-wall.name = 이판암 벽 block.scrap-wall.name = 조각벽 block.scrap-wall-large.name = 대형 조각벽 block.scrap-wall-huge.name = 거대한 조각 벽 @@ -919,13 +979,17 @@ block.craters.name = 구덩이 block.sand-water.name = 젖은 모래 block.darksand-water.name = 젖은 검은 모래 block.char.name = 숯 -block.holostone.name = 홀로스톤 +block.dacite.name = 데이사이트 +block.dacite-wall.name = 데이사이트 벽 block.ice-snow.name = 얼음눈 -block.rocks.name = 돌 -block.icerocks.name = 얼음바위 -block.snowrocks.name = 눈바위 -block.dunerocks.name = 모래돌 +block.stone-wall.name = 돌 벽 +block.ice-wall.name = 얼음 벽 +block.snow-wall.name = 눈 벽 +block.dune-wall.name = 모래 벽 block.pine.name = 소나무 +block.dirt.name = 흙 +block.dirt-wall.name = 흙 벽 +block.mud.name = 진흙 block.white-tree-dead.name = 죽은 하얀나무 block.white-tree.name = 하얀 나무 block.spore-cluster.name = 포자낭 @@ -941,10 +1005,9 @@ block.dark-panel-4.name = 어두운 패널 4 block.dark-panel-5.name = 어두운 패널 5 block.dark-panel-6.name = 어두운 패널 6 block.dark-metal.name = 어두운 금속제 -block.ignarock.name = 얼은 바위 +block.basalt.name = 현무암 block.hotrock.name = 뜨거운 바위 block.magmarock.name = 용암 바위 -block.cliffs.name = 절벽 block.copper-wall.name = 구리 벽 block.copper-wall-large.name = 대형 구리 벽 block.titanium-wall.name = 티타늄 벽 @@ -956,7 +1019,7 @@ block.phase-wall-large.name = 대형 메타 벽 block.thorium-wall.name = 토륨 벽 block.thorium-wall-large.name = 대형 토륨 벽 block.door.name = 문 -block.door-large.name = 대형문 +block.door-large.name = 대형 문 block.duo.name = 듀오 block.scorch.name = 스코치 block.scatter.name = 스캐터 @@ -966,7 +1029,7 @@ block.conveyor.name = 컨베이어 block.titanium-conveyor.name = 티타늄 컨베이어 block.plastanium-conveyor.name = 플라스터늄 컨베이어 block.armored-conveyor.name = 장갑 컨베이어 -block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 아이템을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 아이템을 받을 수 없습니다. +block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 자원을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 자원을 받을 수 없습니다. block.junction.name = 교차기 block.router.name = 분배기 block.distributor.name = 대형 분배기 @@ -975,12 +1038,12 @@ block.inverted-sorter.name = 반전 필터 block.message.name = 메모 블록 block.illuminator.name = 조명 block.illuminator.description = 작고, 간단하고, 설정 가능한 광원입니다. 작동하려면 전력이 필요합니다. -block.overflow-gate.name = 오버플로 게이트 -block.underflow-gate.name = 언더플로 게이트 +block.overflow-gate.name = 포화 필터 +block.underflow-gate.name = 불포화 필터 block.silicon-smelter.name = 실리콘 제련소 block.phase-weaver.name = 메타 합성기 block.pulverizer.name = 분쇄기 -block.cryofluidmixer.name = 냉각 유체 제조기 +block.cryofluid-mixer.name = 냉각수 제조기 block.melter.name = 융해기 block.incinerator.name = 소각로 block.spore-press.name = 포자 압축기 @@ -993,14 +1056,14 @@ block.diode.name = 배터리 다이오드 block.battery.name = 배터리 block.battery-large.name = 대형 배터리 block.combustion-generator.name = 연소 발전기 -block.turbine-generator.name = 증기 발전기 +block.steam-generator.name = 증기 발전기 block.differential-generator.name = 차동 발잔기 -block.impact-reactor.name = 임팩트 원자로 +block.impact-reactor.name = 핵융합 원자로 block.mechanical-drill.name = 기계식 드릴 block.pneumatic-drill.name = 공압 드릴 block.laser-drill.name = 레이저 드릴 block.water-extractor.name = 물 추출기 -block.cultivator.name = 제초기 +block.cultivator.name = 온실 block.conduit.name = 파이프 block.mechanical-pump.name = 기계식 펌프 block.item-source.name = 자원 공급기 @@ -1011,15 +1074,15 @@ block.power-void.name = 방전장치 block.power-source.name = 전력 공급기 block.unloader.name = 언로더 block.vault.name = 창고 -block.wave.name = 웨이브 +block.wave.name = 파도 block.swarmer.name = 스워머 block.salvo.name = 살보 block.ripple.name = 립플 block.phase-conveyor.name = 메타 컨베이어 block.bridge-conveyor.name = 다리 컨베이어 block.plastanium-compressor.name = 플라스터늄 압축기 -block.pyratite-mixer.name = 라타이트 혼합기 -block.blast-mixer.name = 화합물 혼합기 +block.pyratite-mixer.name = 파이라타이트 혼합기 +block.blast-mixer.name = 폭발물 혼합기 block.solar-panel.name = 태양 전지판 block.solar-panel-large.name = 대형 태양 전지판 block.oil-extractor.name = 석유 추출기 @@ -1039,7 +1102,7 @@ block.thermal-pump.name = 화력 펌프 block.thermal-generator.name = 화력 생성기 block.alloy-smelter.name = 설금 제련소 block.mender.name = 멘더 -block.mend-projector.name = 대형 수리 프로젝터 +block.mend-projector.name = 수리 프로젝터 block.surge-wall.name = 설금 벽 block.surge-wall-large.name = 큰 설금 벽 block.cyclone.name = 사이클론 @@ -1055,18 +1118,28 @@ block.container.name = 컨테이너 block.launch-pad.name = 출격 패드 block.launch-pad-large.name = 대형 출격 패드 block.segment.name = 세그먼트 +block.command-center.name = Command Center block.ground-factory.name = 지상 공장 block.air-factory.name = 항공 공장 -block.naval-factory.name = 해군 공장 +block.naval-factory.name = 해양 공장 block.additive-reconstructor.name = 첨가물 재구성기 block.multiplicative-reconstructor.name = 다중 재구성기 block.exponential-reconstructor.name = 지수 재구성기 block.tetrative-reconstructor.name = 정서 재구성기 -block.payload-conveyor.name = 매스 컨베이어 +block.payload-conveyor.name = 화물 컨베이어 block.payload-router.name = 화물 분배기 -block.disassembler.name = 분해기 +block.disassembler.name = 가속 분해기 block.silicon-crucible.name = 실리콘 도가니 -block.large-overdrive-projector.name = 대형 과부하 프로젝터 +block.overdrive-dome.name = 대형 과부하 프로젝터 + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = 파랑색 팀 team.crux.name = 빨강색 팀 team.sharded.name = 주황색 팀 @@ -1081,25 +1154,25 @@ tutorial.intro.mobile = [scarlet]Mindustry 튜토리얼[]을 시작하겠습니 tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로 아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다. tutorial.drill.mobile = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 밑에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n취소 버튼을 눌러 건축하기 전의 설계를 취소할 수 있습니다. 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]선 도구로 컨베이어 2개를 놓은 다음 아이템을 코어에 넣으세요. -tutorial.turret = 아이템이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 아이템이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 아이템(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\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]선 도구로 컨베이어 2개를 놓은 다음 자원을 코어에 넣으세요. +tutorial.turret = 자원이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 자원이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 자원(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요. tutorial.drillturret = 듀오 포탑은 사격하는데 [accent]구리 탄약[]이 필요합니다.\n포탑 근처에 드릴을 설치하세요.\n구리를 공급하기 위해 컨베이어를 포탑으로 가도록 건설하세요.\n\n[accnet]탄약 운반: 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.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블럭을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요. -tutorial.withdraw = 경우에 따라 블록에서 아이템을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]아이템이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]아이템[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요. -tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 아이템을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[]. +tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블록을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요. +tutorial.withdraw = 경우에 따라 블록에서 자원을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]자원이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]자원[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요. +tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 자원을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[]. tutorial.waves = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. [accent]클릭[]하여 사격할 수 있습니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.waves.mobile = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. 당신의 기체는 자동으로 적을 향해 사격합니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.launch = 특정 웨이브에 도달하면 [accent]코어로 출격[] 을 할 수 있습니다.\n\n이렇게 얻은 자원을 사용하여 새로운 기술을 연구 할 수 있습니다.\n\n[accent]출격 버튼을 누르세요. item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다. item.lead.description = 기본 초반 재료. 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다. -item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다. +item.metaglass.description = 초강력 방탄 유리. 액체 분배 및 저장에 광범위하게 사용됩니다. item.graphite.description = 탄약 및 전기 부품에 사용되는 무기질 탄소. item.sand.description = 제련에서 합금 또는 플럭스에서 광범위하게 사용되는 일반적인 재료. item.coal.description = 화석화된 식물 물질. 씨앗이 나오기 훨씬 전에 형성되었습니다. 연료 및 자원 생산에 광범위하게 사용됩니다. @@ -1110,15 +1183,15 @@ item.silicon.description = 매우 유용한 반도체. 복잡한 전자 장치 item.plastanium.description = 고급 기체 및 파편화 탄약에 사용되는 가볍고 연성이 있는 재료입니다. item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금. -item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 합성 포자 포드. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. -item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 포드 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. +item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. +item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. item.pyratite.description = 소이 무기에서 사용되는 매우 높은 가연성 물질. liquid.water.description = 가장 유용한 액체. 냉각기 및 폐기물 처리에 일반적으로 사용됩니다. liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아있습니다. 분리기를 이용해 다른 광물들로 분리하거나 탄약으로 사용해 적 부대를 향해 살포할 수 있습니다. liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다. liquid.cryofluid.description = 물과 티타늄으로 만든 비 부식성 액체. 열 용량이 매우 높으며 냉각수로 광범위하게 사용됩니다. -block.message.description = 메세지를 남깁니다. 같은 팀 간의 소통에 사용됩니다. +block.message.description = 메시지를 남깁니다. 같은 팀 간의 소통에 사용됩니다. block.graphite-press.description = 석탄 덩어리를 순수한 흑연으로 압축합니다. block.multi-press.description = 흑연 압축기의 강화 버전. 석탄을 빠르고 효율적으로 처리하기 위해 물과 전력을 사용합니다. block.silicon-smelter.description = 순수한 석탄과 모래로 실리콘을 생산합니다. @@ -1126,19 +1199,19 @@ block.kiln.description = 모래를 제련하여 강화 유리라고 알려진 block.plastanium-compressor.description = 석유와 티타늄으로 플라스터늄을 생산합니다. block.phase-weaver.description = 방사성 토륨과 모래에서 메타를 합성합니다. 작동하려면 엄청난 양의 전력이 필요합니다. block.alloy-smelter.description = 티타늄, 납, 실리콘, 구리를 결합하여 설금을 생산합니다. -block.cryofluidmixer.description = 물과 미세 티타늄 분말을 냉각수로 혼합합니다. 토륨 원자로 사용에 필수적입니다. -block.blast-mixer.description = 포자 클러스터를 파이라타이트와 분쇄하고 혼합하여 화합물을 만듭니다. +block.cryofluid-mixer.description = 물과 미세 티타늄 분말을 냉각수로 혼합합니다. 토륨 원자로 사용에 필수적입니다. +block.blast-mixer.description = 포자 클러스터를 파이라타이트와 분쇄하고 혼합하여 폭발물을 만듭니다. block.pyratite-mixer.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.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다. block.power-void.description = 입력된 모든 전력을 무효화합니다. 샌드박스 전용. block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용. -block.item-source.description = 아이템을 무한대로 출력합니다. 샌드박스 전용. -block.item-void.description = 모든 아이템을 파괴합니다. 샌드박스 전용. +block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용. +block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용. block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용. block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용. block.copper-wall.description = 저렴한 수비 블록.\n처음 몇 웨이브에서 코어와 포탑을 보호하는데 유용합니다. @@ -1162,17 +1235,17 @@ block.force-projector.description = 건물과 내부의 유닛을 공격으로 block.shock-mine.description = 지뢰를 밟고 있는 적에게 피해를 입힙니다. 적에게는 거의 보이지 않습니다. block.conveyor.description = 기본 자원 수송 레일. 자원을 배치된 방향을 따라 이동시켜 자동으로 건물에 넣어줍니다. 회전식. block.titanium-conveyor.description = 고급 자원 수송 레일. 기본 컨베이어보다 자원을 더 빨리 이동시킵니다. -block.plastanium-conveyor.description = 아이템을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 아이템을 받고 앞쪽에 세 방향으로 내보냅니다. +block.plastanium-conveyor.description = 자원을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 자원을 받고 앞쪽에 세 방향으로 내보냅니다. block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다리 역할을 합니다. 서로 다른 재료를 다른 장소로 운반하는 두 개의 다른 컨베이어의 상황에서 유용합니다. block.bridge-conveyor.description = 고급 자원 운송 블록. 지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. -block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 아이템을 순간이동 시킵니다. -block.sorter.description = 아이템을 정렬합니다. 아이템이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다. -block.inverted-sorter.description = 표준 분류기와 같은 아이템을 처리하지만, 대신 선택된 아이템을 측면으로 출력합니다. -block.router.description = 아이템을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오. -block.distributor.description = 고급 분배기. 아이템을 최대 7개의 다른 방향으로 동일하게 분할합니다. +block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 자원을 순간이동 시킵니다. +block.sorter.description = 자원을 정렬합니다. 자원이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다. +block.inverted-sorter.description = 표준 분류기와 같은 자원을 처리하지만, 대신 선택된 자원을 측면으로 출력합니다. +block.router.description = 자원을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오. +block.distributor.description = 고급 분배기. 자원을 최대 7개의 다른 방향으로 동일하게 분할합니다. block.overflow-gate.description = 전면 경로가 차단 된 경우에만 왼쪽과 오른쪽으로 출력됩니다. block.underflow-gate.description = 오버플로 게이트의 반대. 왼쪽 및 오른쪽 경로가 차단되면 전면으로 출력됩니다. -block.mass-driver.description = 최고의 아이템 운송 블록. 여러 아이템을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다. +block.mass-driver.description = 최고의 자원 운송 블록. 여러 자원을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다. block.mechanical-pump.description = 느린 속도로 액체를 퍼올리지만, 전력를 사용하지 않는 펌프입니다. block.rotary-pump.description = 고급 펌프. 더 많은 액체를 퍼올리지만, 전력이 필요합니다. block.thermal-pump.description = 가장 강력한 펌프. @@ -1192,27 +1265,27 @@ block.battery.description = 에너지가 넘쳐날 때 완충재로 전력을 block.battery-large.description = 일반 배터리보다 훨씬 더 많은 전력을 저장합니다. block.combustion-generator.description = 석탄과 같은 가연성 물질을 연소시켜 전력을 생산합니다. block.thermal-generator.description = 열이 있는 곳에 설치하면 전력이 생성됩니다. -block.turbine-generator.description = 고급 연소 발전기. 더 효율적이지만 증기를 생성하기 위해 물이 필요합니다. +block.steam-generator.description = 고급 연소 발전기. 더 효율적이지만 증기를 생성하기 위해 물이 필요합니다. block.differential-generator.description = 많은 양의 전력을 생성합니다. 냉각수와 불타는 파이라타이트의 온도 차이를 이용합니다. -block.rtg-generator.description = 간단하고 안정적인 발전기. 붕괴하는 방사성 화합물의 열을 이용하여 느린 속도로 전력을 생성합니다. +block.rtg-generator.description = 간단하고 안정적인 발전기. 붕괴하는 방사성 물질의 열을 이용하여 느린 속도로 전력을 생성합니다. block.solar-panel.description = 태양으로부터 소량의 전력을 생성합니다. block.solar-panel-large.description = 표준 태양 전지판보다 훨씬 더 효율적인 버전. block.thorium-reactor.description = 토륨으로부터 상당한 양의 전력을 생산합니다. 지속적인 냉각이 필요하며, 충분한 양의 냉각수가 공급되지 않으면 크게 폭발합니다. 전력 출력은 토륨의 양에 따라 달라집니다. block.impact-reactor.description = 최고 효율로 대량의 전력을 생산할 수 있는 고급 발전기. 프로세스를 시작하려면 상당한 전력 공급이 필요합니다. -block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 아이템을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. +block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 자원을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. block.pneumatic-drill.description = 티타늄을 채광할 수 있는 향상된 드릴. 기계식 드릴보다 더 빠른 속도로 채굴합니다. block.laser-drill.description = 레이저 기술을 통해 더욱 빠르게 드릴링 할 수 있지만 전력이 필요합니다. 토륨 채굴 가능. block.blast-drill.description = 최상위 드릴. 많은 양의 전력이 필요합니다. block.water-extractor.description = 지하수를 추출합니다. 지표수가 없는 곳에서 사용합니다. -block.cultivator.description = 대기 중의 작은 농도의 포자를 배양 가능한 포드로 배양합니다. +block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 버섯으로 배양합니다. block.oil-extractor.description = 석유를 추출하기 위해 많은 양의 전력과 모래 및 물을 사용합니다. block.core-shard.description = 코어 캡슐의 첫 번째 형태. 파괴되면 해당 지역과의 모든 연결이 끊어집니다. 이런 일이 일어나지 않도록 하십시오. block.core-foundation.description = 코어의 두 번째 버전. 더 나은 방어력과 자원을 저장합니다. block.core-nucleus.description = 코어 캡슐의 세 번째이자 마지막 형태입니다. 방어력이 매우 높고 대량의 자원을 저장할 수 있습니다. -block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 아이템을 빼낼 수 있습니다. -block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 아이템을 빼낼 수 있습니다. -block.unloader.description = 근처의 비 수송 블록에서 아이템을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다. -block.launch-pad.description = 코어 출격 없이도 아이템을 묶어 출격시킬 수 있습니다. +block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다. +block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다. +block.unloader.description = 근처의 비 수송 블록에서 자원을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다. +block.launch-pad.description = 코어 출격 없이도 자원을 묶어 출격시킬 수 있습니다. block.launch-pad-large.description = 출격 패드의 개선된 버전. 더 많은 자원을 저장하며 더 자주 출격합니다. block.duo.description = 작고 저렴한 포탑. 지상 유닛에 유용합니다. block.scatter.description = 필수 대공 포탑. 적군에게 납 덩어리, 고철, 또는 강화 유리 조각 덩어리를 뿌립니다. @@ -1228,5 +1301,5 @@ block.ripple.description = 매우 강력한 포병 포탑. 원거리에 있는 block.cyclone.description = 대공 및 대지 포탑. 근처 유닛에게 폭발성 덩어리를 발사합니다. block.spectre.description = 거대한 이중 배럴 대포. 공중 및 지상 목표물에 큰 관통 철갑탄을 발사합니다. block.meltdown.description = 거대한 레이저 대포. 근처의 적에게 지속적인 레이버 빔을 충전하여 발사합니다. 냉각수가 있어야 작동합니다. -block.repair-point.description = 주변에서 가장 가까운 유닛들을 지속적으로 치료합니다. +block.repair-point.description = 주변에서 가장 가까운 유닛을 지속적으로 치료합니다. block.segment.description = 날아오는 발사체를 요격합니다. 레이저는 목표 대상이 아닙니다. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 8316b54c06..a318c53f5f 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -20,6 +20,8 @@ gameover = Žaidimas Baigtas gameover.pvp = [accent] {0}[] komanda laimėjo! highscore = [accent]Naujas rekordas! copied = Nukopijuota. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Garsai load.map = Žemėlapiai @@ -63,8 +65,7 @@ stat.delivered = Paleisti resursai: stat.playtime = Žaidimo trukmė:[accent] {0} stat.rank = Finalinis laipsnis: [accent]{0} -launcheditems = [accent]Paleisti resursai -launchinfo = [unlaunched][[PALEISKITE] savo branduolį norint gauti resursus, kurie yra paryškinti mėlynai. +globalitems = [accent]Global Items map.delete = Ar esate tikri, jog norite ištrinti žemėlapį "[accent]{0}[]"? level.highscore = Rekordas: [accent]{0} level.select = Lygio pasirinkimas @@ -114,6 +115,7 @@ mod.disable = Išjungti mod.content = Tūrinys: mod.delete.error = Negalima ištrinti modifikacijos. Failas gali būti naudojamas. mod.requiresversion = [scarlet]Žemiausia privaloma žaidimo versija: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Trūkstamos priklausomybės: {0} mod.erroredcontent = [scarlet]Turinio klaidos. mod.errors = Įvyko klaida kraunant turinį. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Apie name = Vardas: noname = Pirma pasirinkite[accent] žaidėjo vardą[]. +planetmap = Planet Map +launchcore = Launch Core filename = Failo pavadinimas: unlocked = Atrakintas naujas turinys! completed = [accent]Išrasta @@ -144,6 +148,7 @@ techtree = Technologijų Medis research.list = [lightgray]Išradimai: research = Išrasti researched = [lightgray]{0} išrasta. +research.progress = {0}% complete players = {0} žaidėjai players.single = {0} žaidėjas players.search = ieškoti @@ -340,6 +345,11 @@ waves.load = Užkrauti iš iškarpinės waves.invalid = Klaidingos bangos iš iškarpinės. waves.copied = Bangos nukopijuotos. waves.none = Nėra nustatyta jokių priešų.\nĮsiminkite, jog tušti bangų maketai bus pakeisti numatytuoju maketu. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detaliau... edit = Redaguoti... @@ -459,7 +469,8 @@ locked = Užrakinta complete = [lightgray]Įvykdyta: requirement.wave = Pasiekite {0} zonoje {1} requirement.core = Sunaikinkite priešų branduolį zonoje {0} -requirement.unlock = Atrakinti {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Pratęsti zoną:\n[lightgray]{0} bestwave = [lightgray]Bangos rekordas: {0} launch = < PALEISTI > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Uždrausti blokai addall = Pridėti visus +launch.destination = Destination: {0} configure.invalid = Kiekis turi būti numeris tarp 0 ir {0}. zone.unlocked = [lightgray]{0} atrakinta. zone.requirement.complete = Rekalavimai {0} įvykdyti:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Tinklo I/O klaida. error.any = Nžinoma tinklo klaida. error.bloom = Nepavyko inicijuoti spindėjimo.\nJūsų įrenginys gali nepalaikyti šios funkcijos. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafikos settings.cleardata = Išvalyti žaidimo duomenis... settings.clear.confirm = Ar tikrai norite ištrinti šiuos duomenis?\nTai negali būti atkurta! settings.clearall.confirm = [scarlet]ĮSPĖJIMAS![]\nTai ištrins visus duomenis, įskaitant išsaugojimus, žemėlapius, atrakinimus ir mygtukų pakeitimus.\nVos paspaudus 'gerai' žaidimas ištrins visus duomenis ir išsijungs. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Sustabdyta > clear = Išvalyti banned = [scarlet]Užblokuota @@ -557,8 +585,11 @@ blocks.itemsmoved = Judėjimo Greitis blocks.launchtime = Laikas Tarp Paleidimų blocks.shootrange = Atstumas blocks.size = Dydis +blocks.displaysize = Display Size blocks.liquidcapacity = Skysčių Talpumas blocks.powerrange = Energijos Skleidimo Atstumas +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maks. Jungčių Kiekis blocks.poweruse = Energijos Suvartojimas blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Pastiprinimo Efektas blocks.maxunits = Maks. Aktyvių Vienetų Kiekis blocks.health = Gyvybės blocks.buildtime = Statymo Laikas +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Statymo Kaina blocks.inaccuracy = Netikslumas blocks.shots = Šūviai blocks.reload = Šūviai per sekundę blocks.ammo = Šoviniai +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Privalomas Geresnis Grąžtas bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = skysčio vienetai unit.powerunits = energijos vienetai unit.degrees = laipsnių unit.seconds = sekundės +unit.minutes = mins unit.persecond = /sek. +unit.perminute = /min unit.timesspeed = x greičio unit.percent = % +unit.shieldhealth = shield health unit.items = daiktai unit.thousands = k unit.millions = mil +unit.billions = b category.general = Bendra category.power = Energija category.liquids = Skysčiai @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Pulti command.rally = Susitelkti command.retreat = Atsitraukti +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Įjungti/Išjungti Blokų Statusus keybind.move_x.name = Judėjimas X ašimi keybind.move_y.name = Judėjimas Y ašimi keybind.mouse_move.name = Sekti Pelę +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Pasirinkite Regioną keybind.schematic_menu.name = Schemų Meniu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Įstrižas Padėjimas keybind.pick.name = Pasirinkti Bloką keybind.break_block.name = Išgriauti Bloką keybind.deselect.name = Panaikinti Pasirinkimą +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Šauti keybind.zoom.name = Keisti Vaizdo Mastelį keybind.menu.name = Meniu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reaktorių Sprogimai rules.wavetimer = Bangų Laikmatis rules.waves = Bangos rules.attack = Puolimo Režimas +rules.buildai = AI Building rules.enemyCheat = Neriboti Kompiuterio (Raudonosios Komandos) Resursai rules.blockhealthmultiplier = Blokų Gyvybių Daugiklis rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Vienetai rules.title.experimental = Eksperimentinis rules.title.environment = Environment rules.lighting = Apšvietimas +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Aplinkos Šviesa -rules.solarpowermultiplier = Saulės Energijos Daugiklis +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Daiktai content.liquid.name = Skysčiai @@ -830,9 +878,11 @@ liquid.water.name = Vanduo liquid.slag.name = Šlakas liquid.oil.name = Nafta liquid.cryofluid.name = Krio Skystis + item.explosiveness = [lightgray]Sprogstamumas: {0}% item.flammability = [lightgray]Degumas: {0}% item.radioactivity = [lightgray]Radioaktyvumas: {0}% + unit.health = [lightgray]Gyvybės: {0} unit.speed = [lightgray]Greitis: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Smėlio Riedulys block.grass.name = Žolė block.slag.name = Slag block.salt.name = Druska -block.saltrocks.name = Druskos Akmenys +block.salt-wall.name = Salt Wall block.pebbles.name = Akmenukai block.tendrils.name = Tendrilės -block.sandrocks.name = Smėlėtos Uolienos +block.sand-wall.name = Sand Wall block.spore-pine.name = Sporinė Pušis -block.sporerocks.name = Sporinės Uolienos -block.rock.name = Uolienos -block.snowrock.name = Sniego Uolienos +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snieginė Pušis block.shale.name = Skalūnas block.shale-boulder.name = Skalūno Riedulys block.moss.name = Samanos block.shrubs.name = Krūmai block.spore-moss.name = Sporų Samanos -block.shalerocks.name = Skalūno Uolienos +block.shale-wall.name = Shale Wall block.scrap-wall.name = Laužo Siena block.scrap-wall-large.name = Didelė Laužo Siena block.scrap-wall-huge.name = Didžiulė Laužo Siena @@ -919,13 +979,17 @@ block.craters.name = Krateriai block.sand-water.name = Smėlio vanduo block.darksand-water.name = Tamsaus Smėlio Vanduo block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ledinis Sniegas -block.rocks.name = Uolienos -block.icerocks.name = Ledo Uolienos -block.snowrocks.name = Sniego Uolienos -block.dunerocks.name = Kopų Uolienos +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pušis +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Baltas Medis, Miręs block.white-tree.name = Baltas Medis block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Tamsioji Plokštė 4 block.dark-panel-5.name = Tamsioji Plokštė 5 block.dark-panel-6.name = Tamsioji Plokštė 6 block.dark-metal.name = Tamsusis Metalas -block.ignarock.name = Igna Uoliena +block.basalt.name = Basalt block.hotrock.name = Karštoji Uoliena block.magmarock.name = Magmos Uoliena -block.cliffs.name = Uolos block.copper-wall.name = Vario Siena block.copper-wall-large.name = Didelė Vario Siena block.titanium-wall.name = Titano Siena @@ -980,7 +1043,7 @@ block.underflow-gate.name = Neperpildymo Užtvara block.silicon-smelter.name = Silicio Lydykla block.phase-weaver.name = Fazinė Audykla block.pulverizer.name = Pulverizatorius -block.cryofluidmixer.name = Krio Skysčio Maišytojas +block.cryofluid-mixer.name = Krio Skysčio Maišytojas block.melter.name = Lydytuvas block.incinerator.name = Deginimo krosnis block.spore-press.name = Sporų Presas @@ -993,7 +1056,7 @@ block.diode.name = Baterijos Diodas block.battery.name = Baterija block.battery-large.name = Didelė Baterija block.combustion-generator.name = Vidaus Degimo Generatorius -block.turbine-generator.name = Garų Generatorius +block.steam-generator.name = Garų Generatorius block.differential-generator.name = Diferencialinis Generatorius block.impact-reactor.name = Smūginis Reaktorius block.mechanical-drill.name = Mechaninis Grąžtas @@ -1055,6 +1118,7 @@ block.container.name = Talpykla block.launch-pad.name = Paleidimo Aikštelė block.launch-pad-large.name = Didelė Paleidimo Aikštelė block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = mėlyna team.crux.name = raudona team.sharded.name = oranžinė @@ -1126,7 +1199,7 @@ block.kiln.description = Sulydo smėlį ir stiklą į junginį žinomą kaip met block.plastanium-compressor.description = Gamina plastaniumą iš naftos ir titano. block.phase-weaver.description = Susintetina fazinį audinį iš radioaktyvaus torio ir smėlio. Veikimui reikalingas didžiulis kiekis energijos. block.alloy-smelter.description = Sumaišo titaną, šviną, silicį ir varį į viršįtampį lydinį. -block.cryofluidmixer.description = Maišo vandenį ir smulkias titano dulkes į krio skystį. Būtinas torio reaktoriaus naudojimui. +block.cryofluid-mixer.description = Maišo vandenį ir smulkias titano dulkes į krio skystį. Būtinas torio reaktoriaus naudojimui. block.blast-mixer.description = Susmulkina ir sumaišo sporas su piratitu ir pagamina sprogųjį junginį. block.pyratite-mixer.description = Sumaišo anglį, šviną ir smėlį į itin degų piratitą. block.melter.description = Išlydo metalo laužą į šlaką tolesniam apdorojimui arba naudojimui wave bokštuose. @@ -1192,7 +1265,7 @@ block.battery.description = Laiko enegiją kaip buferis, kai reikalinga papildom block.battery-large.description = Laiko daugiau energijos negu paprasta baterija. block.combustion-generator.description = Gamina energiją degindamas degias medžiagas kaip anglis. block.thermal-generator.description = Gamina energiją, kai pastatytas karštose vietose. -block.turbine-generator.description = Pažangesnis vidaus degimo generatorius. Efektyvesnis, bet papildomai reikalauja vandens sukurti garams. +block.steam-generator.description = Pažangesnis vidaus degimo generatorius. Efektyvesnis, bet papildomai reikalauja vandens sukurti garams. block.differential-generator.description = Gamina didelį kiekį energijos. Pasitelkia temperatūrų skirtumą tarp krio skysčio ir degančio piratito. block.rtg-generator.description = Paprastas, patikimas generatorius. Naudoja yrančių junginių karštį energijos gamybai. block.solar-panel.description = Suteikia mažą kiekį energijos iš saulės. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 88fba3f8f5..634b6eb00e 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -20,6 +20,8 @@ gameover = Spel afgelopen gameover.pvp = het[accent] {0}[] team heeft gewonnen! highscore = [accent]Nieuw topscore! copied = Gekopieerd. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Geluid load.map = Kaarten @@ -63,8 +65,7 @@ stat.delivered = Middelen Gelanceerd: stat.playtime = Time Played:[accent] {0} stat.rank = Eindrang: [accent]{0} -launcheditems = [accent]Gelanceerde items -launchinfo = [unlaunched][[LANCEER] je core om de in blauw gekleurde items te krijgen. +globalitems = [accent]Global Items map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"? level.highscore = Topscore: [accent]{0} level.select = Selecteer Level @@ -114,6 +115,7 @@ mod.disable = Deactiveer mod.content = Content: mod.delete.error = Mod verwijderen mislukt. Bestand mogelijk in gebruik. mod.requiresversion = [scarlet]Vereist minimaal mindustry versie: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missende benodigdheden: {0} mod.erroredcontent = [scarlet]Inhoud Fouten mod.errors = Er hebben zich fouten voordaan tijdens het laden van de inhoud. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Over name = Naam: noname = Maak eerst een[accent] Speler naam[]. +planetmap = Planet Map +launchcore = Launch Core filename = Bestandsnaam: unlocked = Nieuwe inhoud ontgrendeld! completed = [accent]Voltooid @@ -144,6 +148,7 @@ techtree = Tech boom research.list = [lightgray]Onderzoek: research = Onderzoek researched = [lightgray]{0} Onderzocht. +research.progress = {0}% complete players = {0} Spelers online players.single = {0} Speler online players.search = search @@ -340,6 +345,11 @@ 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. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Bewerk... @@ -459,7 +469,8 @@ locked = Op slot complete = [lightgray]Voltooid: requirement.wave = Berijk ronde {0} in {1} requirement.core = Vernietig vijandige core in {0} -requirement.unlock = Ontgrendel: {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Hervat zone:\n[lightgray]{0} bestwave = [lightgray]Beste ronde: {0} launch = < LANCEER > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Verboden Blokken addall = Voeg Alles Toe +launch.destination = Destination: {0} configure.invalid = Hoeveelheid moet een getal zijn tussen 0 en {0}. zone.unlocked = [lightgray]{0} vrijgespeeld. zone.requirement.complete = Ronde {0} berijkt:\n{1} zone vrijgespeeld. @@ -496,6 +508,20 @@ error.io = Netwerk I/O fout. error.any = Onbekende netwerk fout. error.bloom = Bloom aanzetten mislukt.\nJe apparaat ondersteunt het waarschijnlijk niet. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ 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 data, inclusief saves, kaarten, technologie en bedienings-instellingen.\nAls je op doorgaat wist het spel al je data en stopt automatisch. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Gepauzeerd > clear = Wis banned = [scarlet]Verbannen @@ -557,8 +585,11 @@ blocks.itemsmoved = Beweegingssnelheid blocks.launchtime = Tijd tussen lanceringen blocks.shootrange = Bereik blocks.size = Formaat +blocks.displaysize = Display Size blocks.liquidcapacity = Vloeistofcapaciteit blocks.powerrange = Stroombereik +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maximale Hoeveelheid Connecties blocks.poweruse = Stroomverbruik blocks.powerdamage = Stroom/Schade @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Maximaal Actieve Units blocks.health = Levenspunten blocks.buildtime = Bouwtijd +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Bouwkosten blocks.inaccuracy = Onnauwkeurigheid blocks.shots = Shoten blocks.reload = Schoten/Seconde blocks.ammo = Ammunitie +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Betere miner nodig bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = vloeistofeenheid unit.powerunits = stroomeenheid unit.degrees = graden unit.seconds = secondes +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x snelheid unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil +unit.billions = b category.general = Algemeen category.power = Stroom category.liquids = Vloeisof @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Val aan command.rally = Groepeer command.retreat = Terugtrekken +command.idle = Idle placement.blockselectkeys = \n[lightgray]Toets: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Beweeg x keybind.move_y.name = Beweeg y keybind.mouse_move.name = Volg Muis +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Selecteer gebied keybind.schematic_menu.name = Ontwerp Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Plaats Diagonaal keybind.pick.name = Kies Blok keybind.break_block.name = Breek Blok keybind.deselect.name = Deselecteer +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Schiet keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Ontploffende Reactors rules.wavetimer = Ronde timer rules.waves = Rondes rules.attack = Aanval modus +rules.buildai = AI Building rules.enemyCheat = Oneindige AI grondstoffen rules.blockhealthmultiplier = Blok Health Vermenigvulder rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimenteel rules.title.environment = Environment rules.lighting = Belichting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Mist -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Vloeisof @@ -830,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Olie liquid.cryofluid.name = Koelvloeistof + item.explosiveness = [lightgray]Explosivieit: {0}% item.flammability = [lightgray]Vlambaarheid: {0}% item.radioactivity = [lightgray]Radioactiviteit: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Snelheid: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Kruiper unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Zandkei block.grass.name = Gras block.slag.name = Slag block.salt.name = Zout -block.saltrocks.name = Zoutsteen +block.salt-wall.name = Salt Wall block.pebbles.name = Steentjes block.tendrils.name = Tendrils -block.sandrocks.name = Zandsteen +block.sand-wall.name = Sand Wall block.spore-pine.name = Sporenden -block.sporerocks.name = Schimmelsteen -block.rock.name = Steen -block.snowrock.name = Sneeuwsteen +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Sneeuwden block.shale.name = Schalie block.shale-boulder.name = Schalie Kei block.moss.name = Mos block.shrubs.name = Bosje block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Steens +block.shale-wall.name = Shale Wall block.scrap-wall.name = Oud ijzeren m block.scrap-wall-large.name = Large Scrap Muur block.scrap-wall-huge.name = Huge Scrap Muur @@ -919,13 +979,17 @@ 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.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Stenen -block.icerocks.name = Ijs Stenen -block.snowrocks.name = Snow Steens -block.dunerocks.name = Dune Steens +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Den +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Witte Boom Dood block.white-tree.name = Witte Boom block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ 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.basalt.name = Basalt block.hotrock.name = Lava Steen block.magmarock.name = Magma Steen -block.cliffs.name = Rotswand block.copper-wall.name = Koperen Muur block.copper-wall-large.name = Grote Koperen Muur block.titanium-wall.name = Titanium Muur @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Siliciumsmelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Vermorzelaar -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Smelter block.incinerator.name = Verbrandingsoven block.spore-press.name = Schimmelpers @@ -993,7 +1056,7 @@ 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.steam-generator.name = Turbine Generator block.differential-generator.name = Verschiltemperatuurgenerator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanische Boor @@ -1055,6 +1118,7 @@ block.container.name = Doos block.launch-pad.name = Lanceerplatform block.launch-pad-large.name = Groot Lanceerplatform block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blauw team.crux.name = rood team.sharded.name = oranje @@ -1126,7 +1199,7 @@ block.kiln.description = Smelts sand and lead into metaglass. Requires small amo block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. +block.cryofluid-mixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in turrets. @@ -1192,7 +1265,7 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.steam-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Genereert een klein beetje zonne-energie. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index e643b1d553..ce59b257f7 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -20,6 +20,8 @@ gameover = Game Over gameover.pvp = Het[accent] {0}[] team heeft gewonnen! highscore = [accent]Nieuw record! copied = Gekopieerd. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Geluiden load.map = Kaarten @@ -63,8 +65,7 @@ stat.delivered = Gronstoffen meegenomen: stat.playtime = Time Played:[accent] {0} stat.rank = Eindresultaat: [accent]{0} -launcheditems = [accent]Meegenomen grondstoffen -launchinfo = [unlaunched][[LAUNCH] je kern om de met blauw aangeduide voorwerpen te verkrijgen. +globalitems = [accent]Global Items map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen? level.highscore = Beste score: [accent]{0} level.select = Selecteer level @@ -114,6 +115,7 @@ mod.disable = Schakel uit mod.content = Content: mod.delete.error = Kan mod niet verwijderen. Bestand is mogelijk in gebruik. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Over name = Naam: noname = Kies eerst[accent] een naam[]. +planetmap = Planet Map +launchcore = Launch Core filename = Bestandsnaam: unlocked = Ontgrendeld! completed = [accent]Voltooid @@ -144,6 +148,7 @@ techtree = Technische vooruitgang research.list = [lightgray]Onderzoek: research = Onderzoek researched = [lightgray]{0} onderzocht. +research.progress = {0}% complete players = {0} spelers online players.single = {0} speler online players.search = search @@ -340,6 +345,11 @@ 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. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Edit... @@ -459,7 +469,8 @@ locked = Locked complete = [lightgray]Reach: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} launch = < LAUNCH > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {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. @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ 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.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil +unit.billions = b category.general = General category.power = Power category.liquids = Liquids @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move x keybind.move_y.name = Move y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids @@ -830,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Speed: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall 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.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ 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.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Melter block.incinerator.name = Incinerator block.spore-press.name = Spore Press @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Turbine Generator +block.steam-generator.name = Turbine Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1126,7 +1199,7 @@ block.kiln.description = Smelts sand and lead into metaglass. Requires small amo block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. +block.cryofluid-mixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in turrets. @@ -1192,7 +1265,7 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.steam-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index a8d15895b9..f0c67c6a88 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -20,6 +20,8 @@ gameover = Koniec Gry gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! highscore = [accent] Nowy rekord! copied = Skopiowano. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Dźwięki load.map = Mapy @@ -63,8 +65,7 @@ stat.delivered = Surowce wystrzelone: stat.playtime = Czas Gry:[accent] {0} stat.rank = Ocena: [accent]{0} -launcheditems = [accent]Wystrzelone przedmioty -launchinfo = [unlaunched][[WYSTRZEL] rdzeń aby uzyskać przedmioty oznaczone na niebiesko. +globalitems = [accent]Global Items map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} level.select = Wybrany poziom @@ -114,6 +115,7 @@ mod.disable = Wyłącz mod.content = Content: 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.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Brakujące zależności: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Wystąpił błąd podczas ładowania treści. @@ -137,6 +139,8 @@ mod.scripts.disable = Twoje urządzenie nie wspiera modów ze skryptami. Musisz about.button = O Grze name = Nazwa: noname = Najpierw wybierz[accent] nazwę gracza[]. +planetmap = Planet Map +launchcore = Launch Core filename = Nazwa Pliku: unlocked = Odblokowano nową zawartość! completed = [accent]Ukończony @@ -144,6 +148,7 @@ techtree = Drzewo Technologiczne research.list = [lightgray]Badania: research = Badaj researched = [lightgray]{0} zbadane. +research.progress = {0}% complete players = {0} graczy players.single = {0} gracz players.search = search @@ -340,6 +345,11 @@ waves.load = Załaduj Ze Schowka waves.invalid = Nieprawidłowe fale w schowku. waves.copied = Fale zostały skopiowane. waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detale... edit = Edytuj... @@ -459,7 +469,8 @@ locked = Zablokowane complete = [lightgray]Ukończone: requirement.wave = Osiągnij falę {0} w {1} requirement.core = Zniszcz Rdzeń wroga w {0} -requirement.unlock = Odblokuj {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Kontynuuj Strefę:\n[lightgray]{0} bestwave = [lightgray]Najwyższa fala: {0} launch = < WYSTRZEL > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Zabronione bloki addall = Dodaj wszystkie +launch.destination = Destination: {0} configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. zone.unlocked = [lightgray]Strefa {0} odblokowana. zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione. @@ -496,6 +508,20 @@ error.io = Błąd sieciowy I/O. error.any = Nieznany błąd sieci. error.bloom = Nie udało się załadować bloom.\nTwoje urządzenie może nie wspierać tej funkcji. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Punkt Zerowy sector.craters.name = Kratery sector.frozenForest.name = Zamrożony Las @@ -510,7 +536,6 @@ sector.fungalPass.name = Grzybowa Przełęcz sector.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej. sector.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy. -sector.desertWastes.description = Te pustkowia są rozległe, nieprzewidywalne, i znajdują się na nich opuszczone struktury.\nWęgiel jest obecny w tym regionie. Użyj go do produkcji energii, lub do stworzenia grafitu.\n\n[lightgray]Miejsce lądowania nie jest pewne. sector.saltFlats.description = Na obrzeżach pustyni spoczywają Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdżeń. Zniszcz wszystko co stanie ci na drodze. sector.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić sector.ruinousShores.description = Za pustkowiami ciągnie się linia brzegowa. Kiedyś znajdowała się tu przybrzeżna linia obronna. Niewiele z niej zostało. Ostały się tylko podstawowe struktury obronne, z reszty został tylko złom.\nKontynuuj eksploracje. Odkryj pozostawioną tu technologię. @@ -533,6 +558,8 @@ settings.graphics = Grafika settings.cleardata = Wyczyść Dane Gry... settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu! settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Wstrzymano > clear = Wyczyść banned = [scarlet]Zbanowano @@ -558,8 +585,11 @@ blocks.itemsmoved = Prędkość poruszania się blocks.launchtime = Czas pomiędzy wystrzeleniami blocks.shootrange = Zasięg blocks.size = Rozmiar +blocks.displaysize = Display Size blocks.liquidcapacity = Pojemność cieczy blocks.powerrange = Zakres mocy +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maksymalna ilość połączeń blocks.poweruse = Zużycie prądu blocks.powerdamage = Moc/Zniszczenia @@ -575,11 +605,14 @@ blocks.boosteffect = Efekt wzmocnienia blocks.maxunits = Maksymalna ilość jednostek blocks.health = Zdrowie blocks.buildtime = Czas budowy +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Koszt budowy blocks.inaccuracy = Niecelność blocks.shots = Strzały blocks.reload = Strzałów/sekundę blocks.ammo = Amunicja +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Wymagane Lepsze Wiertło bar.noresources = Missing Resources @@ -622,12 +655,16 @@ unit.liquidunits = jednostek płynu unit.powerunits = jednostek prądu unit.degrees = stopnie unit.seconds = sekundy +unit.minutes = mins unit.persecond = /sekundę +unit.perminute = /min unit.timesspeed = x prędkość unit.percent = % +unit.shieldhealth = shield health unit.items = przedmioty unit.thousands = tys. unit.millions = mln +unit.billions = b category.general = Główne category.power = Prąd category.liquids = Płyny @@ -710,6 +747,7 @@ category.blocks.name = Block Select command.attack = Atakuj command.rally = Zbierz command.retreat = Wycofaj +command.idle = Idle placement.blockselectkeys = \n[lightgray]Klawisz: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -722,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Poruszanie w poziomie keybind.move_y.name = Poruszanie w pionie keybind.mouse_move.name = Podążaj Za Myszą +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Wybierz region keybind.schematic_menu.name = Menu schematów @@ -749,6 +788,9 @@ keybind.diagonal_placement.name = Budowa po skosie keybind.pick.name = Wybierz Blok keybind.break_block.name = Zniszcz Blok keybind.deselect.name = Odznacz +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Strzelanie keybind.zoom.name = Przybliżanie keybind.menu.name = Menu @@ -783,6 +825,7 @@ rules.reactorexplosions = Eksplozje reaktorów rules.wavetimer = Zegar fal rules.waves = Fale rules.attack = Tryb ataku +rules.buildai = AI Building rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu) rules.blockhealthmultiplier = Mnożnik życia bloków rules.blockdamagemultiplier = Block Damage Multiplier @@ -804,8 +847,12 @@ rules.title.unit = Jednostki rules.title.experimental = Eksperymentalne rules.title.environment = Environment rules.lighting = Oświetlenie +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Otaczające Światło -rules.solarpowermultiplier = Mnożnik Energii Słonecznej +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Przedmioty content.liquid.name = Płyny @@ -831,9 +878,11 @@ liquid.water.name = Woda liquid.slag.name = Żużel liquid.oil.name = Ropa liquid.cryofluid.name = Lodociecz + item.explosiveness = [lightgray]Wybuchowość: {0} item.flammability = [lightgray]Palność: {0} item.radioactivity = [lightgray]Promieniotwórczość: {0} + unit.health = [lightgray]Zdrowie: {0} unit.speed = [lightgray]Prędkość: {0} unit.weapon = [lightgray]Broń: {0} @@ -857,6 +906,7 @@ unit.crawler.name = Pełzak unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Błysk unit.horizon.name = Horyzont unit.zenith.name = Zenit @@ -865,34 +915,43 @@ unit.eclipse.name = Zaćmienie unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Klif block.sand-boulder.name = Piaskowy Głaz block.grass.name = Trawa block.slag.name = Żużel block.salt.name = Sól -block.saltrocks.name = Skały Solne +block.salt-wall.name = Salt Wall block.pebbles.name = Kamyki block.tendrils.name = Wić -block.sandrocks.name = Skały Piaskowe +block.sand-wall.name = Sand Wall block.spore-pine.name = Sosna Zarodnikowa -block.sporerocks.name = Skała Zarodnikowa -block.rock.name = Skały -block.snowrock.name = Skały śnieżne +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Sosna śniegowa block.shale.name = Łupek block.shale-boulder.name = Głaz Łupkowy block.moss.name = Mech block.shrubs.name = Krzewy block.spore-moss.name = Mech Zarodnikowy -block.shalerocks.name = Skały Łupkowe +block.shale-wall.name = Shale Wall block.scrap-wall.name = Ściana ze Złomu block.scrap-wall-large.name = Duża Ściana ze Złomu block.scrap-wall-huge.name = Ogromna Ściana ze Złomu @@ -920,13 +979,17 @@ block.craters.name = Kratery block.sand-water.name = Woda z Piaskiem block.darksand-water.name = Woda z Ciemnym Piaskiem block.char.name = Popiół -block.holostone.name = Błyszczący kamień +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Lodowy Śnieg -block.rocks.name = Skały -block.icerocks.name = Lodowe skały -block.snowrocks.name = Śnieżne Skały -block.dunerocks.name = Skały wydmowe +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Sosna +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Białe Drzewo Martwe block.white-tree.name = Białe Drzewo block.spore-cluster.name = Skupisko Zarodników @@ -942,10 +1005,9 @@ block.dark-panel-4.name = Ciemny Panel 4 block.dark-panel-5.name = Ciemny Panel 5 block.dark-panel-6.name = Ciemny Panel 6 block.dark-metal.name = Ciemny Metal -block.ignarock.name = Skała Wulkaniczna +block.basalt.name = Basalt block.hotrock.name = Gorący Kamień block.magmarock.name = Skała magmowa -block.cliffs.name = Klify block.copper-wall.name = Miedziana Ściana block.copper-wall-large.name = Duża Miedziana Ściana block.titanium-wall.name = Tytanowa Ściana @@ -981,7 +1043,7 @@ block.underflow-gate.name = Brama Niedomiaru block.silicon-smelter.name = Huta Krzemu block.phase-weaver.name = Fazowa Fabryka block.pulverizer.name = Rozkruszacz -block.cryofluidmixer.name = Mieszacz Lodocieczy +block.cryofluid-mixer.name = Mieszacz Lodocieczy block.melter.name = Przetapiacz block.incinerator.name = Spalacz block.spore-press.name = Prasa Zarodników @@ -994,7 +1056,7 @@ block.diode.name = Dioda baterii block.battery.name = Bateria block.battery-large.name = Duża Bateria block.combustion-generator.name = Generator Spalinowy -block.turbine-generator.name = Generator Parowy +block.steam-generator.name = Generator Parowy block.differential-generator.name = Generator Różnicowy block.impact-reactor.name = Reaktor Uderzeniowy block.mechanical-drill.name = Wiertło Mechaniczne @@ -1056,6 +1118,7 @@ block.container.name = Kontener block.launch-pad.name = Wyrzutnia block.launch-pad-large.name = Duża Wyrzutnia block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Fabryka Naziemna block.air-factory.name = Fabryka Powietrzna block.naval-factory.name = Fabryka Morska @@ -1068,6 +1131,15 @@ block.payload-router.name = Rozdzielacz Ładunku block.disassembler.name = Dezasembler block.silicon-crucible.name = Silicon Crucible block.overdrive-dome.name = Kopuła Pola Overdrive + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = niebieski team.crux.name = czerwony team.sharded.name = żółty @@ -1127,7 +1199,7 @@ block.kiln.description = Stapia ołów i piasek na metaszkło. Wymaga małej ilo block.plastanium-compressor.description = Wytwarza plastan z oleju i tytanu. block.phase-weaver.description = Produkuje Włókna Fazowe z radioaktywnego toru i dużych ilości piasku. block.alloy-smelter.description = Produkuje stop Elektrum z tytanu, ołowiu, krzemu i miedzi. -block.cryofluidmixer.description = Łączy wodę i tytan w lodociecz, który jest znacznie bardziej wydajny w chłodzeniu niż woda. +block.cryofluid-mixer.description = Łączy wodę i tytan w lodociecz, który jest znacznie bardziej wydajny w chłodzeniu niż woda. block.blast-mixer.description = Kruszy i miesza skupiska zarodników z piratytem, tworząc związek wybuchowy. block.pyratite-mixer.description = Miesza węgiel, ołów i piasek tworząc bardzo łatwopalny piratian. block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach @@ -1193,7 +1265,7 @@ block.battery.description = Przechowuje energię przy nadwyżce produkcji oraz d block.battery-large.description = Przechowuje o wiele wiecej prądu niż standardowa bateria. block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów. block.thermal-generator.description = Generuje prąd kiedy jest postawiony na źródłach ciepła. -block.turbine-generator.description = Zaawansowana wersja Generatora Spalinowego. Jest wydajniejszy niż Generator Spalinowy, ale wymaga wody do generowania pary. +block.steam-generator.description = Zaawansowana wersja Generatora Spalinowego. Jest wydajniejszy niż Generator Spalinowy, ale wymaga wody do generowania pary. block.differential-generator.description = Generuje duże ilości prądu. Wykorzystuje różnice temperatur pomiędzy Lodocieczą a spalanym Piratianem. block.rtg-generator.description = Prosty, niezawodny generator. Wykorzystuje ciepło powstałe z rozpadu izotopów promieniotwórczych. Nie wymaga chłodzenia, ale produkuje mniej energii od reaktora torowego. block.solar-panel.description = Wytwarza małe ilości prądu wykorzystując energię słoneczną. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 64d54a3d5d..7754faa059 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -20,6 +20,8 @@ gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [accent]Novo recorde! copied = Copiado +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sons load.map = Mapas @@ -63,8 +65,7 @@ stat.delivered = Recursos lançados: stat.playtime = Tempo jogado:[accent] {0} stat.rank = Classificação final: [accent]{0} -launcheditems = [accent]Itens lançados -launchinfo = [unlaunched][[LANCE] seu núcleo para obter os itens indicados em azul. +globalitems = [accent]Global Items map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de fase @@ -114,6 +115,7 @@ mod.disable = Desati-\nvar mod.content = Content: mod.delete.error = Incapaz de deletar o mod. O arquivo talvez esteja em uso. mod.requiresversion = [scarlet]Requer no mínimo versão [accent]{0} [scarlet]do jogo. +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dependências ausentes: {0} mod.erroredcontent = [scarlet]Erros no conteúdo mod.errors = Ocorreram erros ao carregar o conteúdo. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. +planetmap = Planet Map +launchcore = Launch Core filename = Nome do arquivo: unlocked = Novo bloco desbloqueado! completed = [accent]Completado @@ -144,6 +148,7 @@ techtree = Árvore Tecnológica research.list = [lightgray]Pesquise: research = Pesquisar researched = [lightgray]{0} Pesquisado. +research.progress = {0}% complete players = {0} Jogadores ativos players.single = {0} Jogador ativo players.search = Procurar @@ -340,6 +345,11 @@ waves.load = Carregar da área de transferência waves.invalid = Hordas inválidas na área de transferência. waves.copied = Hordas copiadas. waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detalhes... edit = Editar... @@ -459,7 +469,8 @@ locked = Trancado complete = [lightgray]Completo: requirement.wave = Alcançar a Horda {0} em {1} requirement.core = Destruir o núcleo inimigo em {0} -requirement.unlock = Desbloquear {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resumir Zona:\n[lightgray]{0} bestwave = [lightgray]Melhor: {0} launch = Lançar @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Blocos Banidos addall = Adicionar Todos +launch.destination = Destination: {0} configure.invalid = A quantidade deve ser um número entre 0 e {0}. zone.unlocked = [lightgray]{0} Desbloqueado. zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. @@ -496,6 +508,20 @@ error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. error.bloom = Falha ao inicializar bloom.\nSeu dispositivo talvez não o suporte. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Gráficos 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. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = Pausado clear = Limpo banned = [scarlet]BANIDO @@ -557,8 +585,11 @@ blocks.itemsmoved = Velocidade de movimento blocks.launchtime = Tempo entre Disparos. blocks.shootrange = Alcance blocks.size = Tamanho +blocks.displaysize = Display Size blocks.liquidcapacity = Capacidade de Líquido blocks.powerrange = Alcance da Energia +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Conexões Máximas blocks.poweruse = Uso de energia blocks.powerdamage = Dano/Poder @@ -574,11 +605,14 @@ blocks.boosteffect = Efeito do Impulso blocks.maxunits = Máximo de unidades ativas blocks.health = Saúde blocks.buildtime = Tempo de construção +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Custo de construção blocks.inaccuracy = Imprecisão blocks.shots = Tiros blocks.reload = Tiros por segundo blocks.ammo = Munição +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Broca melhor necessária. bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = unidades de liquido unit.powerunits = unidades de energia unit.degrees = Graus unit.seconds = segundos +unit.minutes = mins unit.persecond = por segundo +unit.perminute = /min unit.timesspeed = x Velocidade unit.percent = % +unit.shieldhealth = shield health unit.items = itens unit.thousands = k unit.millions = m +unit.billions = b category.general = Geral category.power = Energia category.liquids = Líquidos @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Atacar command.rally = Reunir command.retreat = Recuar +command.idle = Idle placement.blockselectkeys = \n[lightgray]Tecla: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Mover no eixo x keybind.move_y.name = Mover no eixo Y keybind.mouse_move.name = Seguir Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Selecionar região keybind.schematic_menu.name = Menu de Esquemas @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Colocação diagonal keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco keybind.deselect.name = Desselecionar +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Atirar keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reatores explodem rules.wavetimer = Tempo de horda rules.waves = Hordas rules.attack = Modo de ataque +rules.buildai = AI Building rules.enemyCheat = Recursos de IA Infinitos rules.blockhealthmultiplier = Multiplicador de vida do bloco rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unidades rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Iluminação +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Luz ambiente -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Itens content.liquid.name = Líquidos @@ -830,9 +878,11 @@ liquid.water.name = Água liquid.slag.name = Escória liquid.oil.name = Petróleo liquid.cryofluid.name = Fluído Criogênico + item.explosiveness = [lightgray]Explosibilidade: {0} item.flammability = [lightgray]Inflamabilidade: {0} item.radioactivity = [lightgray]Radioatividade: {0} + unit.health = [lightgray]Vida: {0} unit.speed = [lightgray]Velocidade: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Rastejante unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Pedregulho de areia block.grass.name = Grama block.slag.name = Slag block.salt.name = Sal -block.saltrocks.name = Pedras De Sal +block.salt-wall.name = Salt Wall block.pebbles.name = Pedrinhas block.tendrils.name = Gavinhas -block.sandrocks.name = Pedras de areia +block.sand-wall.name = Sand Wall block.spore-pine.name = Pinheiro de esporo -block.sporerocks.name = Pedras de esporo -block.rock.name = Rocha -block.snowrock.name = Rocha com neve +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pinheiro com neve block.shale.name = Xisto block.shale-boulder.name = Pedra de Xisto block.moss.name = Musgo block.shrubs.name = Arbusto block.spore-moss.name = Musgo de Esporos -block.shalerocks.name = Rochas de Xisto +block.shale-wall.name = Shale Wall block.scrap-wall.name = Muro de sucata block.scrap-wall-large.name = Muro grande de sucata block.scrap-wall-huge.name = Muro enorme de sucata @@ -919,13 +979,17 @@ block.craters.name = Crateras block.sand-water.name = Água sobre areia block.darksand-water.name = Água sobre areia escura block.char.name = Char -block.holostone.name = Pedra holo +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Gelo de neve -block.rocks.name = Rochas -block.icerocks.name = Rochas de gelo -block.snowrocks.name = Rochas de neve -block.dunerocks.name = Rochas da duna +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pinheiro +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Árvore branca morta block.white-tree.name = Árvore branca block.spore-cluster.name = Aglomerado de esporos @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Painel escuro 4 block.dark-panel-5.name = Painel escuro 5 block.dark-panel-6.name = Painel escuro 6 block.dark-metal.name = Metal escuro -block.ignarock.name = Rocha ígnea +block.basalt.name = Basalt block.hotrock.name = Rocha quente block.magmarock.name = Rocha de magma -block.cliffs.name = Colinas block.copper-wall.name = Muro de Cobre block.copper-wall-large.name = Muralha de Cobre block.titanium-wall.name = Muro de Titânio @@ -980,7 +1043,7 @@ block.underflow-gate.name = Comporta invertida block.silicon-smelter.name = Fundidora de silicio block.phase-weaver.name = Palheta de fase block.pulverizer.name = Pulverizador -block.cryofluidmixer.name = Misturador de Crio Fluido +block.cryofluid-mixer.name = Misturador de Crio Fluido block.melter.name = Aparelho de fusão block.incinerator.name = Incinerador block.spore-press.name = Prensa de Esporo @@ -993,7 +1056,7 @@ block.diode.name = Diodo block.battery.name = Bateria block.battery-large.name = Bateria grande block.combustion-generator.name = Gerador à combustão -block.turbine-generator.name = Gerador à vapor +block.steam-generator.name = Gerador à vapor block.differential-generator.name = Gerador diferencial block.impact-reactor.name = Reator De impacto block.mechanical-drill.name = Broca Mecânica @@ -1055,6 +1118,7 @@ block.container.name = Contâiner block.launch-pad.name = Plataforma de lançamento block.launch-pad-large.name = Plataforma de lançamento grande block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Azul team.crux.name = Vermelho team.sharded.name = Fragmentado @@ -1126,7 +1199,7 @@ block.kiln.description = Derrete chumbo e areia no composto conhecido como metav 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. block.alloy-smelter.description = Combina titânio, chumbo, silicio e cobre para produzir liga de surto. -block.cryofluidmixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. +block.cryofluid-mixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. block.blast-mixer.description = Quebra e mistura aglomerados de esporos com piratita para produzir composto de explosão. block.pyratite-mixer.description = Mistura carvão, chumbo e areia em piratita altamente inflamável. block.melter.description = Derrete sucata em escória para processamento posterior ou uso em torretas. @@ -1192,7 +1265,7 @@ block.battery.description = Armazena energia em tempos de energia excedente. Lib block.battery-large.description = Guarda muito mais energia que uma bateria comum. block.combustion-generator.description = Gera energia queimando materiais inflamáveis, como carvão. block.thermal-generator.description = Gera energia quando colocado em lugares quentes. -block.turbine-generator.description = Mais eficiente que o gerador à combustão, mas requer água adicional para a geração de vapor. +block.steam-generator.description = Mais eficiente que o gerador à combustão, mas requer água adicional para a geração de vapor. block.differential-generator.description = Gera grandes quantidades de energia. Utiliza a diferença de temperatura entre o Fluido Criogênico e a Piratita. block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos que não precisa de refriamento mas dá muito menos energia que o reator de tório. block.solar-panel.description = Gera pequenas quantidades de energia do sol. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index c665535ba8..0b6948191b 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -20,6 +20,8 @@ gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [accent]Novo recorde! copied = Copiado. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sons load.map = Mapas @@ -63,8 +65,7 @@ stat.delivered = Recursos lançados: stat.playtime = Tempo jogado:[accent] {0} stat.rank = Rank Final: [accent]{0} -launcheditems = [accent]Itens lançados -launchinfo = [unlaunched][[LAUNCH] seu núcleo para obter os itens indicados em azul. +globalitems = [accent]Global Items map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de Fase @@ -114,6 +115,7 @@ mod.disable = Desativar mod.content = Content: mod.delete.error = Incapaz de apagar o mod. Ficheiro já em uso. mod.requiresversion = [scarlet]Requer versão minima de jogo: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dependências ausentes: {0} mod.erroredcontent = [scarlet]Erros de conteudo mod.errors = Ocorreram erros ao carregar o conteúdo. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. +planetmap = Planet Map +launchcore = Launch Core filename = Nome do ficheiro: unlocked = Novo bloco Desbloqueado! completed = [accent]Completado @@ -144,6 +148,7 @@ techtree = Árvore de tecnologia research.list = [lightgray]Pesquise: research = Pesquisa researched = [lightgray]{0} pesquisado. +research.progress = {0}% complete players = {0} Jogadores Ativos players.single = {0} Jogador Ativo players.search = search @@ -340,6 +345,11 @@ waves.load = Carregar da área de transferência waves.invalid = Hordas inválidas na área de transferência. waves.copied = Hordas copiadas. waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detalhes... edit = Editar... @@ -459,7 +469,8 @@ locked = Trancado complete = [lightgray]Completo: requirement.wave = Ronda alcançada {0} / {1} requirement.core = Destruir Núcleo Inimigo em {0} -requirement.unlock = Destrava {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resumir Zona:\n[lightgray]{0} bestwave = [lightgray]Melhor: {0} launch = Lançar @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Blocos banidos addall = Adiciona tudo +launch.destination = Destination: {0} configure.invalid = A quantidade deve ser um número entre 0 e {0}. zone.unlocked = [lightgray]{0} Desbloqueado. zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. @@ -496,6 +508,20 @@ 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. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Gráficos 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. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = Pausado clear = Limpar banned = [scarlet]Banido @@ -557,8 +585,11 @@ blocks.itemsmoved = Velocidade de movimento blocks.launchtime = Tempo entre tiros blocks.shootrange = Alcance blocks.size = Tamanho +blocks.displaysize = Display Size blocks.liquidcapacity = Capacidade de Líquido blocks.powerrange = Alcance da Energia +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Uso de energia blocks.powerdamage = Dano/Poder @@ -574,11 +605,14 @@ blocks.boosteffect = Efeito do Boost blocks.maxunits = Máximo de unidades ativas blocks.health = Saúde blocks.buildtime = Tempo de construção +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Custo de construção blocks.inaccuracy = Imprecisão blocks.shots = Tiros blocks.reload = Tiros por segundo blocks.ammo = Munição +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Broca melhor necessária. bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = Unidades de liquido unit.powerunits = Unidades de energia unit.degrees = Graus unit.seconds = segundos +unit.minutes = mins unit.persecond = por segundo +unit.perminute = /min unit.timesspeed = x Velocidade unit.percent = % +unit.shieldhealth = shield health unit.items = itens unit.thousands = k unit.millions = mil +unit.billions = b category.general = Geral category.power = Poder category.liquids = Líquidos @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Atacar command.rally = Reunir command.retreat = Recuar +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = mover_x keybind.move_y.name = mover_y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Selecionar região keybind.schematic_menu.name = Menu esquemático @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Colocação diagonal keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco keybind.deselect.name = Deselecionar +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Atirar keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Tempo de horda rules.waves = Hordas rules.attack = Modo de ataque +rules.buildai = AI Building rules.enemyCheat = Recursos de IA Infinitos rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unidades rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Itens content.liquid.name = Liquidos @@ -830,9 +878,11 @@ liquid.water.name = Água liquid.slag.name = Escória liquid.oil.name = Petróleo liquid.cryofluid.name = Crio Fluido + item.explosiveness = [lightgray]Explosibilidade: {0} item.flammability = [lightgray]Inflamabilidade: {0} item.radioactivity = [lightgray]Radioatividade: {0} + unit.health = [lightgray]Vida: {0} unit.speed = [lightgray]Velocidade: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Pedregulho de areia block.grass.name = Grama block.slag.name = Slag block.salt.name = Sal -block.saltrocks.name = Pedras De Sal +block.salt-wall.name = Salt Wall block.pebbles.name = Pedrinhas block.tendrils.name = Gavinhas -block.sandrocks.name = Pedras de areia +block.sand-wall.name = Sand Wall block.spore-pine.name = Pinheiro de esporo -block.sporerocks.name = Pedras de esporo -block.rock.name = Rocha -block.snowrock.name = Rocha com neve +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pinheiro com neve block.shale.name = Xisto block.shale-boulder.name = Pedra de xisto block.moss.name = Musgo block.shrubs.name = Arbusto block.spore-moss.name = Musgo de esporos -block.shalerocks.name = Rohas de xisto +block.shale-wall.name = Shale Wall block.scrap-wall.name = Muro de sucata block.scrap-wall-large.name = Muro grande de sucata block.scrap-wall-huge.name = Muro enorme de sucata @@ -919,13 +979,17 @@ block.craters.name = Crateras block.sand-water.name = Água sobre areia block.darksand-water.name = Água sobre areia escura block.char.name = Char -block.holostone.name = Pedra holo +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Gelo de neve -block.rocks.name = Rochas -block.icerocks.name = Rochas de gelo -block.snowrocks.name = Rochas de neve -block.dunerocks.name = Rochas da duna +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pinheiro +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Árvore branca morta block.white-tree.name = Árvore branca block.spore-cluster.name = Aglomerado de esporos @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Painel escuro 4 block.dark-panel-5.name = Painel escuro 5 block.dark-panel-6.name = Painel escuro 6 block.dark-metal.name = Metal escuro -block.ignarock.name = Rocha ígnea +block.basalt.name = Basalt block.hotrock.name = Rocha quente block.magmarock.name = Rocha de magma -block.cliffs.name = Colinas block.copper-wall.name = Parede de Cobre block.copper-wall-large.name = Parede de Cobre Grande block.titanium-wall.name = Parede de titânio @@ -980,7 +1043,7 @@ block.underflow-gate.name = Portão Desobrecarregado block.silicon-smelter.name = Fundidora de silicio block.phase-weaver.name = Palheta de fase block.pulverizer.name = Pulverizador -block.cryofluidmixer.name = Misturador de Crio Fluido +block.cryofluid-mixer.name = Misturador de Crio Fluido block.melter.name = Aparelho de fusão block.incinerator.name = Incinerador block.spore-press.name = Prensa de Esporo @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Bateria block.battery-large.name = Bateria Grande block.combustion-generator.name = Gerador a combustão -block.turbine-generator.name = Gerador de Turbina +block.steam-generator.name = Gerador de Turbina block.differential-generator.name = Gerador diferencial block.impact-reactor.name = Reator De Impacto block.mechanical-drill.name = Broca Mecânica @@ -1055,6 +1118,7 @@ block.container.name = Contâiner block.launch-pad.name = Plataforma de lançamento block.launch-pad-large.name = Plataforma de lançamento grande block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Azul team.crux.name = Vermelho team.sharded.name = orange @@ -1126,7 +1199,7 @@ block.kiln.description = Derrete chumbo e areia no composto conhecido como metav 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. block.alloy-smelter.description = Combina titânio, chumbo, silicio e cobre para produzir liga de surto. -block.cryofluidmixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. +block.cryofluid-mixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. block.blast-mixer.description = Quebra e mistura aglomerados de esporos com piratita para produzir composto de explosão. block.pyratite-mixer.description = Mistura carvão, chumbo e areia em piratita altamente inflamável block.melter.description = Derrete sucata em escória para processamento posterior ou uso em torretas. @@ -1192,7 +1265,7 @@ block.battery.description = Armazena energia em tempos de energia excedente. Lib block.battery-large.description = Guarda muito mais energia que uma beteria comum. block.combustion-generator.description = Gera energia usando combustível ou petróleo. block.thermal-generator.description = Gera uma quantidade grande de energia usando lava. -block.turbine-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. +block.steam-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos Que não precisa de refriamento Mas da muito menos energia que o reator de torio. block.solar-panel.description = Gera pequenas quantidades de energia do sol. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties new file mode 100644 index 0000000000..221ab0aab6 --- /dev/null +++ b/core/assets/bundles/bundle_ro.properties @@ -0,0 +1,1305 @@ +credits.text = Creat de [royal]Anuken[] - [sky]anukendev@gmail.com[] +credits = Credite +contributors = Traducători și contributori +discord = Intrați pe serverul de Discord al Mindustry! +link.discord.description = Chatul oficial de pe Discord al Mindustry +link.reddit.description = Subredditul Mindustry +link.github.description = Codul sursă al jocului +link.changelog.description = Lista schimbărilor din update +link.dev-builds.description = Builduri instabile ale dezvoltatorului +link.trello.description = Pagina oficială de Trello pentru funcțiile planificate +link.itch.io.description = Pagina itch.io cu descărcările pentru PC +link.google-play.description = Google Play +link.f-droid.description = Catalogul F-Droid +link.wiki.description = Wikiul oficial al Mindustry +link.suggestions.description = Sugerează noi funcții +linkfail = Linkul nu a putut fi deschis!\nAdresa URL a fost copiată. +screenshot = Captură de ecran salvată la {0} +screenshot.invalid = Harta e prea mare. Se poate să nu existe suficientă memorie pentru captura de ecran. +gameover = Jocul s-a încheiat +gameover.pvp = Echipa [accent] {0}[] este câștigătoare! +highscore = [accent]Scor maxim nou! +copied = Copiat. +indev.popup = [accent]v6[] este momentan în [accent]alpha[].\n[lightgray]Asta înseamnă că:[]\n[scarlet]- Campania este complet neterminată[]\n- Majoritatea [scarlet]AI-ului unităților[] nu funcționează bine\n- Multe unități sunt neterminate\n- Modul campanie nu este terminat \n- Tot ce vedeți se poate schimba sau poate fi eliminat.\n\nPentru a raporta buguri și crashuri intrați pe [accent]Github[]. +indev.notready = Această secțiune a jocului nu este gata încă. + +load.sound = Sunete +load.map = Hărți +load.image = Imagini +load.content = Conținut +load.system = Sistem +load.mod = Moduri +load.scripts = Scripturi + +be.update = Un nou build Bleeding Edge este disponibil: +be.update.confirm = Îl descarci și repornești acum? +be.updating = Se face update... +be.ignore = Ignoră +be.noupdates = Niciun update disponibil. +be.check = Verifică updateurile + +schematic = Schemă +schematic.add = Salvează Schema... +schematics = Scheme +schematic.replace = O schemă cu acel nume există deja. O înlocuiți? +schematic.exists = O schemă cu acel nume există deja. +schematic.import = Importă Schema... +schematic.exportfile = Exportă Fișier +schematic.importfile = Importă Fișier +schematic.browseworkshop = Intră pe Workshop +schematic.copy = Copiază în Clipboard +schematic.copy.import = Importă din Clipboard +schematic.shareworkshop = Partajează pe Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Întoarce Schemă +schematic.saved = Schemă salvată. +schematic.delete.confirm = Schema această va fi ștearsă permanent. +schematic.rename = Redenumește Schema +schematic.info = {0}x{1}, {2} blocuri + +stat.wave = Valuri Învinse:[accent] {0} +stat.enemiesDestroyed = Inamici Distruși:[accent] {0} +stat.built = Structuri Construite:[accent] {0} +stat.destroyed = Structuri Distruse:[accent] {0} +stat.deconstructed = Structuri Deconstruite:[accent] {0} +stat.delivered = Resurse Lansate: +stat.playtime = Timp Joc:[accent] {0} +stat.rank = Rang Final: [accent]{0} + +globalitems = [accent]Materiale Globale +map.delete = Sigur vrei să ștergi harta "[accent]{0}[]"? +level.highscore = Scor Maxim: [accent]{0} +level.select = Selectează Nivelul +level.mode = Mod de Joc: +coreattack = < Nucleul este atacat! > +nearpoint = [[ [scarlet]PLEACĂ DE LA PUNCTUL DE LANSARE IMEDIAT[] ]\nanihilare imminentă +database = Datele Nucleului +savegame = Salvează Jocul +loadgame = Încarcă Jocul +joingame = Intră în Joc +customgame = Personalizat +newgame = Joc Nou +none = +minimap = Minihartă +position = Poziție +close = Închide +website = Site +quit = Abandonează +save.quit = Salvează și Închide +maps = Hărți +maps.browse = Selectează Hărți +continue = Continuă +maps.none = [lightgray]Nu s-au găsit hărți! +invalid = Invalid +pickcolor = Alege Culoarea +preparingconfig = Se Pregătește Configurația +preparingcontent = Se Pregătește Conținutul +uploadingcontent = Se Încarcă Conținutul +uploadingpreviewfile = Se Încarcă Previzualizarea Fișierului +committingchanges = Se Încarcă Schimbările +done = Gata +feature.unsupported = Dispozitivul tău nu suportă această funcție. + +mods.alphainfo = Modurile sunt încă în alpha și[scarlet] pot avea multe buguri[].\nRaportați orice probleme apărute pe Githubul Mindustry sau pe Discord. +mods.alpha = [accent](Alpha) +mods = Moduri +mods.none = [lightgray]Nu s-au găsit moduri! +mods.guide = Ghid de Modding +mods.report = Raportează Bug +mods.openfolder = Deschide Folder +mods.reload = Reîncarcă +mods.reloadexit = Jocul se va opri ca să reîncarce modurile. +mod.display = [gray]Mod:[orange] {0} +mod.enabled = [lightgray]Activat +mod.disabled = [scarlet]Dezactivat +mod.disable = Dezactivează +mod.content = Conținut: +mod.delete.error = Nu s-a putut șterge modul. Fișierul ar putea fi în uz. +mod.requiresversion = [scarlet]Ai nevoie de versiunea de joc minimă: [accent]{0} +mod.outdated = [scarlet]Nu este compatibil cu V6 (no minGameVersion: 105) +mod.missingdependencies = [scarlet]Dependențe Lipsă: {0} +mod.erroredcontent = [scarlet]Erori de Conținut +mod.errors = Au apărut erori la încărcarea conținutului. +mod.noerrorplay = [scarlet]Modurile tale au erori.[] Dezactivează modurile afectate sau repară erorile înainte să joci. +mod.nowdisabled = [scarlet]Modul '{0}' are dependențe lipsă:[accent] {1}\n[lightgray]Mai întâi trebuie să descarci aceste moduri.\nAcest mod va fi dezactivat automat. +mod.enable = Activează +mod.requiresrestart = Jocul se va închide acum pt a aplica modificările modurilor. +mod.reloadrequired = [scarlet]E Nevoie de o Repornire +mod.import = Importă Mod +mod.import.file = Importă Fișier +mod.import.github = Importă din GitHub +mod.jarwarn = [scarlet]Modurile în format JAR nu sunt sigure.[]\nAi grijă să importezi acest mod dintr-o sursă de încredere! +mod.item.remove = Acest obiect este parte din modul [accent] '{0}'[]. Ca să îl poți elimina, dezinstalează acel mod. +mod.remove.confirm = Acest mod va fi șters. +mod.author = [lightgray]Autor:[] {0} +mod.missing = Această salvare conține moduri cărora le-ai făcut update recent sau nu mai sunt instalate. Fișierul poate fi corupt. Sigur vrei să îl încarci?\n[lightgray]Moduri:\n{0} +mod.preview.missing = Înainte să publici acest mod pe Workshop, trebuie să adaugi o imagine pt previzualizare.\nPune o imagine numită[accent] preview.png[] în folderul modului și încearcă din nou. +mod.folder.missing = Doar modurile din câmpul folder pot fi publicate pe Workshop.\nPt a converti orice mod într-un folder, dezarhivează zipul într-un folder și șterge vechiul zip, apoi repornește jocul sau reîncărcă-ți modurile. +mod.scripts.disable = Dispozitivul tău nu suportă moduri cu scripturi. Trebuie să dezactivezi aceste moduri ca să joci jocul. + +about.button = Despre +name = Nume: +noname = Mai întâi alege un [accent] nume de jucător[]. +planetmap = Harta Planetei +launchcore = Lansează Nucleu +filename = Nume Fișier: +unlocked = Nou conținut deblocat! +completed = [accent]Finalizat +techtree = Tehnologie +research.list = [lightgray]Cercetare: +research = Cercetează +researched = [lightgray]{0} cercetat. +research.progress = {0}% finalizat +players = {0} jucători +players.single = {0} jucător +players.search = caută +players.notfound = [gray]niciun jucător găsit +server.closing = [accent]Se închide serverul... +server.kicked.kick = S-ar putea să fi fost dat afară de pe server! +server.kicked.whitelist = Nu ești în lista albă a serverului. +server.kicked.serverClose = Server închis. +server.kicked.vote = Ai fost dat afară de către ceilalți jucători. La revedere. +server.kicked.clientOutdated = Client învechit! Fă-ți update la joc! +server.kicked.serverOutdated = Server învechit! Roagă gazda să facă update! +server.kicked.banned = Ești interzis pe acest server. +server.kicked.typeMismatch = Acest server nu este compatibil cu tipul tău de build. +server.kicked.playerLimit = Serverul acesta e plin. Așteaptă pt un loc liber. +server.kicked.recentKick = Ai fost dat afară recent.\nAșteaptă înainte de a te reconecta. +server.kicked.nameInUse = Cineva cu același nume\neste deja pe server. +server.kicked.nameEmpty = Numele ales este invalid. +server.kicked.idInUse = Ești deja pe acest server! Nu poți conecta două conturi. +server.kicked.customClient = Acest server nu suportă builduri personalizate. Descarcă o versiune oficială. +server.kicked.gameover = Joc încheiat! +server.kicked.serverRestarting = Acest server se repornește. +server.versions = Versiunea ta:[accent] {0}[]versiunea serverului:[accent] {1}[] +host.info = Butonul [accent]găzduiește[] va găzdui un server pe portul [scarlet]6567[]. \nOrice persoană de pe același port [lightgray]wifi sau rețea locală[] ar trebui să-ți vadă serverul în lista lor de servere.\n\nDacă vrei ca lumea să se poată conecta de oriunde cu IP-ul, este nevoie de [accent]port forwarding[].\n\n[lightgray]Notă: Dacă cineva are probleme în a se conecta la jocul tău LAN, verifică dacă ai lăsat Mindustry să acceseze rețeaua locală în setările de firewall. De menționat este faptul că uneori rețelele publice nu permit descoperirea serverului. +join.info = Aici poți scrie un [accent]IP de server[] pt a te conecta, a descoperi [accent]rețeaua locală[] sau serverele [accent]globale[] pt a te conecta la ele.\nAtât multiplayerul LAN cât și cel WAN este suportat.\n\n[lightgray]Dacă vrei să te conectezi la cineva cu IP-ul, trebuie să ceri gazdei IP-ul său, care poate fi găsit căutând pe Google "my ip' de pe dispozitivul lor. +hostserver = Găzduiește Joc Multiplayer +invitefriends = Invită Prieteni +hostserver.mobile = Găzduiește Joc +host = Găzduiește +hosting = [accent]Se deschide serverul... +hosts.refresh = Reîncarcă +hosts.discovering = Se caută jocur LAN +hosts.discovering.any = Se caută jocuri +server.refreshing = Se reîncarcă serverul +hosts.none = [lightgray]Nu s-au găsit jocuri locale! +host.invalid = [scarlet]Nu s-a putut face conectarea la gazdă! + +servers.local = Servere Locale +servers.remote = Servere de la Distanță +servers.global = Servere ale Comunității + +trace = Urmărește Jucător +trace.playername = Nume jucător: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = ID unic: [accent]{0} +trace.mobile = Client Mobil: [accent]{0} +trace.modclient = Client Personalizat: [accent]{0} +invalidid = ID client invalid! Raportează bugul. +server.bans = Interziși +server.bans.none = Nu s-au găsit jucători intreziși! +server.admins = Admini +server.admins.none = Nu s-au găsit admini! +server.add = Adăugă server +server.delete = Sigur vrei să ștergi acest server? +server.edit = Editează Server +server.outdated = [scarlet]Server Învechit![] +server.outdated.client = [scarlet]Client Învechit![] +server.version = [gray]v{0} {1} +server.custombuild = [accent]Build Personalizat +confirmban = Sigur vrei să interzici jucătorul "{0}[white]"? +confirmkick = Sigur vrei să-l dai afară pe "{0}[white]"? +confirmvotekick = Sigur vrei să-l dai afară pe "{0}[white]"? +confirmunban = Sigur vrei ca acest jucător să nu mai fie interzis? +confirmadmin = Sigur vrei să-l faci pe "{0}[white]" un admin? +confirmunadmin = Sigur vrei ca "{0}[white]" să nu mai fie un admin? +joingame.title = Alătură-te Jocului +joingame.ip = Adresă: +disconnect = Deconectat. +disconnect.error = Eroare de conexiune. +disconnect.closed = Conexiune închisă. +disconnect.timeout = Întârzie să răspundă. +disconnect.data = Nu s-au putut încărca datele lumii! +cantconnect = Nu te-ai putut alătura jocului ([accent]{0}[]). +connecting = [accent]Conectare... +connecting.data = [accent]Se încarcă datele hărții... +server.port = Port: +server.addressinuse = Adresa este deja în uz! +server.invalidport = Număr de port invalid! +server.error = [scarlet]Eroare la găzduirea serverului. +save.new = Nouă Salvare +save.overwrite = Sigur vrei să scrii peste \nacest slot de salvare? +overwrite = Scrie Peste +save.none = Nu s-au găsit salvări! +savefail = Salvarea jocului a eșuat! +save.delete.confirm = Sigur vrei să ștergi această salvare? +save.delete = Șterge +save.export = Exportă Salvarea +save.import.invalid = [accent]Salvarea aceasta e invalidă! +save.import.fail = [scarlet]Importul salvării a eșuat: [accent]{0} +save.export.fail = [scarlet]Exportul salvării a eșuat: [accent]{0} +save.import = Importă Salvarea +save.newslot = Numele Salvării: +save.rename = Redenumire +save.rename.text = Noul nume: +selectslot = Selectează o salvare. +slot = [accent]Slotul {0} +editmessage = Editează Mesaj +save.corrupted = Fișier salvare corupt sau invalid! +empty = +on = Pornit +off = Oprit +save.autosave = Autosalvare: {0} +save.map = Hartă: {0} +save.wave = Valul {0} +save.mode = Mod de Joc: {0} +save.date = Ultima Salvare: {0} +save.playtime = Timp în Joc: {0} +warning = Atenție +confirm = Confirmă +delete = Șterge +view.workshop = Vezi în Workshop +workshop.listing = Editează Listarea din Workshop +ok = OK +open = Deschide +customize = Personalizează Regulile +cancel = Anulare +openlink = Deschidr Linkul +copylink = Copiază Linkul +back = Înapoi +data.export = Exportă Date +data.import = Importă Date +data.openfolder = Deschide Folderul cu Date +data.exported = Date exportate. +data.invalid = Aceste date de joc nu sunt valide. +data.import.confirm = Importul de date externe va suprascrie[scarlet] toate[] datele tale de joc curente.\n[accent]Acest proces este ireversibil![]\n\nOdată ce datele sunt importate, jocul tău se va opri imediat. +quit.confirm = Sigur vrei să abandonezi? +quit.confirm.tutorial = Sigur știi ce faci?\nTutorialul poate fi reluat în[accent] Setări->Joc->Reia Tutorialul.[] +loading = [accent]Se încarcă... +reloading = [accent]Se Reincarcă Modurile... +saving = [accent]Se salvează... +respawn = [accent][[{0}][] ca să te refaci în nucleu +cancelbuilding = [accent][[{0}][] pt a curăța planul +selectschematic = [accent][[{0}][] pt selectare+copiere +pausebuilding = [accent][[{0}][] pt a face o pauză de la construit +resumebuilding = [scarlet][[{0}][] pt a continua construitul +wave = [accent]Valul {0} +wave.waiting = [lightgray]Val în {0} +wave.waveInProgress = [lightgray]Val în desfășurare +waiting = [lightgray]În așteptare... +waiting.players = Se așteaptă jucătorii... +wave.enemies = [lightgray]Mai sunt {0} inamici +wave.enemy = [lightgray]Mai e {0} inamic +loadimage = Încarcă Imagine +saveimage = Salvează Imagine +unknown = Necunoscut +custom = Personalizată +builtin = Prestabilită +map.delete.confirm = Ești sigur că vrei să ștergi această hartă? Acțiunea este ireversibilă! +map.random = [accent]Hartă Aleatorie +map.nospawn = Harta asta nu are niciun nucleu în care vor apărea jucătorii! Adaugă un nucleu[accent] portocaliu[] acestei hărți în editor. +map.nospawn.pvp = Această hartă nu are niciun nucleu inamic în care să apară jucătorii! Adaugă nuclee[scarlet] care nu sunt portocalii[] acestei hărți în editor. +map.nospawn.attack = Această hartă nu are niciun nucleu inamic pe care să îl atace jucătorii! Adaugă un nucleu[scarlet] roșu[] acestei hărți în editor. +map.invalid = Eroare la încărcarea hărții: fișier corupt sau invalid. +workshop.update = Fă Update la Item +workshop.error = Eroare la preluarea detaliilor din Workshop: {0} +map.publish.confirm = Sigur vrei să publici această hartă?\n\n[lightgray] Asigură-te că ești de acord cu Termenii și Condițiile Workshop mai întâi, sau hărțile tale nu vor fi publicate! +workshop.menu = Selectează ce ai vrea să faci cu acest item. +workshop.info = Informații despre Item +changelog = Schimbări (opțional): +eula = Steam EULA (Termeni și Condiții) +missing = Acest item a fost șters sau mutat.\n[lightgray]Listarea de pe Workshop a fost automat dezlegată. +publishing = [accent]Se Publică... +publish.confirm = Sigur vrei să publici asta?\n\n[lightgray]Asigură-te că ai verificat Termenii și Condițiile Workshop mai întâi, sau itemurile tale nu vor apărea! +publish.error = Eroare la publicarea itemului: {0} +steam.error = Inițializarea serviciilor Steam a eșuat.\nEroare: {0} + +editor.brush = Pensulă +editor.openin = Deschide în Editor +editor.oregen = Generarea Minereurilor +editor.oregen.info = Generarea Minereurilor: +editor.mapinfo = Informații Hartă +editor.author = Autor: +editor.description = Descriere: +editor.nodescription = O hartă trebuie să aibă o descriere care să conțină măcar 4 caractere înainte să fie publicată. +editor.waves = Valuri: +editor.rules = Reguli: +editor.generation = Generare: +editor.ingame = Editează în Joc +editor.publish.workshop = Publică pe Workshop +editor.newmap = Hartă Nouă +workshop = Workshop +waves.title = Valuri +waves.remove = Elimină +waves.never = +waves.every = la fiecare +waves.waves = val(uri) +waves.perspawn = per apariție +waves.shields = scuturi/val +waves.to = până la +waves.guardian = Gardian +waves.preview = Previzualizare +waves.edit = Editează... +waves.copy = Copiază în Clipboard +waves.load = Încarcă din Clipboard +waves.invalid = Valuri invalide în clipboard. +waves.copied = Valuri copiate. +waves.none = Niciun inamic definit.\nDe reținut că o listă de valuri goală va fi înlocuită automat cu lista de valuri prestabilită. + +wavemode.counts = numere +wavemode.totals = totaluri +wavemode.health = viață + +editor.default = [lightgray] +details = Detalii... +edit = Editare... +editor.name = Nume: +editor.spawn = Adaugă Unitate +editor.removeunit = Înlătură Unitate +editor.teams = Echipe +editor.errorload = Eroare la încărcarea fișierului. +editor.errorsave = Eroare la salvarea fișierului. +editor.errorimage = Aceasta este o imagine, nu o hartă.\n\nDacă vrei să imporți o hartă din versiunile 3.5/build 40, folosește butonul 'Importă Hartă Veche' din editor. +editor.errorlegacy = Hartă aceasta este prea veche, și folosește un format învechit care nu mai este suportat. +editor.errornot = Acesta nu este un fișier cu o hartă. +editor.errorheader = Acest fișier de hartă este invalid sau corupf. +editor.errorname = Harta nu are un nume definit. Încerci cumva să încarci un fișier cu o salvare de joc? +editor.update = Update +editor.randomize = Aleatoriu +editor.apply = Aplică +editor.generate = Generează +editor.resize = Schimbă Dimensiune +editor.loadmap = Încarcă Harta +editor.savemap = Salvează Harta +editor.saved = Salvat! +editor.save.noname = Hartă ta nu are un nume! Setează unul în meniul 'Informații despre hartă'. +editor.save.overwrite = Hartă ta suprascrie o hartă prestabilită! Alege un nume diferit în meniul 'Informații despre hartă'. +editor.import.exists = [scarlet]Nu s-a putut importa:[] o hartă prestabilită numită '{0}' deja există! +editor.import = Importă... +editor.importmap = Importă Hartă +editor.importmap.description = Importă o hartă deja existentă +editor.importfile = Importă Fișier +editor.importfile.description = Importă un fișier hartă extern +editor.importimage = Importă Hartă Veche (Imagine) +editor.importimage.description = Importă o hartă imagine externă +editor.export = Exportă... +editor.exportfile = Exportă Fișier +editor.exportfile.description = Exportă un fișier hartă +editor.exportimage = Exportă o Hartă Imagine +editor.exportimage.description = Exportă o hartă imagine conținând doar teren de bază +editor.loadimage = Importă Hartă Imagine +editor.saveimage = Exportă Hartă Imagine +editor.unsaved = Sigur vrei să ieși?\n[scarlet]Orice schimbări nesalvate vor fi pierdute. +editor.resizemap = Schimbă Dimensiunea Hărții +editor.mapname = Nume Hartă: +editor.overwrite = [accent]Atenție! \nAceastă hartă va suprascrie o hartă existentă. +editor.overwrite.confirm = [scarlet]Atenție![] o hartă cu acest nume există deja. Sigur vrei să o suprascrii?\n"[accent]{0}[]" +editor.exists = Există deja o hartă cu același nume. +editor.selectmap = Selectează o hartă de încărcat: + +toolmode.replace = Înlocuiește +toolmode.replace.description = Desenează doar pe blocurile solide. +toolmode.replaceall = Înlocuiește-le pe toate +toolmode.replaceall.description = Înlocuiește toate blocurile solide de pe hartă. +toolmode.orthogonal = Ortogonal +toolmode.orthogonal.description = Desenează doar linii ortogonale. +toolmode.square = Pătrat +toolmode.square.description = Pensulă pătrată. +toolmode.eraseores = Șterge Minereurile +toolmode.eraseores.description = Șterge doar minereurile. +toolmode.fillteams = Umplere Echipe +toolmode.fillteams.description = Umple hartă cu echipe în loc de blocuri. +toolmode.drawteams = Desenează Echipe +toolmode.drawteams.description = Desenează echipe în loc de blocuri. + +filters.empty = [lightgray]Fără filtre! Adaugă unul folosind butonul de mai jos. +filter.distort = Distorsionare +filter.noise = Zgomot Vizual +filter.enemyspawn = Selectare Punct de Lansare Inamic +filter.corespawn = Selectare Nucleu +filter.median = Mediană +filter.oremedian = Mediană Minereu +filter.blend = Amestecare +filter.defaultores = Miercuri Prestabilite +filter.ore = Minereu +filter.rivernoise = Zgomot Vizual Râuri +filter.mirror = Oglindă +filter.clear = Curăță +filter.option.ignore = Ignoră +filter.scatter = Împrăștie +filter.terrain = Teren +filter.option.scale = Scară +filter.option.chance = Șansă +filter.option.mag = Magnitudine +filter.option.threshold = Cantitate +filter.option.circle-scale = Scară circulară +filter.option.octaves = Octave +filter.option.falloff = Cădere +filter.option.angle = Unghi +filter.option.amount = Cantitate +filter.option.block = Bloc +filter.option.floor = Podea +filter.option.flooronto = Podea țintă +filter.option.wall = Perete +filter.option.ore = Minereu +filter.option.floor2 = Podea Secundară +filter.option.threshold2 = Cantitate Secundară +filter.option.radius = Rază +filter.option.percentile = Procent + +width = Lățime: +height = Înălțime: +menu = Meniu +play = Joacă +campaign = Campanie +load = Încarcă +save = Salvează +fps = FPS: {0} +ping = Ping: {0}ms +language.restart = Vă rugăm să reporniți jocul pentru că setările de limbă să aibă efect. +settings = Setări +tutorial = Tutorial +tutorial.retake = Reia Tutorial +editor = Editor +mapeditor = Editor Hărți + +abandon = Abandonează +abandon.text = Zona aceasta și toate resursele ei vor fi cedate inamicului. +locked = Blocat +complete = [lightgray]Finalizat: +requirement.wave = Ajungi la valul {0} în {1} +requirement.core = Distruge Nucleu Inamic în{0} +requirement.research = Cercetează {0} +requirement.capture = Capturează {0} +resume = Revin la Zonă:\n[lightgray]{0} +bestwave = [lightgray]Cel Mai Bun Val: {0} +launch = < LANSARE > +launch.text = Lansează +launch.title = Lansare Finalizată +launch.next = [lightgray]următoarea ocazie la valul {0} +launch.unable2 = [scarlet]Imposibil de LANSAT.[] +launch.confirm = Asta va lansa toate resursele din nucleu.\nNu te vei mai putea întoarce la această bază. +launch.skip.confirm = Dacă sari acum, Nu vei mai putea lansa decât valurile viitoare. +uncover = Descoperă +configure = Configurează Încărcarea +loadout = Încărcare +resources = Resurse +bannedblocks = Blocuri Interzise +addall = Adaugă-le pe toate +launch.destination = Destination: {0} +configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}. +zone.unlocked = [lightgray]{0} deblocat(ă). +zone.requirement.complete = Cerințele pt {0} finalizate:[lightgray]\n{1} +zone.resources = [lightgray]Resurse Detectate: +zone.objective = [lightgray]Obiectiv: [accent]{0} +zone.objective.survival = Supraviețuiește +zone.objective.attack = Distruge Nucleul Inamic +add = Adaugă... +boss.health = Viața Gardianului + +connectfail = [scarlet]Eroare de conexiune:\n\n[accent]{0} +error.unreachable = Nu s-a putut ajunge la server.\nesigur adresa e scrisă corect? +error.invalidaddress = Adresă invalidă. +error.timedout = Răspuns întârziat!\nAsigură-te că gazda are port forwarding activat, și că adresa este corectă! +error.mismatch = Eroare de pachet:\nPosibil ca versiunea de client/server să nu se potrivească.\nAsigură-te că tu și gazda aveți ultima versiune de Mindustry! +error.alreadyconnected = Deja conectat. +error.mapnotfound = Fișierul hărții nu a fost găsit! +error.io = Eroare de rețea I/O. +error.any = Eroare de rețea necunoscută. +error.bloom = Inițializarea strălucirii a eșuat.\nS-ar putea ca dispozitivul tău să nu suporte funcția. + +weather.rain.name = Ploaie +weather.snow.name = Ninsoare +weather.sandstorm.name = Furtună de nisip +weather.sporestorm.name = Furtună de spori + +sectors.unexplored = [lightgray]Neexplorat +sectors.resources = Resurse: +sectors.production = Producție: +sectors.stored = Stocat: +sectors.resume = Revino +sectors.launch = Lansare +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + +sector.groundZero.name = Ground Zero +sector.craters.name = The Craters +sector.frozenForest.name = Frozen Forest +sector.ruinousShores.name = Ruinous Shores +sector.stainedMountains.name = Stained Mountains +sector.desolateRift.name = Desolate Rift +sector.nuclearComplex.name = Nuclear Production Complex +sector.overgrowth.name = Overgrowth +sector.tarFields.name = Tar Fields +sector.saltFlats.name = Salt Flats +sector.fungalPass.name = Fungal Pass + +sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe. +sector.frozenForest.description = Chiar și aici, aproape de munți, sperii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare. +sector.saltFlats.description = La periferia deșertului stau Salt Flats. Puține resurse pot fi găsite în această locație.\n\nInamicul a ridicat un complex-depozit aici. Distruge-le nucleul. Nu lăsa nimic în urmă. +sector.craters.description = Apa s-a acumulat în acest crater, rămășiță a vechilor războaie. Cucerește din nou zona. Adună nisip. Toarnă-l în metasticlă. Pompează apă pt a răci armele și burghiele. +sector.ruinousShores.description = După deșerturi vine țărmul. Odată, locația aceasta a avut un sistem de apărare de coastă. N-a rămas mult din el. Doar structurile de apărare cele mai de bază rămas în picioare, restul fiind redus la fier vechi.\nContinuă expansiunea în afară. Redescoperă tehnologia. +sector.stainedMountains.description = Mai înspre continent sunt munții, încă neatinși de spori.\nExtrage abundentele resurse de titan din zonă. Învață cum să-l folosești.\n\nPrezența inamicului e mai mare aici. Nu le da timp să-și trimită cele mai puternice unități. +sector.overgrowth.description = Zona asta e plină de buruieni, mai aproape de sursa sporilor.\nInamicul și-a stabilit un adăpost aici. Construiește unități Titan. Distruge-o. Cucerește din nou ce s-a pierdut. +sector.tarFields.description = O zonă aflată la periferia unei zone de producție petrolieră, între munți și deșert. Una din puținele zone cu resurse utilizabile de țiței.\nDeși abandonată, zona aceasta are niște forțe inamice periculoase înapropiere. Nu le subestima.\n\n[lightgray]Cercetează tehnologia de procesare a petrolului dacă se poate. +sector.desolateRift.description = O zonă extrem de periculoasă. Multe resurse, dar puțin spațiu. Mare risc de distrugere. Pleacă cât mai curând. Nu te lăsa păcălit de timpul mare dintre atacurile inamice. +sector.nuclearComplex.description = O fostă facilitate pt producerea și procesarea de torium, redusă la ruine.\n[lightgray]Cercetează toriul și multele sale utilizări.\n\nInamicul e prezent aici în mari numere, căutând constând atacatori. +sector.fungalPass.description = O zonă de tranziție dintre munții înalți și zonele joase, pline cu spori. O mică bază de recunoaștere a inamicului este localizată aici.\nDistruge-o.\nFolosește unități Dagger și Crawler. Distruge cele 2 nuclee. + +settings.language = Limbă +settings.data = Datele Jocului +settings.reset = Resetează +settings.rebind = Reatribuie +settings.resetKey = Resetează +settings.controls = Controale +settings.game = Joc +settings.sound = Sunet +settings.graphics = Grafică +settings.cleardata = Șterge Datele Jocului... +settings.clear.confirm = Sigur vrei să ștergi datele?\nCe e făcut nu poate fi desfăcut! +settings.clearall.confirm = [scarlet]Atenție![]\nAsta va șterge toate datele, inclusiv salvări, hărți, deblocări și atribuiri de controale.\nOdată ce apeși 'ok' jocul va șterge toate datele și se va închide automat. +settings.clearsaves.confirm = Sigur vrei să ștergi toate salvările? +settings.clearsaves = Șterge Salvările +paused = [accent]< Pauză > +clear = Curăță +banned = [scarlet]Interzis +unplaceable.sectorcaptured = [scarlet]Ai nevoie de un sector capturat +yes = Da +no = Nu +info.title = Info +error.title = [scarlet]A apărut o eroare. +error.crashtitle = A apărut o eroare. +unit.nobuild = [scarlet]Unitatea nu poate construi. +blocks.input = Necesită +blocks.output = Produce +blocks.booster = Booster +blocks.tiles = Teren Necesar +blocks.affinities = Efecte Teren +block.unknown = [lightgray]??? +blocks.powercapacity = Capacitate electrică +blocks.powershot = Electricitate/Glonț +blocks.damage = Forță +blocks.targetsair = Lovește Aeronave +blocks.targetsground = Lovește Artilerie +blocks.itemsmoved = Viteza de Mișcare a Materialelor +blocks.launchtime = Timp între Lansări +blocks.shootrange = Rază +blocks.size = Mărime +blocks.displaysize = Mărimea Monitorului Logic +blocks.liquidcapacity = Capacitate Lichid +blocks.powerrange = Raza Electrică +blocks.linkrange = Raza Legăturilor +blocks.instructions = Instrucțiuni +blocks.powerconnections = Maxim Conexiuni +blocks.poweruse = Consum Electricitate +blocks.powerdamage = Electricitate/Forța Glonțului +blocks.itemcapacity = Capacitate Materiale +blocks.basepowergeneration = Generare Electricitate (Bază) +blocks.productiontime = Timp Producție +blocks.repairtime = Durata Reparării Blocului +blocks.speedincrease = Creștere Viteză +blocks.range = Rază +blocks.drilltier = Minabile +blocks.drillspeed = Viteză Burghiu (Bază) +blocks.boosteffect = Efect de Boost +blocks.maxunits = Maxim Unități Active +blocks.health = Viață +blocks.buildtime = Timp Construcție +blocks.maxconsecutive = Maxim Consecutive +blocks.buildcost = Cost Construcție +blocks.inaccuracy = Inacuratețe +blocks.shots = Lovituri +blocks.reload = Lovituri/Secundă +blocks.ammo = Muniție +blocks.shieldhealth = Viața Scutului +blocks.cooldowntime = Timp de Reîncărcare + +bar.drilltierreq = Burghiu Mai Bun Necesar +bar.noresources = Resurse lipsă +bar.corereq = Plasare pe Nucleu Necesară +bar.drillspeed = Viteză Minare: {0}/s +bar.pumpspeed = Viteză Pompare: {0}/s +bar.efficiency = Eficiență: {0}% +bar.powerbalance = Electricitate: {0}/s +bar.powerstored = Stocată: {0}/{1} +bar.poweramount = Electricitate: {0} +bar.poweroutput = Electricitate Produsă: {0} +bar.items = Materiale: {0} +bar.capacity = Capacitate: {0} +bar.unitcap = {0} {1}/{2} +bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.liquid = Lichid +bar.heat = Căldură +bar.power = Electricitate +bar.progress = Progres +bar.input = Necesită +bar.output = Produce + +bullet.damage = [stat]{0}[lightgray] forță +bullet.splashdamage = [stat]{0}[lightgray] forță explozivă ~[stat] {1}[lightgray] pătrate +bullet.incendiary = [stat]incendiar +bullet.homing = [stat]cu radar +bullet.shock = [stat]șoc +bullet.frag = [stat]fragil +bullet.knockback = [stat]{0} [lightgray]împingere +bullet.freezing = [stat]înghețat +bullet.tarred = [stat]lipicios +bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție +bullet.reload = [stat]{0}[lightgray]x lovituri + +unit.blocks = blocuri +unit.powersecond = electricitate/secundă +unit.liquidsecond = unități lichid/secundă +unit.itemssecond = materiale/secundă +unit.liquidunits = unități lichid +unit.powerunits = electricitate +unit.degrees = grade +unit.seconds = secunde +unit.minutes = min +unit.persecond = /sec +unit.perminute = /min +unit.timesspeed = x viteză +unit.percent = % +unit.shieldhealth = viața scutului +unit.items = materiale +unit.thousands = mii +unit.millions = mil +unit.billions = b +category.general = General +category.power = Electricitate +category.liquids = Lichide +category.items = Materiale +category.crafting = Necesită/Produce +category.shooting = Lovire +category.optional = Îmbunătățiri opționale +setting.landscape.name = Blochează Mod Peisaj +setting.shadows.name = Umbre +setting.blockreplace.name = Sugestii Plasare Automats +setting.linear.name = Filtrare Liniară +setting.hints.name = Indicii +setting.flow.name = Afișează Rata de Curgere a lichidelor +setting.buildautopause.name = Autopauză de la Construit +setting.mapcenter.name = Auto Centrează Harta La Jucător +setting.animatedwater.name = Fluide Animate +setting.animatedshields.name = Scuturi Animate +setting.antialias.name = Antialiasing[lightgray] (necesită repornire)[] +setting.playerindicators.name = Indicatori Jucător +setting.indicators.name = Indicatori Inamic +setting.autotarget.name = Auto-Țintire +setting.keyboard.name = Controale Mouse+Tastatură +setting.touchscreen.name = Controale Touchscreen +setting.fpscap.name = FPS Maxim +setting.fpscap.none = Niciuna +setting.fpscap.text = FPS (0) +setting.uiscale.name = Scară Interfață [lightgray] (repornirea necesară)[] +setting.swapdiagonal.name = Plasează Mereu Diagonal +setting.difficulty.training = Antrenament +setting.difficulty.easy = Ușor +setting.difficulty.normal = Normal +setting.difficulty.hard = Greu +setting.difficulty.insane = Nebunesc +setting.difficulty.name = Dificultate: +setting.screenshake.name = Agitare Ecran +setting.effects.name = Vezi Efectele +setting.destroyedblocks.name = Vezi Blocurile Distruse +setting.blockstatus.name = Vezi Statusul Blocului +setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii +setting.sensitivity.name = Sensibilitatea Controlului +setting.saveinterval.name = Interval de Salvare +setting.seconds = {0} secunde +setting.blockselecttimeout.name = Selectarea Blocului a Întârziat +setting.milliseconds = {0} millisecunde +setting.fullscreen.name = Ecran Complet +setting.borderlesswindow.name = Fereastră Fără Margine[lightgray] (repornirea poate fi necesară) +setting.fps.name = Vezi FPS & Ping +setting.smoothcamera.name = Cameră Graduală +setting.blockselectkeys.name = Vezi Detalii Cheie cu Privire la Selectarea Blocurilor +setting.vsync.name = VSync +setting.pixelate.name = Pixelează +setting.minimap.name = Vezi Miniharta +setting.coreitems.name = Vezi Materialele din Nucleu (neterminat) +setting.position.name = Vezi Poziția Jucătorului +setting.musicvol.name = Volumul Muzicii +setting.atmosphere.name = Vezi Atmosfera Planetelor +setting.ambientvol.name = Volum Ambiental +setting.mutemusic.name = Muzica pe Mut +setting.sfxvol.name = Volum SFX +setting.mutesound.name = Sunetul pe Mut +setting.crashreport.name = Trimite Rapoarte de Crash anonime +setting.savecreate.name = Auto-Creează Salvări +setting.publichost.name = Vizibilitatea Jocurilor Publice +setting.playerlimit.name = Limita Jucătorilor +setting.chatopacity.name = Opacitate Chat +setting.lasersopacity.name = Opacitate Laser Electric +setting.bridgeopacity.name = Opacitate Poduri +setting.playerchat.name = Vezi Chat Temporar +public.confirm = Vrei să îți faci jocul public?\n[accent]Oricine va putea intra în jocurile tale.\n[lightgray]Asta se poate schimba mai târziu în Setări->Joc->Vizibilitatea Jocurilor Publice. +public.beta = De reținut că versiunile beta ale jocului nu poate face servere publice. +uiscale.reset = Scara interfeței a fost schimbată.\nApasă "OK" pt a confirma această scară.\n[scarlet]Revin setările și se iese în [accent] {0}[] secunde... +uiscale.cancel = Anulare și ieșire +setting.bloom.name = Strălucire +keybind.title = Reatribuie Taste +keybinds.mobile = [scarlet]Majoritatea tastelor atribuite aici nu funcționează pe mobil. Doar mișcările direcționale de bază sunt suportate. +category.general.name = General +category.view.name = Privire +category.multiplayer.name = Multiplayer +category.blocks.name = Selectare Bloc +command.attack = Atac +command.rally = Adunare +command.retreat = Retragere +command.idle = Inactiv +placement.blockselectkeys = \n[lightgray]Taste: [{0}, +keybind.respawn.name = Regenerare +keybind.control.name = Controlează Unități +keybind.clear_building.name = Șterge Clădirea +keybind.press = Apasă o tastă... +keybind.press.axis = Apasă o axă sau o tastă... +keybind.screenshot.name = Captură Hartă +keybind.toggle_power_lines.name = Oprește/Pornește Statusul Electricelor +keybind.toggle_block_status.name = Oprește/Pornește Statusul Blocurilor +keybind.move_x.name = Mergi pe X +keybind.move_y.name = Mergi pe Y +keybind.mouse_move.name = Urmărește Mouseul +keybind.pan.name = Mișcă Harta +keybind.boost.name = Boost +keybind.schematic_select.name = Selectează Regiunea +keybind.schematic_menu.name = Meniu Scheme +keybind.schematic_flip_x.name = Întoarce Schema X +keybind.schematic_flip_y.name = Întoarce Schema Y +keybind.category_prev.name = Categoria precedentă +keybind.category_next.name = Categoria următoare +keybind.block_select_left.name = Selectează Bloc Stânga +keybind.block_select_right.name = Selectează Bloc Dreapta +keybind.block_select_up.name = Selectează Bloc Sus +keybind.block_select_down.name = Selectează Bloc Jos +keybind.block_select_01.name = Categorie 1 +keybind.block_select_02.name = Categorie 2 +keybind.block_select_03.name = Categorie 3 +keybind.block_select_04.name = Categorie 4 +keybind.block_select_05.name = Categorie 5 +keybind.block_select_06.name = Categorie 6 +keybind.block_select_07.name = Categorie 7 +keybind.block_select_08.name = Categorie 8 +keybind.block_select_09.name = Categorie 9 +keybind.block_select_10.name = Categorie 10 +keybind.fullscreen.name = Ecran Complet +keybind.select.name = Selectează/Trage +keybind.diagonal_placement.name = Plasare Diagonală +keybind.pick.name = Ia Bloc +keybind.break_block.name = Distruge Bloc +keybind.deselect.name = Deselectează +keybind.pickupCargo.name = Ridică Încărcătura +keybind.dropCargo.name = Aruncă Încărcătura +keybind.command.name = Comandă Unitățile +keybind.shoot.name = Trage +keybind.zoom.name = Zoom +keybind.menu.name = Meniu +keybind.pause.name = Pauză +keybind.pause_building.name = Pauză/Reia Construit +keybind.minimap.name = Minihartă +keybind.chat.name = Chat +keybind.player_list.name = Listă Jucători +keybind.console.name = Consolă +keybind.rotate.name = Rotește +keybind.rotateplaced.name = Rotește Existent (Ține) +keybind.toggle_menus.name = Pornește/Oprește Meniuri +keybind.chat_history_prev.name = Previzualizare Istoric Chat +keybind.chat_history_next.name = Chat History Next +keybind.chat_scroll.name = Scroll Chat +keybind.drop_unit.name = Lasă Unitatea +keybind.zoom_minimap.name = Zoom Minihartă +mode.help.title = Descrierea modurilor +mode.survival.name = Supraviețuire +mode.survival.description = Modul normal. Resurse limitate și valuri automate.\n[gray]E nevoie de locuri de lansare a inamicilor pt a juca. +mode.sandbox.name = Sandbox +mode.sandbox.description = Resurse infinite și fără ceas pt valuri. +mode.editor.name = Editor +mode.pvp.name = PvP +mode.pvp.description = Luptă împotriva altor jucători local.\n[gray]E nevoie de 2 nuclee colorate diferit pe hartă pt a juca. +mode.attack.name = Atac +mode.attack.description = Distruge baza inamicului. \n[gray]E nevoie de un nucleu roșu pe hartă pt a juca. +mode.custom = Reguli Personalizate + +rules.infiniteresources = Resurse Infinite +rules.reactorexplosions = Explozia Reactoarelor +rules.wavetimer = Valuri pe Timp +rules.waves = Valuri +rules.attack = Modul Atac +rules.buildai = AI-ul Construiește +rules.enemyCheat = Resurse infinite pt AI (echipa roșie) +rules.blockhealthmultiplier = Multiplicatorul Vieții Blocurilor +rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor +rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților +rules.unithealthmultiplier = Multiplicatorul Vieții Unităților +rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților +rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate) +rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec) +rules.buildcostmultiplier = Multiplicatorul Costului Construcției +rules.buildspeedmultiplier = Multiplicatorul Vitezei de Construcție +rules.deconstructrefundmultiplier = Multiplicatorul Recompensei la Deconstrucție +rules.waitForWaveToEnd = Valurile Așteaptă Inamicii +rules.dropzoneradius = Raza Zonei de Lansare:[lightgray] (pătrate) +rules.unitammo = Unitățile Necesită Muniție +rules.title.waves = Valuri +rules.title.resourcesbuilding = Resurse și Construit +rules.title.enemy = Inamici +rules.title.unit = Unități +rules.title.experimental = Experimental +rules.title.environment = Mediu +rules.lighting = Luminozitate +rules.fire = Foc +rules.explosions = Explozia Deteriorează Blocul/Unitatea +rules.ambientlight = Ambient +rules.weather = Vreme +rules.weather.frequency = Frevență: +rules.weather.duration = Durată: + +content.item.name = Materiale +content.liquid.name = Lichide +content.unit.name = Unități +content.block.name = Blocuri +item.copper.name = Cupru +item.lead.name = Plumb +item.coal.name = Cărbune +item.graphite.name = Grafit +item.titanium.name = Titan +item.thorium.name = Toriu +item.silicon.name = Silicon +item.plastanium.name = Plastaniu +item.phase-fabric.name = Fibră-Fază +item.surge-alloy.name = Supra Aliaj +item.spore-pod.name = Păstaie de Spori +item.sand.name = Nisip +item.blast-compound.name = Compus Explozibil +item.pyratite.name = Piratită +item.metaglass.name = Metasticlă +item.scrap.name = Fier Vechi +liquid.water.name = Apă +liquid.slag.name = Zgură +liquid.oil.name = Petrol +liquid.cryofluid.name = Criofluid + +item.explosiveness = [lightgray]Explozivitate: {0}% +item.flammability = [lightgray]Inflamabilitate: {0}% +item.radioactivity = [lightgray]Radioactivitate: {0}% + +unit.health = [lightgray]Viață: {0} +unit.speed = [lightgray]Viteză: {0} +unit.weapon = [lightgray]Armă: {0} +unit.itemcapacity = [lightgray]Capacitatea de Material: {0} +unit.minespeed = [lightgray]Viteza de Minare: {0}% +unit.minepower = [lightgray]Puterea Minării: {0} +unit.ability = [lightgray]Abilitate: {0} +unit.buildspeed = [lightgray]Viteza de Construcție: {0}% + +liquid.heatcapacity = [lightgray]Capacitatea de Căldură: {0} +liquid.viscosity = [lightgray]Vâscozitatea: {0} +liquid.temperature = [lightgray]Temperatura: {0} + +unit.dagger.name = Dagger +unit.mace.name = Mace +unit.fortress.name = Fortress +unit.nova.name = Nova +unit.pulsar.name = Pulsar +unit.quasar.name = Quasar +unit.crawler.name = Crawler +unit.atrax.name = Atrax +unit.spiroct.name = Spiroct +unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid +unit.flare.name = Flare +unit.horizon.name = Horizon +unit.zenith.name = Zenith +unit.antumbra.name = Antumbra +unit.eclipse.name = Eclipse +unit.mono.name = Mono +unit.poly.name = Poly +unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct +unit.risso.name = Risso +unit.minke.name = Minke +unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura +unit.alpha.name = Alpha +unit.beta.name = Beta +unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus + +block.resupply-point.name = Punct de Realimentare +block.parallax.name = Parallax +block.cliff.name = Deal +block.sand-boulder.name = Bolovan de Nisip +block.grass.name = Iarbă +block.slag.name = Zgură +block.salt.name = Sare +block.salt-wall.name = Perete de Sare +block.pebbles.name = Pietricele +block.tendrils.name = Cârcei +block.sand-wall.name = Perete de Nisip +block.spore-pine.name = Pom de Spori +block.spore-wall.name = Perete de Spori +block.boulder.name = Bolovan +block.snow-boulder.name = Bolovan de Zăpadă +block.snow-pine.name = Pom de Gheață +block.shale.name = Șist +block.shale-boulder.name = Piatră de Șist +block.moss.name = Mușchi +block.shrubs.name = Tufișuri +block.spore-moss.name = Mușchi de Spori +block.shale-wall.name = Perete de Șist +block.scrap-wall.name = Perete de Fier Vechi +block.scrap-wall-large.name = Perete Mare de Fier Vechi +block.scrap-wall-huge.name = Perete Uriaș de Fier Vechi +block.scrap-wall-gigantic.name = Perete Gigantic de Fier Vechi +block.thruster.name = Propulsor +block.kiln.name = Cuptor +block.graphite-press.name = Presă de Grafit +block.multi-press.name = Multi-Presă +block.constructing = {0} [lightgray](În Construcție) +block.spawn.name = Punctul de Lansare Inamic +block.core-shard.name = Nucleu: Shard +block.core-foundation.name = Nucleu: Foundation +block.core-nucleus.name = Nucleu: Core +block.deepwater.name = Apă Adâncă +block.water.name = Apă +block.tainted-water.name = Apă Tulbure +block.darksand-tainted-water.name = Apă Tulbure cu Nisip Negru +block.tar.name = Păcură +block.stone.name = Piatră +block.sand.name = Nisip +block.darksand.name = Nisip Negru +block.ice.name = Gheață +block.snow.name = Zăpadă +block.craters.name = Cratere +block.sand-water.name = Apă cu Nisip +block.darksand-water.name = Apă cu Nisip Negru +block.char.name = Turbă +block.dacite.name = Dacit +block.dacite-wall.name = Perete de Dacit +block.ice-snow.name = Gheață Înzăpezită +block.stone-wall.name = Perete de Piatră +block.ice-wall.name = Perete de Gheață +block.snow-wall.name = Perete de Zăpadă +block.dune-wall.name = Perete Dună +block.pine.name = Pom +block.dirt.name = Pământ +block.dirt-wall.name = Perete de Pământ +block.mud.name = Noroi +block.white-tree-dead.name = Pom Alb Mort +block.white-tree.name = Pom Alb +block.spore-cluster.name = Grup de Spori +block.metal-floor.name = Podea de Metal 1 +block.metal-floor-2.name = Podea de Metal 2 +block.metal-floor-3.name = Podea de Metal 3 +block.metal-floor-5.name = Podea de Metal 4 +block.metal-floor-damaged.name = Podea de Metal Deteriorată +block.dark-panel-1.name = Panou Negru 1 +block.dark-panel-2.name = Panou Negru 2 +block.dark-panel-3.name = Panou Negru 3 +block.dark-panel-4.name = Panou Negru 4 +block.dark-panel-5.name = Panou Negru 5 +block.dark-panel-6.name = Panou Negru 6 +block.dark-metal.name = Metal Negru +block.basalt.name = Bazalt +block.hotrock.name = Piatră Caldă +block.magmarock.name = Piatră cu Magmă +block.copper-wall.name = Perete de Cupru +block.copper-wall-large.name = Perete Mare de Cupru +block.titanium-wall.name = Perete de Titan +block.titanium-wall-large.name = Perete Mare de Titan +block.plastanium-wall.name = Perete de Plastaniu +block.plastanium-wall-large.name = Perete Mare de Plastaniu +block.phase-wall.name = Perete de Fază +block.phase-wall-large.name = Perete Mare de Fază +block.thorium-wall.name = Perete de Toriu +block.thorium-wall-large.name = Perete Mare de Toriu +block.door.name = Ușă +block.door-large.name = Ușă Mare +block.duo.name = Duo +block.scorch.name = Scorch +block.scatter.name = Scatter +block.hail.name = Hail +block.lancer.name = Lancer +block.conveyor.name = Bandă +block.titanium-conveyor.name = Bandă de Titan +block.plastanium-conveyor.name = Bandă de Plastaniu +block.armored-conveyor.name = Bandă Armată +block.armored-conveyor.description = Cară materialele la aceeași viteză ca benzile de titan, dar posedă o armură. Nu acceptă materiale de pe lateral decât de la alte benzi armate. +block.junction.name = Intersecție +block.router.name = Router +block.distributor.name = Distributor +block.sorter.name = Sortator +block.inverted-sorter.name = Sortator Invers +block.message.name = Mesaj +block.illuminator.name = Iluminator +block.illuminator.description = O sursă de lumină mică, compactă, configurabilă. Necesită electricitate pt a funcționa. +block.overflow-gate.name = Poartă de Revărsare +block.underflow-gate.name = Poartă de Subversare +block.silicon-smelter.name = Topitor de Silicon +block.phase-weaver.name = Țesătorie de Fază +block.pulverizer.name = Pulverizator +block.cryofluid-mixer.name = Mixer de Criofluid +block.melter.name = Topitor +block.incinerator.name = Incinerator +block.spore-press.name = Presă de Spori +block.separator.name = Separator +block.coal-centrifuge.name = Centifugă de Cărbune +block.power-node.name = Nod Electric +block.power-node-large.name = Nod Electric Mare +block.surge-tower.name = Turn de Supratensiune +block.diode.name = Diodă de Baterie +block.battery.name = Baterie +block.battery-large.name = Baterie Mare +block.combustion-generator.name = Generator pe Combustie +block.steam-generator.name = Generator pe Abur +block.differential-generator.name = Generator Diferențial +block.impact-reactor.name = Reactor de Impact +block.mechanical-drill.name = Burghiu Mecanic +block.pneumatic-drill.name = Burghiu Pneumatic +block.laser-drill.name = Burghiu cu Laser +block.water-extractor.name = Extractor de Apă +block.cultivator.name = Cultivator +block.conduit.name = Conductă +block.mechanical-pump.name = Pompă Mecanică +block.item-source.name = Sursă de Material +block.item-void.name = Portal de Material +block.liquid-source.name = Sursă de Lichid +block.liquid-void.name = Portal de Lichid +block.power-void.name = Consumator de Electricitate +block.power-source.name = Electricitate Infinită +block.unloader.name = Descărcător +block.vault.name = Seif +block.wave.name = Wave +block.swarmer.name = Swarmer +block.salvo.name = Salvo +block.ripple.name = Ripple +block.phase-conveyor.name = Bandă de Fază +block.bridge-conveyor.name = Pod de Bandă +block.plastanium-compressor.name = Compresor de Plastaniu +block.pyratite-mixer.name = Mixer de Piratită +block.blast-mixer.name = Mixer de Explozibil +block.solar-panel.name = Panou Solar +block.solar-panel-large.name = Panou Solar Mare +block.oil-extractor.name = Extractor de Petrol +block.repair-point.name = Punct de Reparare +block.pulse-conduit.name = Conductă cu Puls +block.plated-conduit.name = Conductă Armată +block.phase-conduit.name = Conductă de Fază +block.liquid-router.name = Router de Lichid +block.liquid-tank.name = Rezervor de Lichid +block.liquid-junction.name = Intersecție de Lichid +block.bridge-conduit.name = Pod de Conductă +block.rotary-pump.name = Pompă Rotativă +block.thorium-reactor.name = Reactor de Toriu +block.mass-driver.name = Distributor în Masă +block.blast-drill.name = Burghiu Tornadă +block.thermal-pump.name = Pompă Termală +block.thermal-generator.name = Generator Termal +block.alloy-smelter.name = Topitorie Aliaj +block.mender.name = Reparator +block.mend-projector.name = Proiector de Reparare +block.surge-wall.name = Perete de Aliaj +block.surge-wall-large.name = Perete Mare de Aliaj +block.cyclone.name = Ciclon +block.fuse.name = Fuse +block.shock-mine.name = Mină cu Șocuri +block.overdrive-projector.name = Proiector de Suprasolicitare +block.force-projector.name = Proiector de Forță +block.arc.name = Arc +block.rtg-generator.name = Generator RTG +block.spectre.name = Specter +block.meltdown.name = Meltdown +block.container.name = Container +block.launch-pad.name = Platformă de Lansare +block.launch-pad-large.name = Platformă de Lansare Mare +block.segment.name = Segment +block.command-center.name = Centru de Comandă +block.ground-factory.name = Fabrică Unități Artilerie +block.air-factory.name = Fabrică Unități Aeriene +block.naval-factory.name = Fabrică Unități Navale +block.additive-reconstructor.name = Reconstructor Aditiv +block.multiplicative-reconstructor.name = Reconstructor Multiplicativ +block.exponential-reconstructor.name = Reconstructor Exponențial +block.tetrative-reconstructor.name = Reconstructor Tetrativ +block.payload-conveyor.name = Bandă în Masă +block.payload-router.name = Router în Masă +block.disassembler.name = Dezasamblator +block.silicon-crucible.name = Creuzet de Silicon +block.overdrive-dome.name = Dom de Suprasolicitare + +block.switch.name = Întrerupător +block.micro-processor.name = Microprocesor +block.logic-processor.name = Procesor Logic +block.hyper-processor.name = Hyperprocesor +block.logic-display.name = Monitor Logic +block.large-logic-display.name = Monitor Logic Mare +block.memory-cell.name = Celulă de Memorie + +team.blue.name = albastră +team.crux.name = roșie +team.sharded.name = portocalie +team.orange.name = portocalie +team.derelict.name = abandon +team.green.name = verde +team.purple.name = mov + +tutorial.next = [lightgray] +tutorial.intro = Bun venit în[scarlet] Tutorialul Mindustry.[]\nFolosește[accent] [[WASD][] ca să te miști.\n[accent]Cu rotița[] poți face harta mai mare sau mai mică.\nÎncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru +tutorial.intro.mobile = Bun venit în[scarlet] Tutorialul Mindustry.[]\nGlisează pe ecran pt a te mișca.\n[accent]Trage cu 2 degete[] pt face harta mai mare sau mai mică.\nÎncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru +tutorial.drill = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colțul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click.\nPoți selecta burghiul și apăsând [accent][[2][] apoi rapid [accent][[1][], indiferent de ce tab este deschis.\n[accent]Click-dreapta[] ca să te oprești din a construi. +tutorial.drill.mobile = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colțul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click, apoi apasă pe[accent] bifa[] de mai jos pt a-ți confirma selecția.\nApasă pe[accent] butonul X[] pt a anula plasarea. +tutorial.blockinfo = Fiecare bloc are statistici diferite. Fiecare burghiu poate mina minereuri diferite.\nPt a verifica informațiile despre un bloc,[accent] dă click pe butonul "?" care apare când blocul este selectat din meniu.[]\n\n[accent]Accesează informații despre Burghiul Mecanic.[] +tutorial.conveyor = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruiește o bandă rulantă de la burghiu către nucleu.\n[accent]Ține apăsat pe mouse pt a desena o linie.[]\nȚine[accent] CTRL[] în timp se plasezi o line pt a o plasa diagonal.\nFolosește rotița pt a roti blocurile înainte să le plasezi.\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu. +tutorial.conveyor.mobile = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruiește o bandă rulantă de la burghiu către nucleu.\n[accent] Construiește o linie ținând degetul pe ecran câteva secunde și apoi[] trage într-o direcție.\n\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu. +tutorial.turret = Odată ce un material intră în nucleu, poate fi folosit pt a construi.\nDe reținut că nu toate materialele pot fi folosite pt construit.\nMaterialele care nu sunt folosite pt construit, cum ar fi[accent] cărbunele[] sau[accent] fierul vechi[], nu pot fi puse în nucleu.\nTrebuie să construiești structuri defensive ca să te aperi de[lightgray] inamici[].\nConstruiește [accent]o armă duo[] lângă baza ta. +tutorial.drillturret = Armele Duo au nevoie de[accent] muniție de cupru[] pt a trage.\nPlasează un burghiu lângă armă.\nConstruiește o bandă către armă pt a o alimenta cu muniție de cupru.\n\n[accent]Muniție livrată: 0/1 +tutorial.pause = În timpul luptei, poți[accent] da pauză la joc.[]\nPoți planifica construcții în timpul pauzei.\n\n[accent]Apasă pe space pt a da pauză. +tutorial.pause.mobile = În timpul luptei, poți[accent] da pauză la joc.[]\nPoți planifica construcții în timpul pauzei.\n\n[accent]Apasă butonul din colțul din stânga sus pt a da pauză. +tutorial.unpause = Acum apasă space din nou pt a continua. +tutorial.unpause.mobile = Acum apasă-l din nou pt a continua. +tutorial.breaking = Uneori, blocurile trebuie distruse.\n[accent]Ține apăsat pe click dreapta[] pt a distruge toate blocurile dintr-o selecție.[]\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului. +tutorial.breaking.mobile = Uneori, blocurile trebuie distruse.\n[accent]Selectează modul deconstrucție[], aopi dă click pe un bloc pt a-l distruge.\nDistruge o zonă ținând apăsat cu degetul pt câteva secunde[] și apoi trăgând într-o direcție.\nApasă bifa de mai jos pt a confirma distrugerea.\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului. +tutorial.withdraw = Câteodată a lua materiale direct din blocuri este necesar.\nPt a face asta, [accent]dă click pe un bloc[] cu materiale în el, apoi [accent]dă click pe materialul[] din inventar.\nMai multe materiale pot fi luate [accent]făcând click și ținând apăsat[].\n\n[accent]Ia niște cupru din nucleu.[] +tutorial.deposit = Depozitează materiale înapoi în blocuri trăgând din nava ta către blocul de destinație.\n\n[accent]Depozitează cuprul înapoi în nucleu.[] +tutorial.waves = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri.[accent] Click[] pt a trage cu arma.\nConstruiește mai multe arme și burghie. Minează mai mult cupru. +tutorial.waves.mobile = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri. Nava ta va trage automat către inamici.\nConstruiește mai multe arme și burghie. Minează mai mult cupru. +tutorial.launch = Odată ce ajungi la un anumit val, poți [accent]lansa nucleul[], lăsându-ți apărările în urmă și[accent] obținând toate resursele din nucleu.[]\nResursele obținute pot fi apoi folosite pt a cerceta noi tehnologii.\n\n[accent]Apasă butonul de lansare. + +item.copper.description = Materialul structural cel mai de bază. Folosit în mod extensiv în toate tipurile de blocuri. +item.lead.description = Un material de bază. Folosit în mod extensiv în electronice și blocuri transportoare de lichid. +item.metaglass.description = Un compus de sticlă super rezistent. Folosit în mod extensiv pt distribuirea și stocarea de lichide. +item.graphite.description = Carbon mineralizat, folosit pt muniție și componente electrice. +item.sand.description = Un material des întâlnit care se folosește extensiv în topitorii, în special pt aliaje. +item.coal.description = Materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării. Folosit extensiv ca combustibil și pt producerea de resurse. +item.titanium.description = Un metal rar și super ușor folosit extensiv pt transportul lichidelor, burghie și aeronautică. +item.thorium.description = Un metal dens, radioactiv, folosit ca suport structural și combustibil nuclear. +item.scrap.description = Rămășițe ale structurilor și unităților vechi. Conține urme ale multor metale diferite. +item.silicon.description = Un semiconductor extrem de folositor. Aplicații în energia solară, electronice complexe și muniție cu radar. +item.plastanium.description = Un material ușor, flexibil folosit în aeronautica avansată și muniție fragilă. +item.phase-fabric.description = O substanță cu greutate aproape de 0 folosită în electronica avansată și tehnologia de autoreparare. +item.surge-alloy.description = Un aliaj avansat cu proprietăți electrice unice. +item.spore-pod.description = O păstaie de spori, sintetizați din concentrațiile atmosferice pt utilizări industriale. Folosit pt a fi convertit în petrol, explozibili și combustibil. +item.blast-compound.description = Un compus instabil folosit în bombe și explozibili. Sintetizat din păstăile de spori și alte materiale volatile. Folosirea ca combustibil nu e recomandată. +item.pyratite.description = O substanță extrem de inflamabilă folosită în armele incendiare. +liquid.water.description = Cel mai util lichid. Folosit deseori pt răcirea mașinăriilor și procesarea deșeurilor. +liquid.slag.description = Diferite tipuri de metal topit amestacate laolaltă. Poate fi separat în materialele constituente, sau pulverizat înspre unitățile inamice ca armă. +liquid.oil.description = Un lichid folosit în producerea de materiale avansate. Poate fi convertit în cărbune pt combustibil, sau pulverizat și ars ca armă. +liquid.cryofluid.description = Un lichid inert, non coroziv creat din apă și titan. Are o capacitate de absorbție a căldurii mare. Folosit în mod extensiv ca răcitor. + +block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați. +block.graphite-press.description = Compresează bucăți de cărbune în plăci de grafit pur. +block.multi-press.description = O versiune mai bună a presei de grafit. Folosește apă și electricitate pt a procesa cărbunele rapid și eficient. +block.silicon-smelter.description = Transformă nisipul și cărbunele pur. Produce silicon. +block.kiln.description = Toarnă nisip și plumb în compusul numit metasticlă. Necesită puțină electricitate pt pornire. +block.plastanium-compressor.description = Produce plastaniu din petrol și titan. +block.phase-weaver.description = Sintetizează fibră-fază din toriu radioactiv și nisip. Necesită electricitate pt a funcționa. +block.alloy-smelter.description = Combină titan, plumb, silicon și cupru pt a produce supra aliaj. +block.cryofluid-mixer.description = Amestecă apă și pudră fină de titan în criofluid. Esențial pt folosirea în reactoarele de toriu. +block.blast-mixer.description = Zdrobește și amestecă gramezi de spori cu piratită pt a produce un compus explozibil. +block.pyratite-mixer.description = Amestecă niște cărbune, plumb și nisip în inflamabila piratită. +block.melter.description = Topește fierul vechi în zgură pt procesare ulterioară sau folosire în armele Wave. +block.separator.description = Separă zgura în componentele sale minerale. Furnizează rezultatul răcit. +block.spore-press.description = Compresează păstăi de spori sub presiuni extreme pt a sintetiza petrol. +block.pulverizer.description = Zdrobește fierul vechi în nisip fin. +block.coal-centrifuge.description = Solidifică petrolul în bucăți de cărbune. +block.incinerator.description = Vaporizează orice exces de material sau lichid primește. +block.power-void.description = Consumă toată electricitatea primită. Doar în modul sandbox. +block.power-source.description = Generează electricitate infinită. Doar în modul sandbox. +block.item-source.description = Generează materiale la infinit. Doar în modul sandbox. +block.item-void.description = Distruge orice material. Doar în modul sandbox. +block.liquid-source.description = Generează lichide la infinit. Doar în modul sandbox. +block.liquid-void.description = Distruge orice lichid. Doar în modul sandbox. +block.copper-wall.description = Un perete defensiv ieftin.\nUtil pt a proteja nucleul și armele în primele valuri. +block.copper-wall-large.description = Un perete defensiv ieftin.\nUtil pt a proteja nucleul și armele în primele valuri.\nSe întinde pe mai multe pătrate. +block.titanium-wall.description = Un perete defensiv de rezistență moderată.\nFurnizează protecție moderată împotriva inamicilor. +block.titanium-wall-large.description = Un perete defensiv de rezistență moderată.\nFurnizează protecție moderată împotriva inamicilor. \nSe întinde pe mai multe pătrate. +block.plastanium-wall.description = Un tip special de perete care absoarbe laserele electrice și blochează conectarea automată a nodurilor electrice. +block.plastanium-wall-large.description = Un tip special de perete care absoarbe laserele electrice și blochează conectarea automată a nodurilor electrice.\nSe întinde pe mai multe pătrate. +block.thorium-wall.description = Un perete defenziv puternic. \nProtecție decentă împotriva inamicilor. +block.thorium-wall-large.description = Un perete defenziv puternic. \nProtecție decentă împotriva inamicilor.\nSe întinde pe mai multe pătrate. +block.phase-wall.description = Un perete învelit într-un material reflexiv special bazat pe fibra-fază. Reflectă majoritatea gloanțelor la impact. +block.phase-wall-large.description = Un perete învelit într-un material reflexiv special bazat pe fibra-fază. Reflectă majoritatea gloanțelor la impact.\nSe întinde pe mai multe pătrate. +block.surge-wall.description = Un perete defensiv extrem de durabil.\nStrânge electricitate statică la contactul cu gloanțele, lansând-o la întâmplare. +block.surge-wall-large.description = Un perete defensiv extrem de durabil.\nStrânge electricitate statică la contactul cu gloanțele, lansând-o la întâmplare.\nSe întinde pe mai multe pătrate. +block.door.description = O ușă mică. Poate fi deschisă sau închisă dând click. +block.door-large.description = O ușă mare. Poate fi deschisă sau închisă dând click.\nSe întinde pe mai multe pătrate. +block.mender.description = Repară periodic blocurile din vecinătate. Menține apărările în stare bună între valuri.\nPoate folosi silicon pt un boost al razei de acțiune și al eficienței. +block.mend-projector.description = O versiune mai bună a reparatorului. Repară periodic blocurile din vecinătate. \nPoate folosi fibră-fază pt un boost al razei de acțiune și al eficienței. +block.overdrive-projector.description = Grăbește blocurile din apropiere.\nPoate folosi fibră-fază pt un boost al razei de acțiune și al eficienței. +block.force-projector.description = Creează un câmp de forță hexagonal în jurul său, protejând blocurile și unitățile din interior de deteriorare.\nSe supraîncălzește dacă este prea deteriorat. Poate folosi răcitor pt a preveni supraîncălzirea pt a preveni supraîncălzirea. Fibra-fază poate fi folosită pt a crește mărimea scutului. +block.shock-mine.description = Rănește inamicii care calcă pe ea. Aproape invizibilă pt inamic. +block.conveyor.description = Bloc de transport al materialelor. Împinge materialele în față și le depozitează automat în blocuri. Poate fi rotită. +block.titanium-conveyor.description = Bloc avansat de transport al materialelor. Împinge materialele mai rapid decât blocurile standard. +block.plastanium-conveyor.description = Împingee grămezi de materiale.\nAcceptă materiale din spate, și le descarcă în 3 direcții în față.\nNecesită mai multe puncte de încărcare și descărcare pt a transporta nr maxim de materiale/secundă. +block.junction.description = Acționează ca un pod pt două benzi care se intersectează. Util în situații în care se intersectează 2 benzi cărând diverse materiale în diferite locații. +block.bridge-conveyor.description = Bloc avansat de transport al materialelor. Permite transportul materialelor peste orice teren sau clădire, până la 3 pătrate distanță. +block.phase-conveyor.description = Bloc avansat de transport al materialelor. Folosește electricitate pt a teleporta materialele la o altă bandă de fază peste mai multe pătrate. +block.sorter.description = Sortează materialele. Dacă un material se potrivește selecției, este lăsat să treacă. Altfel, materialul este transportat la stânga sau la dreapta. +block.inverted-sorter.description = Procesează materialele ca un sortator standard, dar materialele selectate sunt transportate la stânga sau la dreapta. +block.router.description = Acceptă materiale, apoi le distribuie în alte 3 direcții în mod egal. Util pt a împărți materialele de la o sursă către mai multe destinații.\n\n[scarlet]Nu folosi niciodată pt a introduce materiale în blocuri, căci vor fi blocate de produșii blocurilor.[] +block.distributor.description = Un router avansat. Împarte materialele în alte 7 direcții în mod egal. +block.overflow-gate.description = Transportă materialele doar la stânga și dreapta dacă drumul din față este blocat. +block.underflow-gate.description = Opusul porții de revărsare. Transportă materialele în față dacă benzile din stânga și dreapta sunt blocate. +block.mass-driver.description = Cel mai bun bloc de transport al materialelor. Adună mai multe materiale și apoi le lansează până la un alt distributor în masă pe o rază mare. Necesită electricitate pt a opera. +block.mechanical-pump.description = O pompă ieftină care pompează puțin, dar nu consumă electricitate. +block.rotary-pump.description = O pompă avansată. Pompează mai mult lichid dar consumă electricitate. +block.thermal-pump.description = Cea mai bună pompă. +block.conduit.description = Un bloc de transport al lichidelor. Împinge lichidele în față. Folosit cu pompe și alte conducte. +block.pulse-conduit.description = Un bloc avansat de transport al lichidelor. Transportă lichidele mai rapid și stochează mai mult decât conductele standard. +block.plated-conduit.description = Transportă lichidele lafel de rapid precum conductele cu puls, dar este mai rezistent. Nu acceptă fluide din lateral de la altceva în afară de conducte.\nCurge mai puțin. +block.liquid-router.description = Acceptă lichide dintr-o direcție și le distribuie în alte 3 direcții în mod egal. Poate stoca o anumită cantitate de lichid. Folositor pt a distribui lichidele dintr-o sursă către mai multe destinații. +block.liquid-tank.description = Stochează o mare cantitate de lichid. Util pt depozita lichide pt situațiile în care cererea de materiale nu e constantă sau ca extra securitate pt răcirea blocurilor vitale. +block.liquid-junction.description = Acționează ca un pod pt două conducte care se intersectează. Util în situația în care se intersectează 2 conducte diferite ce cară divesre lichide către diverse locații. +block.bridge-conduit.description = Un bloc avansat de transport al lichidelor. Permite transportul lichidelor peste orice tip teren sau bloc, până la 3 pătrate distanță. +block.phase-conduit.description = Un bloc avansat de transport al lichidelor. Folosește electricitate pt a teleporta lichidele către o altă conductă de fază la o mare distanță. +block.power-node.description = Transmite electricitate către nodurile conectate. Nodul primește electricitate din sau oferă electricitate oricăror blocuri adiacente. +block.power-node-large.description = Un nod electric avansat cu o rază mare. +block.surge-tower.description = Un nod electric cu o rază extrem de mare dar cu mai puține conexiuni disponibile. +block.diode.description = Energia din baterii poate trece prin acest bloc doar într-o direcție, dar doar dacă o parte are mai puțină energie stocată. +block.battery.description = Stochează electricitatea pt rezerve atunci când există un surplus în rețea. Oferă electricitate atunci când există un deficit. +block.battery-large.description = Stochează mai multă electricitate decât bateria standard. +block.combustion-generator.description = Generează electricitate arzând materiale inflamabile, precum cărbunele. +block.thermal-generator.description = Generează electricitate atunci când este plasat în locuri calde. +block.steam-generator.description = Un generator de combustie avansat. Mai eficient, dar necesită apă pt a genera abur. +block.differential-generator.description = Generează mari cantități de electricitate. Utilizează diferența de temperatură dintre criofluid și piratită arzând. +block.rtg-generator.description = Un generator simplu pe care te poți baza. Folosește căldura materialelor radioactive care se dezintegrează pt a produce încet electricitate. +block.solar-panel.description = Oferă o cantitate mică de energie solară. +block.solar-panel-large.description = O versiune cu mult mai eficientă a panoului solar standard. +block.thorium-reactor.description = Generează mari cantități de electricitate din toriu. Necesită răcire constantă. Explodează violent dacă i se oferă cantități insuficiente de răcitor. Electricitatea produsă depinde de cât de plin e, cu electricitatea de bază produsă la capacitate maximă. +block.impact-reactor.description = Un generator avansat, capabil să creeze cantități masive de electricitate la eficiență maximă. Are nevoie de o cantitate de electricitate pt a începe procesul. +block.mechanical-drill.description = Un burghiu ieftin. Odată plasat pe blocurile corezpunzătoare, minează încet materiale. Capabil să mineze materiale de bază. +block.pneumatic-drill.description = Un burghiu îmbunătățit, capabil să mineze titan. Minează mai rapid decât burghiul mecanic. +block.laser-drill.description = Poate mina mai rapid prin tehnologia bazată pe laser, dar necesită electricitate. Poate mina toriu. +block.blast-drill.description = Cel mai bun burghiu. Necesită cantități mari de electricitate. +block.water-extractor.description = Extrage apă din pământ. Folosit în locații unde apa de suprafață nu este disponibilă. +block.cultivator.description = Cultivă mici concentrații de spori din atmosferă în păstăi pregătite pt procesare industrială. +block.oil-extractor.description = Folosește mari cantități de electricitate, nisip și apă pt a extrage petrol. +block.core-shard.description = Prima versiune a capsulei nucleice. Odată distrusă, orice contact cu regiunea se pierde. Nu lăsa asta să se întâmple. +block.core-foundation.description = A doua versiune a nucleului. Mai bine armată. Stochează mai multe resurse. +block.core-nucleus.description = A treia și ultima versiune a capsulei nucleice. Extrem de bine armată. Stochează mari cantități de resurse. +block.vault.description = Stochează o mare cantitate de materiale de orice tip. Un bloc descărcător poate fi folosit pt a lua obiecte din seif. +block.container.description = Stochează o mică cantitate de materiale de orice tip. Un bloc descărcător poate fi folosit pt a lua obiecte din container. +block.unloader.description = Descarcă materialele din orice bloc din apropiere, mai puțin cele de transport. Tipul materialului de descărcat poate fi schimbat. Click pe descărcător. +block.launch-pad.description = Lansează grămezi de materiale fără a fi nevoie să lansezi nucleul. +block.launch-pad-large.description = O versiune mai bună a platformei de lansare. Stochează mai multe materiale. Lansează mai frecvent. +block.duo.description = O armă mică, ieftină. Util împotriva unităților de artilerie. +block.scatter.description = O armă esențială anti aeronave. Aruncă bucățele de plumb, fier vechi sau metasticlă către inamici. +block.scorch.description = Arde orice artilerie inamică din apropiere. Mai eficient la distanță mică. +block.hail.description = O armă anti-artilerie mică, care trage la mari distanțe. +block.wave.description = O armă medie. Trage cu lichid către inamici. Stinge focul automat când este alimentată cu apă. +block.lancer.description = O armă anti-artilerie medie, cu laser. Se încarcă și trage cu lasere puternice de electricitate. +block.arc.description = O armă electrică cu o rază de acțiune mică. Trage cu mici lasere de electricitate către inamici. +block.swarmer.description = O armă medie cu rachete. Atacă atât artileria cât și navele inamice. Trage cu rachete cu radar. +block.salvo.description = O versiune mai mare, mai avansată a armei Duo. Trage salve rapide de gloanțe către inamici. +block.fuse.description = O armă șrapnel mare cu rază de acțiune mică. Trage trei raze de gloanțe care găuresc scuturile inamicilor din apropiere. +block.ripple.description = O armă de artilerie extrem de puternică. Lovește grămezi de bucăți de material înspre inamici pe distanțe mari. +block.cyclone.description = O mare armă anti-artilerie și anti-aer. Trage cu grămezi explozive de material către ddunitățile inamice. +block.spectre.description = O armă masivă cu două țevi. Trage cu gloanțe mari care găuresc armurile țintelor aeriene și artileriei. +block.meltdown.description = O armă cu laser masivă. Trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera. +block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate. +block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 7456b4e1ba..716cf580fa 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1,4 +1,4 @@ -credits.text = Создатель [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nЕсть недоработки в переводе или хотите найти союзников для совместной игры?\nПишите в оф. [accent]discord-сервер Mindustry[] в канал [accent]#русский[].\n\nРедакторы и переводчики на русский язык:\n[blue]Prosta4ok_ua[green]#[yellow]6336\n[darkgray]XZ[gray]imur\n[#30FF30]Beryllium\n[tan]Felix [slate]Corvus\n[orange]Vanguard +credits.text = Создатель [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nЕсть недоработки в переводе или хотите найти союзников для совместной игры?\nПишите в оф. [accent]discord-сервер Mindustry[] в канал [accent]#русский[].\n\nРедакторы и переводчики на русский язык:\n[blue]Prosta4ok_ua[green]#[yellow]6336\n[darkgray]XZimur[]\n[#30FF30]Beryllium\n[tan]Félix [slate]Córvus\n[orange]Vanguard\n[#a00000]The [red]Slaylord[][] credits = Авторы contributors = Переводчики и помощники discord = Присоединяйтесь к нашему Discord! @@ -20,7 +20,8 @@ gameover = Игра окончена gameover.pvp = [accent]{0}[] команда победила! highscore = [accent]Новый рекорд! copied = Скопировано. -indevpopup = [accent]v6[] находится на стадии [accent]pre-alpha[].\n[lightgray]Это означает следующее:[]\n- Отсутствие контента.\n- Большинство [scarlet]ИИ единиц[] не работает.\n- Множество единиц [scarlet]отсутствует[] или не готово.\n- Кампания не завершена.\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]Github[]. +indev.popup = [accent]v6[] находится на стадии [accent]alpha[].\n[lightgray]Это означает следующее:[]\n[scarlet]- Кампания не завершена[]\n- Отсутствие контента\n- Большинство [scarlet]ИИ единиц[] не работает правильно\n- Множество единиц не готово\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]GitHub[]. +indev.notready = Эта часть игры ещё не готова load.sound = Звуки load.map = Карты @@ -54,6 +55,7 @@ schematic.saved = Схема сохранена. schematic.delete.confirm = Эта схема будет поджарена Испепелителем. schematic.rename = Переименовать схему schematic.info = {0}x{1}, {2} блоков +schematic.disabled = [scarlet]Схемы отключены[]\nНа этой [accent]карте[] или [accent]сервере запрещено использование схем. stat.wave = Волн отражено:[accent] {0} stat.enemiesDestroyed = Врагов уничтожено:[accent] {0} @@ -114,6 +116,7 @@ mod.disable = Выкл. mod.content = Содержимое: mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется. mod.requiresversion = [scarlet]Требуемая минимальная версия игры: [accent]{0} +mod.outdated = [scarlet]Не совместим с V6 (нет "minGameVersion: 105") mod.missingdependencies = [scarlet]Не найдены родительские модификации: {0} mod.erroredcontent = [scarlet]Ошибки содержимого mod.errors = Ошибки были вызваны загружаемым содержимым. @@ -126,9 +129,9 @@ mod.import = Импортировать модификацию mod.import.file = Импортировать файл mod.import.github = Импортировать мод с GitHub mod.jarwarn = [scarlet]JAR-модификации по сути не безопасны.[]\nУбедитесь, что вы импортируете этот мод из надежного источника! -mod.item.remove = Этот предмет является частью модификации [accent]«{0}»[]. Чтобы удалить его, удалите саму модификацию. +mod.item.remove = Этот предмет является частью модификации [accent]«{0}[accent]»[white]. Чтобы удалить его, удалите саму модификацию. mod.remove.confirm = Эта модификация будет удалена. -mod.author = [lightgray]Автор:[] {0} +mod.author = [lightgray]Автор(ы):[] {0} mod.missing = В этом сохранении есть следы модификации, которая отсутствует или установлена её обновлённая версия. Может произойти повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} mod.preview.missing = Перед публикацией этой модификации в Мастерской, вы должны добавить изображение предпросмотра.\nРазместите изображение с именем[accent] preview.png[] в папке модификации и попробуйте снова. mod.folder.missing = Модификации могут быть опубликованы в Мастерской только в виде папки.\nЧтобы конвертировать любой мод в папку, просто извлеките его из архива и удалите старый архив .zip, затем перезапустите игру или перезагрузите модификации. @@ -137,6 +140,8 @@ mod.scripts.disable = Ваше устройство не поддерживае about.button = Об игре name = Имя: noname = Для начала, придумайте[accent] себе имя[]. +planetmap = Карта планеты +launchcore = Запуск ядра filename = Имя файла: unlocked = Новый контент разблокирован! completed = [accent]Завершено @@ -171,7 +176,7 @@ host.info = Кнопка [accent]Открыть сервер[] запускае join.info = Здесь вы можете ввести [accent]IP-адрес сервера[], найти доступные [accent]локальные[] и [accent]глобальные[] серверы для подключения.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Если вы хотите подключиться к кому-то по IP-адресу, Вам нужно будет попросить IP-адрес у самого хоста. Хост может узнать IP-адрес своего устройства через Google запрос [accent]"my ip"[]. hostserver = Запустить многопользовательский сервер invitefriends = Пригласить друзей -hostserver.mobile = Запустить\nсервер +hostserver.mobile = Запустить сервер host = Открыть сервер hosting = [accent]Открытие сервера… hosts.refresh = Обновить @@ -485,6 +490,7 @@ loadout = Груз resources = Ресурсы bannedblocks = Запрещённые блоки addall = Добавить всё +launch.destination = Место назначения: {0} configure.invalid = Количество должно быть числом между 0 и {0}. zone.unlocked = Зона «[lightgray]{0}» теперь разблокирована. zone.requirement.complete = Условия для зоны «{0}» выполнены:[lightgray]\n{1} @@ -506,7 +512,21 @@ error.io = Сетевая ошибка ввода-вывода. error.any = Неизвестная сетевая ошибка. error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его. +weather.rain.name = Дождь +weather.snow.name = Снегопад +weather.sandstorm.name = Пыльная буря +weather.sporestorm.name = Споровая буря +sectors.unexplored = [lightgray]Не исследовано +sectors.resources = Ресурсы: +sectors.production = Производит: +sectors.stored = Накоплено: +sectors.resume = Продолжить +sectors.launch = Высадка +sectors.select = Выбор +sectors.nonelaunch = [lightgray]нет (солнце) + +#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway sector.groundZero.name = Отправная точка sector.craters.name = Кратеры sector.frozenForest.name = Ледяной лес @@ -574,12 +594,16 @@ blocks.itemsmoved = Скорость перемещения blocks.launchtime = Интервал запусков blocks.shootrange = Радиус действия blocks.size = Размер +blocks.displaysize = Размер дисплея blocks.liquidcapacity = Вместимость жидкости blocks.powerrange = Дальность передачи энергии +blocks.linkrange = Дальность связи +blocks.instructions = Инструкции blocks.powerconnections = Количество соединений blocks.poweruse = Потребляет энергии blocks.powerdamage = Энергия/урон blocks.itemcapacity = Вместимость предметов +blocks.memorycapacity = Размер памяти blocks.basepowergeneration = Базовая генерация энергии blocks.productiontime = Время производства blocks.repairtime = Время полной регенерации @@ -591,11 +615,14 @@ blocks.boosteffect = Ускоряющий эффект blocks.maxunits = Максимальное количество активных единиц blocks.health = Прочность blocks.buildtime = Время строительства +blocks.maxconsecutive = Макс. последовательность blocks.buildcost = Стоимость строительства blocks.inaccuracy = Разброс blocks.shots = Выстрелы blocks.reload = Выстрелы/секунду blocks.ammo = Боеприпасы +blocks.shieldhealth = Прочность щита +blocks.cooldowntime = Время восстановления bar.drilltierreq = Требуется бур получше bar.noresources = Недостаточно ресурсов @@ -638,9 +665,12 @@ unit.liquidunits = жидкостных единиц unit.powerunits = энерг. единиц unit.degrees = град. unit.seconds = сек. +unit.minutes = мин. unit.persecond = /сек +unit.perminute = /мин unit.timesspeed = x скорость unit.percent = % +unit.shieldhealth = прочность щита unit.items = предметов unit.thousands = к unit.millions = М @@ -727,6 +757,7 @@ category.blocks.name = Выбор блока command.attack = Атаковать command.rally = Точка сбора command.retreat = Отступить +command.idle = Ждать placement.blockselectkeys = \n[lightgray]Клавиша: [{0}, keybind.respawn.name = Возрождение в ядре keybind.control.name = Перехватить контроль над единицей @@ -739,6 +770,7 @@ keybind.toggle_block_status.name = Отображение статусов бл keybind.move_x.name = Движение по оси X keybind.move_y.name = Движение по оси Y keybind.mouse_move.name = Следовать за курсором +keybind.pan.name = Панорамирование камеры keybind.boost.name = Полёт/Ускорение keybind.schematic_select.name = Выбрать область keybind.schematic_menu.name = Меню схем @@ -766,6 +798,9 @@ keybind.diagonal_placement.name = Диагональное размещение keybind.pick.name = Выбрать блок keybind.break_block.name = Разрушить блок keybind.deselect.name = Снять выделение +keybind.pickupCargo.name = Взять груз +keybind.dropCargo.name = Сбросить груз +keybind.command.name = Командовать группой keybind.shoot.name = Выстрел keybind.zoom.name = Масштабирование keybind.menu.name = Меню @@ -797,9 +832,11 @@ mode.custom = Пользовательские правила rules.infiniteresources = Бесконечные ресурсы (Игрок) rules.reactorexplosions = Взрывы реакторов +rules.schematic = Схемы разрешены rules.wavetimer = Интервал волн rules.waves = Волны rules.attack = Режим атаки +rules.buildai = Строительство ИИ rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда) rules.blockhealthmultiplier = Множитель здоровья блоков rules.blockdamagemultiplier = Множитель урона блоков @@ -821,8 +858,12 @@ rules.title.unit = Боевые единицы rules.title.experimental = Экспериментально rules.title.environment = Окружение rules.lighting = Освещение +rules.fire = Огонь +rules.explosions = Урон от взрывов блоков/единиц rules.ambientlight = Окружающий свет -rules.solarpowermultiplier = Множитель солнечной энергии +rules.weather = Погода +rules.weather.frequency = Периодичность: +rules.weather.duration = Длительность: content.item.name = Предметы content.liquid.name = Жидкости @@ -848,9 +889,11 @@ liquid.water.name = Вода liquid.slag.name = Шлак liquid.oil.name = Нефть liquid.cryofluid.name = Криогенная жидкость + item.explosiveness = [lightgray]Взрывоопасность: {0}% item.flammability = [lightgray]Воспламеняемость: {0}% item.radioactivity = [lightgray]Радиоактивность: {0}% + unit.health = [lightgray]Целостность: {0} unit.speed = [lightgray]Скорость: {0} unit.weapon = [lightgray]Оружие: {0} @@ -870,10 +913,11 @@ unit.fortress.name = Крепость unit.nova.name = Нова unit.pulsar.name = Пульсар unit.quasar.name = Квазар -unit.crawler.name = Обходчик +unit.crawler.name = Ползун unit.atrax.name = Атракс unit.spiroct.name = Спайрокт unit.arkyid.name = Аркид +unit.toxopid.name = Токсопид unit.flare.name = Вспышка unit.horizon.name = Горизонт unit.zenith.name = Зенит @@ -882,34 +926,43 @@ unit.eclipse.name = Затмение unit.mono.name = Моно unit.poly.name = Поли unit.mega.name = Мега +unit.quad.name = Квад +unit.oct.name = Окт unit.risso.name = Риссо unit.minke.name = Минке unit.bryde.name = Брайд +unit.sei.name = Сейвал +unit.omura.name = Омура unit.alpha.name = Альфа unit.beta.name = Бета unit.gamma.name = Гамма +unit.scepter.name = Скипетр +unit.reign.name = Власть +# unit.vela.name = Vela +unit.corvus.name = Ворон +block.resupply-point.name = Пункт снабжения block.parallax.name = Параллакс block.cliff.name = Скала block.sand-boulder.name = Песчаный валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Соль -block.saltrocks.name = Соляные камни +block.salt-wall.name = Соляная стена block.pebbles.name = Галька block.tendrils.name = Споровые усики -block.sandrocks.name = Песчаные камни +block.sand-wall.name = Песчаная стена block.spore-pine.name = Споровая сосна -block.sporerocks.name = Споровые камни -block.rock.name = Каменный валун -block.snowrock.name = Заснеженный валун +block.spore-wall.name = Споровая стена +block.boulder.name = Каменный валун +block.snow-boulder.name = Заснеженный валун block.snow-pine.name = Заснеженная сосна block.shale.name = Сланец block.shale-boulder.name = Сланцевый валун block.moss.name = Мох block.shrubs.name = Кусты block.spore-moss.name = Споровый мох -block.shalerocks.name = Сланцевые камни +block.shale-wall.name = Сланцевая стена block.scrap-wall.name = Стена из металлолома block.scrap-wall-large.name = Большая стена из металлолома block.scrap-wall-huge.name = Огромная стена из металлолома @@ -937,13 +990,17 @@ block.craters.name = Кратеры block.sand-water.name = Песок с водой block.darksand-water.name = Тёмный песок с водой block.char.name = Выжженная земля -block.holostone.name = Голографический камень +block.dacite.name = Дацит +block.dacite-wall.name = Дацитовая стена block.ice-snow.name = Заснеженный лёд -block.rocks.name = Камни -block.icerocks.name = Ледяные камни -block.snowrocks.name = Снежные камни -block.dunerocks.name = Тёмные песчаные камни +block.stone-wall.name = Каменная стена +block.ice-wall.name = Ледяная стена +block.snow-wall.name = Снежная стена +block.dune-wall.name = Тёмная песчаная стена block.pine.name = Сосна +block.dirt.name = Земля +block.dirt-wall.name = Земляная стена +block.mud.name = Грязь block.white-tree-dead.name = Мёртвое белое дерево block.white-tree.name = Белое дерево block.spore-cluster.name = Скопление спор @@ -959,10 +1016,9 @@ block.dark-panel-4.name = Тёмная панель 4 block.dark-panel-5.name = Тёмная панель 5 block.dark-panel-6.name = Тёмная панель 6 block.dark-metal.name = Тёмный металл -block.ignarock.name = Обожжённый камень +block.basalt.name = Базальт block.hotrock.name = Горячий камень block.magmarock.name = Магмовый камень -block.cliffs.name = Скалы block.copper-wall.name = Медная стена block.copper-wall-large.name = Большая медная стена block.titanium-wall.name = Титановая стена @@ -998,7 +1054,7 @@ block.underflow-gate.name = Избыточный шлюз block.silicon-smelter.name = Кремниевая плавильня block.phase-weaver.name = Фазовый ткач block.pulverizer.name = Измельчитель -block.cryofluidmixer.name = Мешалка криогенной жидкости +block.cryofluid-mixer.name = Мешалка криогенной жидкости block.melter.name = Плавильня block.incinerator.name = Мусоросжигатель block.spore-press.name = Споровый пресс @@ -1011,7 +1067,7 @@ block.diode.name = Диод block.battery.name = Аккумулятор block.battery-large.name = Большой аккумулятор block.combustion-generator.name = Генератор внутреннего сгорания -block.turbine-generator.name = Паровой генератор +block.steam-generator.name = Паровой генератор block.differential-generator.name = Дифференциальный генератор block.impact-reactor.name = Импульсный реактор block.mechanical-drill.name = Механический бур @@ -1073,6 +1129,7 @@ block.container.name = Контейнер block.launch-pad.name = Пусковая площадка block.launch-pad-large.name = Большая пусковая площадка block.segment.name = Сегмент +block.command-center.name = Командный центр block.ground-factory.name = Наземная фабрика block.air-factory.name = Воздушная фабрика block.naval-factory.name = Морская фабрика @@ -1089,8 +1146,11 @@ block.overdrive-dome.name = Сверхприводный купол block.switch.name = Переключатель block.micro-processor.name = Микропроцессор block.logic-processor.name = Логический процессор +block.hyper-processor.name = Гипер процессор block.logic-display.name = Логический дисплей -block.memory-cell.name = Запоминающее устройство +block.large-logic-display.name = Большой логический дисплей +block.memory-cell.name = Ячейка памяти +block.memory-bank.name = Блок памяти team.blue.name = Синяя team.crux.name = Красная @@ -1151,7 +1211,7 @@ block.kiln.description = Выплавляет песок и свинец в со block.plastanium-compressor.description = Производит пластан из нефти и титана. block.phase-weaver.description = Синтезирует фазовую ткань из радиоактивного тория и песка. Требуется огромное количество энергии для работы. block.alloy-smelter.description = Объединяет титан, свинец, кремний и медь для производства кинетического сплава. -block.cryofluidmixer.description = Смешивает воду и мелкий титановый порошок в криогенную жидкость. Неотъемлемая часть при использования ториевого реактора +block.cryofluid-mixer.description = Смешивает воду и мелкий титановый порошок в криогенную жидкость. Неотъемлемая часть при использования ториевого реактора block.blast-mixer.description = Раздавливает и смешивает скопления спор с пиротитом для получения взрывчатого вещества. block.pyratite-mixer.description = Смешивает уголь, свинец и песок в легковоспламеняющийся пиротит. block.melter.description = Плавит металлолом в шлак для дальнейшей обработки или использования в турелях «Волна». @@ -1217,7 +1277,7 @@ block.battery.description = Накапливает энергию как буф block.battery-large.description = Хранит гораздо больше энергии, чем обычный аккумулятор. block.combustion-generator.description = Вырабатывает энергию путём сжигания легковоспламеняющихся материалов, таких как уголь. block.thermal-generator.description = Генерирует энергию, когда находится в горячих местах. -block.turbine-generator.description = Усовершенствованный генератор сгорания. Более эффективен, но дополнительно требует воду для выработки пара. +block.steam-generator.description = Усовершенствованный генератор сгорания. Более эффективен, но дополнительно требует воду для выработки пара. block.differential-generator.description = Генерирует большое количество энергии. Использует разницу температур между криогенной жидкостью и горящим пиротитом. block.rtg-generator.description = Простой, надежный генератор. Использует тепло распадающихся радиоактивных соединений для производства энергии с низкой скоростью. block.solar-panel.description = Обеспечивает небольшое количество энергии от солнца. @@ -1226,10 +1286,10 @@ block.thorium-reactor.description = Генерирует значительно block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса. block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы постоянно выдаются в медленном темпе. Способен добывать только базовые ресурсы. block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур. -block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. +block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии. block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод. -block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к использованию споры. +block.cultivator.description = Выращивает крошечные концентрации спор из атмосферы в готовые к использованию споры. block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения, добывая нефть. block.core-shard.description = Первая итерация капсулы ядра. После уничтожения, весь контакт с регионом теряется. Не позволяйте этому случиться. block.core-foundation.description = Вторая версия ядра. Лучше бронировано. Хранит больше ресурсов. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index bbe0f390c6..0d29e6a89e 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -20,6 +20,8 @@ gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]Nytt rekord! copied = Kopierad. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Ljud load.map = Kartor @@ -63,8 +65,7 @@ stat.delivered = Resources Launched: stat.playtime = Tid Spelat:[accent] {0} stat.rank = Slutgiltiga Rank: [accent]{0} -launcheditems = [accent]Launched Items -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +globalitems = [accent]Global Items map.delete = Är du säker på att du vill ta bort mappen "[accent]{0}[]"? level.highscore = High Score: [accent]{0} level.select = Nivåval @@ -114,6 +115,7 @@ mod.disable = Disable mod.content = Content: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Om name = Namn: noname = Välj ett[accent] namn[] först. +planetmap = Planet Map +launchcore = Launch Core filename = Filnamn: unlocked = Nytt innehåll upplåst! completed = [accent]Avklarad @@ -144,6 +148,7 @@ techtree = Teknologiträd research.list = [lightgray]Forskning: research = Forskning researched = [lightgray]{0} framforskat. +research.progress = {0}% complete players = {0} spelare online players.single = {0} spelare online players.search = search @@ -340,6 +345,11 @@ waves.load = Läs från Urklipp waves.invalid = Invalid waves in clipboard. waves.copied = Vågor kopierade. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Redigera... @@ -459,7 +469,8 @@ locked = Låst complete = [lightgray]Nå: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} launch = < LAUNCH > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {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. @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Okänt nätverksfel. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafik settings.cleardata = Rensa 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.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pausat > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Storlek +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Skott blocks.reload = Shots/Second blocks.ammo = Ammunition +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Bättre Borr Krävs bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = grader unit.seconds = sekunder +unit.minutes = mins unit.persecond = /sek +unit.perminute = /min unit.timesspeed = x hastighet unit.percent = % +unit.shieldhealth = shield health unit.items = föremål unit.thousands = k unit.millions = mil +unit.billions = b category.general = Allmänt category.power = Energi category.liquids = Vätskor @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move x keybind.move_y.name = Move y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Vågtimer rules.waves = Vågor rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Föremål content.liquid.name = Vätskor @@ -830,9 +878,11 @@ liquid.water.name = Vatten liquid.slag.name = Slag liquid.oil.name = Olja liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Fart: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sandbumling block.grass.name = Gräs block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Saltstenar +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sandstenar +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Sten -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Mossa block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Kratrar block.sand-water.name = Sandvatten block.darksand-water.name = Mörksandvatten block.char.name = Char -block.holostone.name = Holosten +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Issnö -block.rocks.name = Stenar -block.icerocks.name = Isstenar -block.snowrocks.name = Snöstenar -block.dunerocks.name = Dynstenar +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Tall +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Vitt Dött Träd block.white-tree.name = Vitt Träd block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Mörk Panel 4 block.dark-panel-5.name = Mörk Panel 5 block.dark-panel-6.name = Mörk Panel 6 block.dark-metal.name = Mörk Metall -block.ignarock.name = Ignasten +block.basalt.name = Basalt block.hotrock.name = Het Sten block.magmarock.name = Magmasten -block.cliffs.name = Klippor block.copper-wall.name = Kopparvägg block.copper-wall-large.name = Stor Kopparvägg block.titanium-wall.name = Titanvägg @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Kiselsmältare block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulveriserare -block.cryofluidmixer.name = Cryofluid Mixer +block.cryofluid-mixer.name = Cryofluid Mixer block.melter.name = Smältare block.incinerator.name = Förbrännare block.spore-press.name = Spore Press @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Batteri block.battery-large.name = Stort Batteri block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Ånggenerator +block.steam-generator.name = Ånggenerator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mekanisk Borr @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blåa team.crux.name = röda team.sharded.name = orangea @@ -1126,7 +1199,7 @@ block.kiln.description = Smelts sand and lead into the compound known as metagla block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. -block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.cryofluid-mixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. @@ -1192,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. 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. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 8fcf97cb03..6a89ac29ca 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -20,6 +20,8 @@ gameover = Game Over gameover.pvp = ทีมที่ชนะคือทีม[accent] {0}[]! highscore = [accent]คะแนนสูงสุดใหม่! copied = คัดลอกแล้ว. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = เสียง load.map = แมพ @@ -63,8 +65,7 @@ stat.delivered = ทรัพยากรที่ส่งไปได้: stat.playtime = Time Played:[accent] {0} stat.rank = ระดับ: [accent]{0} -launcheditems = [accent]ไอเท็มที่ส่งไปได้ -launchinfo = [unlaunched][[ส่ง] แกนกลางของคุณเพื่อที่จะรับไอเท็มที่ไฮไลท์สีน้ำเงิน +globalitems = [accent]Global Items map.delete = คุณแน่ใจหรือว่าจะลบแมพชื่อ "[accent]{0}[]"? level.highscore = คะแนนสูงสุด: [accent]{0} level.select = เลือกด่าน @@ -114,6 +115,7 @@ mod.disable = ปิดใช้งาน mod.content = Content: mod.delete.error = ไม่สามารถลบมอดได้. ไฟล์อาจอยู่ในระหว่างการใช้งาน. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]dependencies หาย: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = เกี่ยวกับ name = ชื่อ: noname = ใส่ชื่อ[accent] ผู้เล่น[] ก่อน. +planetmap = Planet Map +launchcore = Launch Core filename = ชื่อไฟล์: unlocked = content ใหม่ปลดล็อค! completed = [accent]สำเร็จ @@ -144,6 +148,7 @@ techtree = ความคืบหน้าในการวิจัย research.list = [lightgray]วิจัย: research = วิจัย researched = [lightgray]{0} วิจัยแล้ว. +research.progress = {0}% complete players = {0} ผู้เล่น players.single = {0} ผู้เล่น players.search = search @@ -340,6 +345,11 @@ waves.load = โหลดจากคลิปบอร์ด waves.invalid = waves ในคลิปบอร์ดไม่ถูกต้อง waves.copied = คัดลอก Waves แล้ว waves.none = ไม่ได้กำหนดศัตรู\nwave layouts เปล่าจะถูกแทนที่โดย layout ค่าเริ่มต้นของเกม + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<ค่าเริ่่มต้น> details = รสยละเอียด... edit = แก้ไข... @@ -459,7 +469,8 @@ locked = ล็อค complete = [lightgray]สำเร็จ: requirement.wave = ถึง Wave ที่ {0} ใน {1} requirement.core = ทำลาย Core ของศัตรูใน {0} -requirement.unlock = ปลดล็อค {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = เล่นต่อในโซน:\n[lightgray]{0} bestwave = [lightgray]Wave สูงสุด: {0} launch = < ส่ง > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = เพิ่มทั้งหมด +launch.destination = Destination: {0} configure.invalid = จำนวนต้อยู่ระหว่าง 0 ถึง {0}. zone.unlocked = [lightgray]{0} ปลดล็อคแล้ว zone.requirement.complete = ข้อเรียกร้องสำหรับ {0} สำเร็จแล้ว:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = ไม่สามารถเริ่มต้น bloom ได้\nอุปกรณ์ของคุณอาจไม่รองรับ +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = กราฟิก settings.cleardata = เคลียร์ข้อมูลเกม... settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลเกม?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้! settings.clearall.confirm = [scarlet]คำเตือน![]\nการกระทำนี้จะลบข้อมูลทั้งหมด นั้นรวมไปถึงเซฟ, แมพ, สิ่งที่ปลดล็อคแล้วและ keybinds.\nเมื่อคุณกด 'โอเค' เกมจะลบข้อมูลทุกอย่างและออกโดยอัตโนมัติ +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< หยุดชั่วคราว > clear = เคลียร์ banned = [scarlet]แบน @@ -557,8 +585,11 @@ blocks.itemsmoved = ความเร็วเคลื่อนที่ blocks.launchtime = เวลาระหว่างการส่ง blocks.shootrange = ระยะยิง blocks.size = ขนาด +blocks.displaysize = Display Size blocks.liquidcapacity = จุของเหลว blocks.powerrange = ระยะพลังงาน +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = จำนวนการเชื่อมต่อสูงสุด blocks.poweruse = ใช้พลังงาน blocks.powerdamage = หน่วยพลังงาน/ดาเมจ @@ -574,11 +605,14 @@ blocks.boosteffect = แอฟเฟ็คของบูสต์ blocks.maxunits = จำนวนยูนิตสูงสุด blocks.health = เลือด blocks.buildtime = เวลาในการสร้าง +blocks.maxconsecutive = Max Consecutive blocks.buildcost = ใช้ blocks.inaccuracy = ความคลาดเคลื่อน blocks.shots = นัด blocks.reload = นัด/วินาที blocks.ammo = กระสุน +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = จำเป็นต้องใช้เครื่องขุดที่ดีกว่า bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = หน่วยของเหลว unit.powerunits = หน่วยพลังงาน unit.degrees = องศา unit.seconds = วินาที +unit.minutes = mins unit.persecond = /วินาที +unit.perminute = /min unit.timesspeed = เท่าเร็วขึ้น unit.percent = % +unit.shieldhealth = shield health unit.items = ไอเท็ม unit.thousands = k unit.millions = mil +unit.billions = b category.general = ทั่วไป category.power = พลังงาน category.liquids = ของเหลว @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = โจมตี command.rally = ชุมนุม command.retreat = ถอยกลับ +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = เคลื่อนที่ในแกน x keybind.move_y.name = เคลี่อนที่ในแกน y keybind.mouse_move.name = ตามเม้าส์ +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = เลือกภูมิภาค keybind.schematic_menu.name = เมนู Schematic @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = วางเป็นแนวทแยง keybind.pick.name = เลือกบล็อค keybind.break_block.name = ทุบบล็อค keybind.deselect.name = ยกเลิกการเบือก +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = ยิง keybind.zoom.name = ซูม keybind.menu.name = เมนู @@ -782,6 +825,7 @@ rules.reactorexplosions = การระเบิดของ rules.wavetimer = ตัวนับเวลาปล่อยคลื่น(รอบ) rules.waves = คลื่น(รอบ) rules.attack = โหมดการโจมตี +rules.buildai = AI Building rules.enemyCheat = AI (ทีมสีแดง) มีทรัพยากรไม่จำกัด rules.blockhealthmultiplier = พหุคูณเลือดของบล็อค rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = ยูนิต rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = ไอเท็ม content.liquid.name = ของเหลว @@ -830,9 +878,11 @@ liquid.water.name = น้ำ liquid.slag.name = เศษแร่ liquid.oil.name = น้ำมัน liquid.cryofluid.name = โครโรฟิวล์ + item.explosiveness = [lightgray]ค่าการระเบิด: {0}% item.flammability = [lightgray]ความไวต่อไฟ: {0}% item.radioactivity = [lightgray]ค่ากัมมันตภาพรังสี: {0}% + unit.health = [lightgray]เลือด: {0} unit.speed = [lightgray]ความเร็ว: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = ครอว์เลอร์ unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = ก้อนหินทราย block.grass.name = หญ้า block.slag.name = Slag block.salt.name = เกลือ -block.saltrocks.name = หินเกลือ +block.salt-wall.name = Salt Wall block.pebbles.name = ก้อนกรวด block.tendrils.name = ไม้เลื้อย -block.sandrocks.name = หินทราย +block.sand-wall.name = Sand Wall block.spore-pine.name = ต้นสนสปอร์ -block.sporerocks.name = หินสปอร์ -block.rock.name = หิน -block.snowrock.name = ก้อนหิมะ +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = ต้นสนที่คลุมหิมะ block.shale.name = หินดินดาน block.shale-boulder.name = ก้อนหินดินดาน block.moss.name = ตะไคร่น้ำ block.shrubs.name = พุ่มไม้ block.spore-moss.name = พุ่มไม้สปอร์ -block.shalerocks.name = หิน +block.shale-wall.name = Shale Wall block.scrap-wall.name = กำแพงเศษเหล็ก block.scrap-wall-large.name = กำแพงเศษเหล็กขนาดใหญ่ block.scrap-wall-huge.name = กำแพงเศษเหล็กขนาดใหญ่มาก @@ -919,13 +979,17 @@ block.craters.name = หลุมอุกกาบาต block.sand-water.name = น้ำบนทราย block.darksand-water.name = น้ำบนทรายดำ block.char.name = ถ่าน -block.holostone.name = หินโฮโล +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = น้ำแข็งหิมะ -block.rocks.name = หิน -block.icerocks.name = หินน้ำแข็ง -block.snowrocks.name = หินหิมะ -block.dunerocks.name = หินเนินทราย +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = ต้นสน +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = ต้นไม้ขาวที่ตายแล้ว block.white-tree.name = ต้มไม้ขาว block.spore-cluster.name = กลุ่มสปอร์ @@ -941,10 +1005,9 @@ block.dark-panel-4.name = แผ่นดำ 4 block.dark-panel-5.name = แผ่นดำ 5 block.dark-panel-6.name = แผ่นดำ 6 block.dark-metal.name = เหล็กดำ -block.ignarock.name = หินอิกน่า +block.basalt.name = Basalt block.hotrock.name = หินร้อน block.magmarock.name = หินแมกม่า -block.cliffs.name = หน้าผา block.copper-wall.name = กำแพงทองแดง block.copper-wall-large.name = กำแพงทองแดงขนาดใหญ่ block.titanium-wall.name = กำแพงไทเทเนี่ยม @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = เตาเผาซิลิกอน block.phase-weaver.name = เครื่องทอใยเฟส block.pulverizer.name = เครื่องบด -block.cryofluidmixer.name = เครื่องผสมสารหล่อเย็น +block.cryofluid-mixer.name = เครื่องผสมสารหล่อเย็น block.melter.name = เตาหลอม block.incinerator.name = เตาเผาขยะ block.spore-press.name = เครื่องอัดสปอร์ @@ -993,7 +1056,7 @@ block.diode.name = ไดโอดแบตเตอรี่ block.battery.name = แบตเตอรี่ block.battery-large.name = แบตเตอรี่ขนาดใหญ่ block.combustion-generator.name = เครื่องกำเนิดไฟฟ้าโดยการสันดาป -block.turbine-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ +block.steam-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ block.differential-generator.name = เครื่องกำเนิดไฟฟ้าดิฟเฟอเร่นเตอร์ block.impact-reactor.name = เตาปฏิกรณ์อัดกระแทก block.mechanical-drill.name = เครื่องขุดเชิงกล @@ -1055,6 +1118,7 @@ block.container.name = ตู้เก็บของ block.launch-pad.name = ฐานส่งของ block.launch-pad-large.name = ฐานส่งของขนาดใหญ่ block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = น้ำเงิน team.crux.name = แดง team.sharded.name = ส้ม @@ -1126,7 +1199,7 @@ block.kiln.description = เผาทรายและตะกั่วเป block.plastanium-compressor.description = ผลิตพลาสตาเนี่ยมจากน้ำมันและไทเทเนี่ยม. block.phase-weaver.description = สังเคราะห์ใยเฟสจากทอเรี่ยมที่มีรังสีและทราย. จำเป็นต้องใช้พลังงานจำนวนมากจึงจะทำงานง. block.alloy-smelter.description = ผสมไทเทเนี่ยม, ตะกั่ว, ซิลิก้อนและทองแดงเพื่อที่จะผลิตเซิร์จอัลลอย. -block.cryofluidmixer.description = ผสมน้ำและผงไทเทเนี่ยมบริสุทธิ์เป็นไครโยฟลูอิด. สำคัญสำหรับเตาปฏิกรณ์ทอเรี่ยม. +block.cryofluid-mixer.description = ผสมน้ำและผงไทเทเนี่ยมบริสุทธิ์เป็นไครโยฟลูอิด. สำคัญสำหรับเตาปฏิกรณ์ทอเรี่ยม. block.blast-mixer.description = บอและผสมสปอร์กับไพไรต์เพื่อผลิตสารประกอบระเบิด. block.pyratite-mixer.description = ผสมถ่านหิน, ตะกั่วและทรายเข้าด้วยกันเป็นไฟไรต์ที่ติดไฟได้ง่าย. block.melter.description = หลอมเศษเหล็กเป็กกากแร่เพื่อใช้สำหรับกระบวนการต่อไปหรือใช้ในป้อมปืนเวฟ. @@ -1192,7 +1265,7 @@ block.battery.description = เก็บพลังงานเป็นบั block.battery-large.description = เก็บพลังงานได้เยอะกว่าแบตเตอรี่ธรรมดา. block.combustion-generator.description = ผลิตพลังงานโดยการวัสดุติดไฟ เช่นถ่านหิน. block.thermal-generator.description = ผลิตพลังงานเมื่อวานในที่ร้อน (บนหินร้อนหรือหินแม็คม่า) -block.turbine-generator.description = เครื่องกำเนิดไฟฟ้าเผาไหม้ขั้นสูง. ประสิทธิภาพสูงกว่า แต่ต้องใช้น้ำด้วยเพื่อผลิตไอน้ำ. +block.steam-generator.description = เครื่องกำเนิดไฟฟ้าเผาไหม้ขั้นสูง. ประสิทธิภาพสูงกว่า แต่ต้องใช้น้ำด้วยเพื่อผลิตไอน้ำ. block.differential-generator.description = ผลิตไฟฟ้าจำนวนมาก. ใช้ความต่างของอุณหภูมิระหว่างไครโยฟลูอิดและไพไรต์ที่กำลังไหม้. block.rtg-generator.description = เครื่องกำเนิดไฟฟ้าที่ใช้ง่ายและไว้ใจได้. ใช้ความร้อนจากการสลายของสารกัมมัตภาพรังสีเพื่อใช้ผลิตพลังงานอย่างช้าๆ. block.solar-panel.description = ให้พลังงานจากแสงอาทิตย์จำนวนน้อย. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 006ef4ae92..edfae05b29 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -20,6 +20,8 @@ gameover = Cekirdegin yok edildi. gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]Yeni Yuksek skor! copied = Copied. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sounds load.map = Maps @@ -63,8 +65,7 @@ stat.delivered = Resources Launched: stat.playtime = Time Played:[accent] {0} stat.rank = Final Rank: [accent]{0} -launcheditems = [accent]Launched Items -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +globalitems = [accent]Global Items map.delete = Su haritayi silmek istediginden emin misin? "[accent]{0}[]"? level.highscore = Yuksek Skor: [accent]{0} level.select = Seviye secimi @@ -114,6 +115,7 @@ mod.disable = Disable mod.content = Content: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Hakkinda name = isim: noname = Pick a[accent] player name[] first. +planetmap = Planet Map +launchcore = Launch Core filename = File Name: unlocked = Yeni yapi acildi!! completed = [accent]Completed @@ -144,6 +148,7 @@ techtree = Tech Tree research.list = [lightgray]Research: research = Research researched = [lightgray]{0} researched. +research.progress = {0}% complete players = {0} oyuncu cevrimici players.single = {0} oyuncu cevrimici players.search = search @@ -340,6 +345,11 @@ 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. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Edit... @@ -459,7 +469,8 @@ locked = Locked complete = [lightgray]Complete: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best: {0} launch = Launch @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {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. @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unkown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafikler 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.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = Duraklatildi clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Menzil blocks.size = Buyukluk +blocks.displaysize = Display Size blocks.liquidcapacity = Sivi kapasitesi blocks.powerrange = Menzil +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Guc kullanimi blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Can blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = sekme blocks.shots = vuruslar blocks.reload = Yeniden doldurma blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = Litre unit.powerunits = Volt unit.degrees = derece unit.seconds = saniye +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = esya unit.thousands = k unit.millions = mil +unit.billions = b category.general = General category.power = Guc category.liquids = sivilar @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Sol/Sag hareket keybind.move_y.name = Yukari/asagi hareket keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Eldeki yapiyi birak +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Sik keybind.zoom.name = Yaklas keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Esyalar content.liquid.name = Sivilar @@ -830,9 +878,11 @@ liquid.water.name = Su liquid.slag.name = Slag liquid.oil.name = Benzin liquid.cryofluid.name = kriyo sivisi + item.explosiveness = [lightgray]Patlayicilik: {0} item.flammability = [lightgray]Yanbilirlik: {0} item.radioactivity = [lightgray]Radyoaktivite: {0} + unit.health = [lightgray]Can: {0} unit.speed = [lightgray]hiz: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall 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.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ 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.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = bakir duvar block.copper-wall-large.name = buyuk bakir duvar block.titanium-wall.name = Titanium Wall @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silikon eritici block.phase-weaver.name = Dokumaci block.pulverizer.name = pulvarizor -block.cryofluidmixer.name = Cryosivisi karistiricisi +block.cryofluid-mixer.name = Cryosivisi karistiricisi block.melter.name = eritici block.incinerator.name = isi firini block.spore-press.name = Spore Press @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = batarya block.battery-large.name = buyuk batarya block.combustion-generator.name = sicaklik jenaratoru -block.turbine-generator.name = termal jenaratoru +block.steam-generator.name = termal jenaratoru block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mekanikal Kazici @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1126,7 +1199,7 @@ block.kiln.description = Smelts sand and lead into metaglass. Requires small amo block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. +block.cryofluid-mixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Heats up stone to very high temperatures to obtain lava. @@ -1192,7 +1265,7 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. block.thermal-generator.description = Generates a large amount of power from lava. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.steam-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 15788e2753..1fd6a6618e 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -20,6 +20,8 @@ gameover = Kaybettin gameover.pvp = [accent] {0}[] Takımı kazandı! highscore = [accent]Yeni rekor! copied = Panoya Kopyalandı. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sesler load.map = Haritalar @@ -63,8 +65,7 @@ stat.delivered = Gönderilen Kaynaklar: stat.playtime = Time Played:[accent] {0} stat.rank = Rütbe: [accent]{0} -launcheditems = [accent]Gönderilen Kaynaklar -launchinfo = Mavi ile belirtilen materyallerden edinmek için [unlaunched][[KALKIŞ] yapın. +globalitems = [accent]Global Items map.delete = "[accent]{0}[]" haritasını silmek istediğine emin misin? level.highscore = Rekor: [accent]{0} level.select = Seviye Seçimi @@ -114,6 +115,7 @@ mod.disable = Devre Dışı Bırak mod.content = Content: mod.delete.error = Mod silinemiyor. Dosya kullanımda olabilir. mod.requiresversion = [scarlet]Gereken en düşük oun versiyonu: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Bu modun çalışması için gereken modlar: {0} mod.erroredcontent = [scarlet]İçerik hatası. mod.errors = İçerik yüklenirken bir hata oluştu. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Hakkında name = İsim: noname = Bir[accent] kullanıcı adı[] seçmelisin. +planetmap = Planet Map +launchcore = Launch Core filename = Dosya Adı: unlocked = Yeni içerik açıldı! completed = [accent]Tamamlandı @@ -144,6 +148,7 @@ techtree = Teknoloji Ağacı research.list = [lightgray]Araştırmalar: research = Araştır researched = [lightgray]{0} Araştırıldı. +research.progress = {0}% complete players = {0} çevrimiçi oyuncu players.single = {0} çevrimiçi oyuncu players.search = search @@ -340,6 +345,11 @@ waves.load = Panodan yükle waves.invalid = Panoda geçersiz dalga sayısı var. waves.copied = Dalgalar kopyalandı. waves.none = Düşman bulunamadı.\nBoş dalga düzenlerin otomatik olarak varsayılan düzenle değiştirileceğini unutmayın + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detaylar... edit = Düzenle... @@ -459,7 +469,8 @@ locked = Kilitli complete = [lightgray]Ulaş: requirement.wave = Bölge {1}'de Dalga {0} requirement.core = {0}`da Düşman Çekirdeği Yok Et -requirement.unlock = {0}'I Aç +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Bölgeye Devam Et:\n[lightgray]{0} bestwave = [lightgray]En İyi Dalga: {0} launch = < KALKIŞ > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Yasaklı Bloklar addall = Hepsini Ekle +launch.destination = Destination: {0} configure.invalid = Miktar 0 ve {0} arasında bir sayı olmalı. zone.unlocked = [lightgray]{0} kilidi açıldı. zone.requirement.complete = {0}. dalgaya ulaşıldı:\n{1} bölge şartları karşılandı. @@ -496,6 +508,20 @@ error.io = Ağ I/O hatası. error.any = Bilinmeyen ağ hatası. error.bloom = Kamaşma başlatılamadı.\nCihazınız bu özelliği desteklemiyor olabilir. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafikler settings.cleardata = Oyun Verisini Sil... settings.clear.confirm = Verileri silmek istediğinizden emin misiniz?\nBu işlemi geri alamazsınız! settings.clearall.confirm = [scarlet]Uyarı![]\nBu işlem kayıtlar, haritalar açılan bloklar ve tuş atamaları dahil bütün verileri silecektir.\n"ok" tuşuna bastığınızda bütün verileriniz silinecek ve oyun kapanacaktır. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent] clear = Temizle banned = [scarlet]Yasaklı @@ -557,8 +585,11 @@ blocks.itemsmoved = Hareket Hızı blocks.launchtime = Fırlatmalar Arasındaki Süre blocks.shootrange = Menzil blocks.size = Boyut +blocks.displaysize = Display Size blocks.liquidcapacity = Sıvı Kapasitesi blocks.powerrange = Enerji Menzili +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Bağlantı sayısı blocks.poweruse = Enerji Kullanımı blocks.powerdamage = Enerji/Hasar @@ -574,11 +605,14 @@ blocks.boosteffect = Hızlandırma Efekti blocks.maxunits = Maksimum Aktif Birim blocks.health = Can blocks.buildtime = İnşaat Süresi +blocks.maxconsecutive = Max Consecutive blocks.buildcost = İnşaat Fiyatı blocks.inaccuracy = İskalama Oranı blocks.shots = Atışlar blocks.reload = Atışlar/Sn blocks.ammo = Mermi +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Daha İyi Matkap Gerekli bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = sıvı birimi unit.powerunits = enerji birimi unit.degrees = derece unit.seconds = saniye +unit.minutes = mins unit.persecond = /sn +unit.perminute = /min unit.timesspeed = x hız unit.percent = % +unit.shieldhealth = shield health unit.items = eşya unit.thousands = k unit.millions = mil +unit.billions = b category.general = Genel category.power = Enerji category.liquids = Sıvılar @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Saldır command.rally = Toplan command.retreat = Geri Çekil +command.idle = Idle placement.blockselectkeys = \n[lightgray]Tuş: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = x Ekseninde Hareket keybind.move_y.name = y Ekseninde Hareket keybind.mouse_move.name = Fareyi Takip Et +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Bölge Seç keybind.schematic_menu.name = Şema Menüsü @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Çapraz Yerleştirme keybind.pick.name = Blok Seç keybind.break_block.name = Blok Kır keybind.deselect.name = Seçimleri Kaldır +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Ateş Et keybind.zoom.name = Yakınlaştırma/Uzaklaştırma keybind.menu.name = Menü @@ -782,6 +825,7 @@ rules.reactorexplosions = Reaktör Patlamaları rules.wavetimer = Dalga Zamanlayıcısı rules.waves = Dalgalar rules.attack = Saldırı Modu +rules.buildai = AI Building rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları rules.blockhealthmultiplier = Blok Canı Çarpanı rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Birlikler rules.title.experimental = Deneysel rules.title.environment = Environment rules.lighting = Işıklandırma +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ortam Işığı -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Eşyalar content.liquid.name = Sıvılar @@ -830,9 +878,11 @@ liquid.water.name = Su liquid.slag.name = Cüruf liquid.oil.name = Petrol liquid.cryofluid.name = Kriyosıvı + item.explosiveness = [lightgray]Patlama: {0}% item.flammability = [lightgray]Yanıcılık: {0}% item.radioactivity = [lightgray]Radyoaktivite: {0}% + unit.health = [lightgray]Can: {0} unit.speed = [lightgray]Hız: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Kum Kaya Parçaları block.grass.name = Çimen block.slag.name = Slag block.salt.name = Tuz -block.saltrocks.name = Tuz Taşları +block.salt-wall.name = Salt Wall block.pebbles.name = Çakıl Taşları block.tendrils.name = Tendriller -block.sandrocks.name = Kum Kayaları +block.sand-wall.name = Sand Wall block.spore-pine.name = Spor Çamı -block.sporerocks.name = Spor Kayaları -block.rock.name = Kaya -block.snowrock.name = Karlı Kaya +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Karlı Çam block.shale.name = Şist block.shale-boulder.name = Şist Kayası block.moss.name = Yosun block.shrubs.name = Çalılık block.spore-moss.name = Liken -block.shalerocks.name = Şist Kayaları +block.shale-wall.name = Shale Wall block.scrap-wall.name = Hurda Duvar block.scrap-wall-large.name = Büyük Hurda Duvar block.scrap-wall-huge.name = Dev Hurda Duvar @@ -919,13 +979,17 @@ block.craters.name = Krater block.sand-water.name = Kumlu Su block.darksand-water.name = Kara Kumlu Su block.char.name = Kömür -block.holostone.name = Holotaş +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Buzlu Kar -block.rocks.name = Duvar -block.icerocks.name = Buz Duvarı -block.snowrocks.name = Kar Duvarı -block.dunerocks.name = Çöl Duvarı +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Çam +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Ölü Beyaz Ağaç block.white-tree.name = Beyaz Ağaç block.spore-cluster.name = Spor Kümesi @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Kara Panel 4 block.dark-panel-5.name = Kara Panel 5 block.dark-panel-6.name = Kara Panel 6 block.dark-metal.name = Kara Metal -block.ignarock.name = Eriyik Kaya +block.basalt.name = Basalt block.hotrock.name = Sıcak Kaya block.magmarock.name = Magma Kayası -block.cliffs.name = Uçurumlar block.copper-wall.name = Bakır Duvar block.copper-wall-large.name = Büyük Bakır Duvar block.titanium-wall.name = Titanyum Duvar @@ -980,7 +1043,7 @@ block.underflow-gate.name = Underflow Gate block.silicon-smelter.name = Silikon Fırını block.phase-weaver.name = Faz Örücü block.pulverizer.name = Pulverizatör -block.cryofluidmixer.name = Kriyosıvı Mikseri +block.cryofluid-mixer.name = Kriyosıvı Mikseri block.melter.name = Eritici block.incinerator.name = Yakıcı block.spore-press.name = Spor Presi @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Batarya block.battery-large.name = Büyük Batarya block.combustion-generator.name = Termik Jeneratör -block.turbine-generator.name = Buhar Jeneratörü +block.steam-generator.name = Buhar Jeneratörü block.differential-generator.name = Diferansiyel Jeneratörü block.impact-reactor.name = Patlama Reaktörü block.mechanical-drill.name = Mekanik Matkap @@ -1055,6 +1118,7 @@ block.container.name = Konteyner block.launch-pad.name = Kalkış Pisti block.launch-pad-large.name = Büyük Kalkış Pisti block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = mavi team.crux.name = kırmızı team.sharded.name = turuncu @@ -1126,7 +1199,7 @@ block.kiln.description = Kum ve kurşunu eritir ve metacam olarak bilinen malzem block.plastanium-compressor.description = Petrol ve titanyumdan plastanyum üretir. block.phase-weaver.description = Kum ve radyoaktif toryumdan faz örgüsü üretir. Çalışması için çok miktarda enerji gerekir. block.alloy-smelter.description = Akı alaşımı üretmek için titanyum, kurşun, silikon ve bakırı birleştirir. -block.cryofluidmixer.description = Su ve titanyum tozunu karıştırıp kriyosıvı üretir. Toryum reaktörü kullanımı için gereklidir. +block.cryofluid-mixer.description = Su ve titanyum tozunu karıştırıp kriyosıvı üretir. Toryum reaktörü kullanımı için gereklidir. block.blast-mixer.description = Patlayıcı bileşen üretmek için spor kapsüllerini pirratit ile ezer ve karıştırır. block.pyratite-mixer.description = Kömür, kurşun ve kumu karıştırıp oldukça yanıcı olan pirratit üretir. block.melter.description = Wave taretlerinde kullanılması veya daha çok işlemesi için hurdayı eritip cürufa çevirir. @@ -1192,7 +1265,7 @@ block.battery.description = Enerji fazlasını yedek olarak saklar. Enerji açı 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. block.thermal-generator.description = Sıcak bölgelere konulduğunda enerji üretir. -block.turbine-generator.description = Daha gelişmiş bir termik jeneratör. Daha verimlidir, ama buhar üretebilmek için suya ihtiyaç duyar. +block.steam-generator.description = Daha gelişmiş bir termik jeneratör. Daha verimlidir, ama buhar üretebilmek için suya ihtiyaç duyar. block.differential-generator.description = Çok miktarda enerji üretir. Kriyosıvı ve yanan pirratit arasındaki sıcaklık farkından yararlanır. block.rtg-generator.description = Basit, güvenilir bir reaktör. Bozunan radyoaktif materyallerin ısısını kullanır. block.solar-panel.description = Güneşten küçük miktarda enerji üretir. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 34e41d3e46..df5bfc1db1 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -13,14 +13,15 @@ link.google-play.description = Завантажити для Android з Google P link.f-droid.description = Завантажити для Android з F-Droid link.wiki.description = Офіційна ігрова Wiki link.suggestions.description = Запропонувати нові функції -linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну. +linkfail = Не вдалося перейти за посиланням!\nURL-адреса скопійована в буфер обміну. screenshot = Зняток мапи збережено до {0} screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. gameover = Гра завершена gameover.pvp = [accent]{0}[] команда перемогла! highscore = [accent]Новий рекорд! copied = Скопійовано. -indevpopup = Наразі [accent]6.0[] знаходиться у стадії [accent]pre-alpha[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення гри;\n- Більшість [scarlet]ШІ бойових одиниць[] не працює;\n- Багато одиниць [scarlet]відсутні[] або незавершені;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord. +indev.popup = Наразі [accent]6.0[] знаходиться у стадії [accent]альфа[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення гри;\n- Більшість [scarlet]ШІ бойових одиниць[] не працює належним чином;\n- Багато одиниць [scarlet]відсутні[] або незавершені;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord. +indev.notready = Ця частина гри ще не готова load.sound = Звуки load.map = Мапи @@ -40,8 +41,8 @@ be.check = Перевірити на наявність оновлень schematic = Схема schematic.add = Зберегти схему… schematics = Схеми -schematic.replace = Схема з такою назвою вже існує. Замінити її? -schematic.exists = Схема з такою назвою вже існує. +schematic.replace = Схема з такою назвою вже є. Замінити її? +schematic.exists = Схема з такою назвою вже є. schematic.import = Імпортувати схему… schematic.exportfile = Експортувати файл schematic.importfile = Імпортувати файл @@ -51,7 +52,7 @@ schematic.copy.import = Імпортувати з клавіатури schematic.shareworkshop = Поширити в Майстерню schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обернути схему schematic.saved = Схема збережена. -schematic.delete.confirm = Ця схема буде повністю випалена Викорінювачем. +schematic.delete.confirm = Ви справді хочете видалити цю схему? schematic.rename = Перейменувати схему schematic.info = {0}x{1}, {2} блоків @@ -69,7 +70,7 @@ map.delete = Ви впевнені, що хочете видалити мапу level.highscore = Рекорд: [accent]{0} level.select = Вибір мапи level.mode = Режим гри: -coreattack = < Ядро знаходиться під атакою! > +coreattack = < Ядро перебуває під атакою! > nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nанігіляція неминуча database = База даних ядра savegame = Зберегти гру @@ -78,7 +79,7 @@ joingame = Мережева гра customgame = Користувацька гра newgame = Нова гра none = <нічого> -minimap = Міні-мапа +minimap = Мінімапа position = Місцезнаходження close = Закрити website = Вебсайт @@ -98,15 +99,15 @@ committingchanges = Здійснення змін done = Зроблено feature.unsupported = Ваш пристрій не підтримує цю функцію -mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. +mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.alpha = [accent](Альфа) mods = Модифікації mods.none = [lightgray]Модифікацій не знайдено! -mods.guide = Посібник з модифікацій +mods.guide = Посібник із модифікацій mods.report = Повідомити про ваду mods.openfolder = Відкрити теку mods.reload = Перезавантажити -mods.reloadexit = Гра зараз закриється, щоб перезавантажити модифікації +mods.reloadexit = Гра зараз закриється, щоби перезавантажити модифікації mod.display = [gray]Модифікація:[orange] {0} mod.enabled = [lightgray]Увімкнено mod.disabled = [scarlet]Вимкнено @@ -114,29 +115,32 @@ mod.disable = Вимкнути mod.content = Зміст: mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. mod.requiresversion = [scarlet]Необхідна мінімальна версія гри: [accent]{0} +mod.outdated = [scarlet]Не сумісна з V6 (немає мінімальної версі гри (англ. min-game-version): 105) mod.missingdependencies = [scarlet]Відсутні залежності: {0} -mod.erroredcontent = [scarlet]Помилки при завантаженні +mod.erroredcontent = [scarlet]Помилки під час завантаження mod.errors = Виникли помилки під час завантаження змісту. mod.noerrorplay = [scarlet]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх. mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена. mod.enable = Увімкнути -mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. +mod.requiresrestart = А тепер гра закриється, щоби застосувати зміни модифікацій. mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.import = Імпортувати модифікацію mod.import.file = Імпортувати файл mod.import.github = Імпортувати з GitHub -mod.jarwarn = [scarlet]JAR-модифікації по своїй суті небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела! -mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоб видалити його, видаліть цю модифікацію. +mod.jarwarn = [scarlet]JAR-модифікації за своєю суттю небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела! +mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоби видалити його, видаліть цю модифікацію. mod.remove.confirm = Цю модифікацію буде видалено. mod.author = [lightgray]Автор:[] {0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} -mod.preview.missing = До публікації цієї модифікації в Майстерні, ви повинні додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. -mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію у теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. +mod.preview.missing = До публікації цієї модифікації в Майстерні, ви мусите додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. +mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію в теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри. about.button = Про гру name = Ім’я: noname = Спочатку придумайте[accent] собі ім’я[]. +planetmap = Планетна мапа +launchcore = Запустити ядро filename = Назва файлу: unlocked = Доступний новий вміст! completed = [accent]Завершено @@ -150,28 +154,28 @@ players.single = {0} гравець на сервері players.search = пошук players.notfound = [gray]гравців не знайдено server.closing = [accent]Закриття сервера… -server.kicked.kick = Ви були вигнані з сервера! +server.kicked.kick = Ви були вигнані із сервера! server.kicked.whitelist = Ви не в білому списку сервера. -server.kicked.serverClose = Сервер закрито. +server.kicked.serverClose = Сервер зачинено. server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте. server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру! server.kicked.serverOutdated = Застарілий сервер! Попрохайте адміністратора сервера оновити сервер/гру! server.kicked.banned = Ви заблоковані на цьому сервері. -server.kicked.typeMismatch = Цей сервер не сумісний з вашим типом збірки. +server.kicked.typeMismatch = Цей сервер не сумісний із вашим типом збірки. server.kicked.playerLimit = Цей сервер — заповнений. Дочекайтесь вільного місця. server.kicked.recentKick = Нещодавно вас вигнали.\nПочекайте трохи перед наступним під’єднанням. -server.kicked.nameInUse = На цьому сервері вже є хтось з таким ім’ям. +server.kicked.nameInUse = На цьому сервері вже є хтось із таким ім’ям. 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 доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер. +host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які перебувають в тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви надали Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дають змогу виявити сервер. join.info = Тут ви можете ввести [accent]IP сервера[] для під’єднання або знайти сервери у [accent]локальній[] чи [accent]глобальній мережі[] для приєднання до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Це не є автоматичним глобальним списком серверів; якщо ви хочете приєднатися до когось через IP, вам доведеться попросити власника сервера дати свій ip. hostserver = Запустити багатокористувацький сервер invitefriends = Запросити друзів -hostserver.mobile = Запустити\nсервер +hostserver.mobile = Запустити сервер host = Запустити hosting = [accent]Відкриття сервера… hosts.refresh = Оновити @@ -260,25 +264,25 @@ ok = Гаразд open = Відкрити customize = Налаштувати правила cancel = Скасувати -openlink = Відкрити посилання +openlink = Перейти за посиланням copylink = Скопіювати посилання back = Назад data.export = Вивантажити дані data.import = Завантажити дані -data.openfolder = Відкрити теку з даними +data.openfolder = Відчинити теку з даними data.exported = Дані вивантажено. data.invalid = Це не дійсні ігрові дані. -data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. +data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється. quit.confirm = Ви дійсно хочете вийти? quit.confirm.tutorial = Ви впевнені, що знаєте що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[] loading = [accent]Завантаження… reloading = [accent]Перезавантаження модифікацій… saving = [accent]Збереження… -respawn = [accent][[{0}][], щоб відродитися в ядрі +respawn = [accent][[{0}][], щоби відродитися в ядрі cancelbuilding = [accent][[{0}][], щоб очистити план -selectschematic = [accent][[{0}][], щоб вибрати та скопіювати -pausebuilding = [accent][[{0}][], щоб призупинити будування -resumebuilding = [scarlet][[{0}][], щоб продовжити будування +selectschematic = [accent][[{0}][], щоби вибрати та скопіювати +pausebuilding = [accent][[{0}][], щоби призупинити будування +resumebuilding = [scarlet][[{0}][], щоби продовжити будування wave = [accent]Хвиля {0} wave.waiting = [lightgray]Наступна хвиля\nчерез {0} wave.waveInProgress = [lightgray]Хвиля триває @@ -294,11 +298,11 @@ builtin = Вбудована map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати! map.random = [accent]Випадкова мапа map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. +map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. +map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. workshop.update = Оновити предмет -workshop.error = Помилка при отриманні інформації з Майстерні: {0} +workshop.error = Помилка під час отримання інформації з Майстерні: {0} map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Спершу переконайтеся, що ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! workshop.menu = Виберіть, що ви хочете зробити з цим предметом. workshop.info = Інформація про предмет @@ -307,7 +311,7 @@ eula = Ліцензійна угода Steam missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано. publishing = [accent]Публікація… publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться! -publish.error = Виникла помилка при публікації предмета: {0} +publish.error = Виникла помилка під час публікації предмета: {0} steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0} editor.brush = Пензлик @@ -317,11 +321,11 @@ editor.oregen.info = Генерація руд: editor.mapinfo = Інформація про мапу editor.author = Автор: editor.description = Опис: -editor.nodescription = Мапа повинна мати щонайменше 4 символи для публікації. +editor.nodescription = Мапа мусить мати щонайменше 4 символи для публікації. editor.waves = Хвилі: editor.rules = Правила: editor.generation = Генерація: -editor.ingame = Редагувати у грі +editor.ingame = Редагувати в грі editor.publish.workshop = Опублікувати в Майстерні Steam editor.newmap = Нова мапа workshop = Майстерня @@ -338,9 +342,14 @@ waves.preview = Попередній перегляд waves.edit = Редагувати… waves.copy = Копіювати в буфер обміну waves.load = Завантажити з буфера обміну -waves.invalid = Недійсні хвилі у буфері обміну. +waves.invalid = Недійсні хвилі в буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. + +wavemode.counts = кількість +wavemode.totals = усього +wavemode.health = здоров’я + editor.default = [lightgray]<За замовчуванням> details = Подробиці… edit = Редагувати… @@ -350,11 +359,11 @@ editor.removeunit = Видалити бойову одиницю editor.teams = Команди editor.errorload = Помилка завантаження зображення. editor.errorsave = Помилка збереження зображення. -editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» у редакторі. +editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» в редакторі. editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується. editor.errornot = Це не мапа. editor.errorheader = Цей файл мапи недійсний або пошкоджений. -editor.errorname = Мапа не має назви. Може Ви намагаєтеся завантажити збереження? +editor.errorname = Мапа не має назви. Може, ви намагаєтеся завантажити збереження? editor.update = Оновити editor.randomize = Випадково editor.apply = Застосувати @@ -365,7 +374,7 @@ editor.savemap = Зберегти мапу editor.saved = Збережено! editor.save.noname = Ваша мапа не має назви! Установіть його в «Інформація про мапу». editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть іншу назву в «Інформація про мапу». -editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже існує! +editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже є! editor.import = Імпорт… editor.importmap = Імпортувати мапу editor.importmap.description = Імпортувати вже наявну мапу @@ -380,12 +389,12 @@ editor.exportimage = Експорт зображення місцевості editor.exportimage.description = Експортувати файл зображення, що містить лише основний рельєф місцевості editor.loadimage = Завантажити\nзображення editor.saveimage = Зберегти\nзображення -editor.unsaved = [scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти? +editor.unsaved = Ви впевнені, що хочете вийти?\n[scarlet]Незбережені зміни буде втрачено назавжди![] editor.resizemap = Змінити розмір мапи editor.mapname = Назва мапи: editor.overwrite = [accent]Попередження!\nЦе перезаписує наявну мапу. -editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]» -editor.exists = Мапа з такою назвою вже існує. +editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже є. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]» +editor.exists = Мапа з такою назвою вже є. editor.selectmap = Виберіть мапу для завантаження: toolmode.replace = Замінити @@ -398,7 +407,7 @@ toolmode.square = Прямокутник toolmode.square.description = Прямокутна кисть. toolmode.eraseores = Видалення руд toolmode.eraseores.description = Видалити тільки руди. -toolmode.fillteams = Змінити блок в команді +toolmode.fillteams = Змінити блок у команді toolmode.fillteams.description = Змінює належність\nблоків до команди. toolmode.drawteams = Змінити команду блока toolmode.drawteams.description = Змінює належність\nблока до команди. @@ -447,7 +456,7 @@ load = Завантажити save = Зберегти fps = FPS: {0} ping = Затримка: {0} мс -language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності. +language.restart = Будь ласка, перезапустіть свою гру, щоби налаштування мови набули чинності. settings = Налаштування tutorial = Навчання tutorial.retake = Пройти навчання ще раз @@ -459,8 +468,9 @@ abandon.text = Ця зона і всі її ресурси будуть утра locked = Заблоковано complete = [lightgray]Необхідно: requirement.wave = Досягніть хвилі {0} у зоні «{1}» -requirement.core = Знищте вороже ядро у зоні «{0}» -requirement.unlock = Розблокуйте {0} +requirement.core = Знищте вороже ядро в зоні «{0}» +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Відновити зону:\n[lightgray]{0} bestwave = [lightgray]Найкраща хвиля: {0} launch = < ЗАПУСК > @@ -468,7 +478,7 @@ launch.text = Запуск launch.title = Запуск вдалий launch.next = [lightgray]наступна можливість буде на {0}-тій хвилі launch.unable2 = [scarlet]ЗАПУСК неможливий.[] -launch.confirm = Це видалить всі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази. +launch.confirm = Це видалить усі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази. launch.skip.confirm = Якщо ви пропустите зараз, ви не зможете не запускати до більш пізніх хвиль. uncover = Розкрити configure = Налаштувати вивантаження @@ -476,7 +486,8 @@ loadout = Вивантаження resources = Ресурси bannedblocks = Заборонені блоки addall = Додати все -configure.invalid = Кількість повинна бути числом між 0 та {0}. +launch.destination = Destination: {0} +configure.invalid = Кількість має бути числом між 0 та {0}. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1} zone.resources = [lightgray]Виявлені ресурси: @@ -489,7 +500,7 @@ boss.health = Здоров’я босу connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0} error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса? error.invalidaddress = Некоректна адреса. -error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту! +error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна й що власник сервера налаштував переадресацію порту! error.mismatch = Помилка пакету:\nможлива невідповідність версії клієнта/сервера.\nПереконайтеся, що у вас та у власника сервера встановлена остання версія Mindustry! error.alreadyconnected = Ви вже під’єдналися. error.mapnotfound = Файл мапи не знайдено! @@ -497,6 +508,20 @@ error.io = Мережева помилка введення-виведення. error.any = Невідома мережева помилка error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це. +weather.rain.name = Дощ +weather.snow.name = Сніг +weather.sandstorm.name = Піщана буря +weather.sporestorm.name = Спорова буря + +sectors.unexplored = [lightgray]Не досліджено +sectors.resources = Ресурси: +sectors.production = Виробництво: +sectors.stored = Зберігає: +sectors.resume = Продовжити +sectors.launch = Запуск +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Відправний пункт sector.craters.name = Кратери sector.frozenForest.name = Крижаний ліс @@ -516,10 +541,10 @@ sector.craters.description = У цьому кратері накопичилас sector.ruinousShores.description = Саме берегова лінія є минулим цих відходів. Колись у цьому місці розташувався береговий оборонний масив. Проте залишилося не так багато чого. Тільки основні оборонні споруди залишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Повторно розкрийте технології. sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, які ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nНа жаль, тут більше противників ніж в інших місцевостях. Не дайте їм часу надіслати свої найсильніші одиниці. sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nНе дивуйтеся, що противник встановив тут свій форпост. Побудуйте бойові одиниці під кодовою назвою «Титан». Зруйнуйте її. Поверніть те, що колись належало нам. -sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один з небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти. +sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один із небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти. sector.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Високий ризик знищення. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками та знайдіть ахіллесову п’яту супротивника. sector.nuclearComplex.description = Колишній об’єкт для виробництва та перероблювання торію було зведено до руїн.\n[lightgray]Дослідіть торій та його нескінченну кількість застосувань.\n\n Противник, який постійно шукає нападників, присутній тут у великій кількості, тому не баріться з евакуацією. - +sector.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. settings.language = Мова settings.data = Ігрові дані @@ -532,7 +557,9 @@ settings.sound = Звук settings.graphics = Графіка settings.cleardata = Очистити дані… settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати! -settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється. +settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включно із збереженнями, мапами, розблокованим та налаштуваннями керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється. +settings.clearsaves.confirm = Ви справді хочете видалити всі ваші збереження? +settings.clearsaves = Очистити збереження paused = [accent]< Пауза> clear = Очистити banned = [scarlet]Заблоковано @@ -558,8 +585,11 @@ blocks.itemsmoved = Швидкість переміщення blocks.launchtime = Час між запусками blocks.shootrange = Радіус дії blocks.size = Розмір +blocks.displaysize = Розмір дисплею blocks.liquidcapacity = Рідинна місткість -blocks.powerrange = Діапазон передачі енергії +blocks.powerrange = Радіус передачі енергії +blocks.linkrange = Радіус з’єднання +blocks.instructions = Інструкції blocks.powerconnections = Максимальна кількість з’єднань blocks.poweruse = Енергії використовує blocks.powerdamage = Енергії за од. шкоди @@ -575,14 +605,17 @@ blocks.boosteffect = Прискорювальний ефект blocks.maxunits = Максимальна кількість активних одиниць blocks.health = Здоров’я blocks.buildtime = Час будування +blocks.maxconsecutive = Максимальна послідовність blocks.buildcost = Вартість будування blocks.inaccuracy = Розкид blocks.shots = Постріли blocks.reload = Постріли/секунду blocks.ammo = Боєприпаси +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Потребується кращий бур -bar.noresources = Відсутні ресурси +bar.noresources = Бракує ресурсів bar.corereq = Необхідне основне ядро bar.drillspeed = Швидкість буріння: {0} за с. bar.pumpspeed = Швидкість викачування: {0} за с. @@ -622,9 +655,12 @@ unit.liquidunits = одиниць рідини unit.powerunits = одиниць енергії unit.degrees = град. unit.seconds = с +unit.minutes = хв unit.persecond = за секунду +unit.perminute = за хвилину unit.timesspeed = x швидкість unit.percent = % +unit.shieldhealth = shield health unit.items = предм. unit.thousands = тис unit.millions = млн @@ -638,7 +674,7 @@ category.shooting = Стрільба category.optional = Додаткові поліпшення setting.landscape.name = Тільки альбомний (горизонтальний) режим setting.shadows.name = Тіні -setting.blockreplace.name = Пропозиції щодо автоматичної заміни блоків +setting.blockreplace.name = Пропонування щодо автоматичної заміни блоків setting.linear.name = Лінійна фільтрація setting.hints.name = Підказки setting.flow.name = Показувати темп швидкості ресурсів @@ -649,7 +685,7 @@ setting.animatedshields.name = Анімаційні щити setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[] setting.playerindicators.name = Позначки гравців setting.indicators.name = Позначки противників -setting.autotarget.name = Авто-стрільба +setting.autotarget.name = Автострільба setting.keyboard.name = Миш+Керування з клавіатури setting.touchscreen.name = Керування сенсорним екраном setting.fpscap.name = Максимальний FPS @@ -681,11 +717,11 @@ setting.blockselectkeys.name = Показувати клавіші вибору setting.vsync.name = Вертикальна синхронізація setting.pixelate.name = Пікселізація setting.minimap.name = Показувати мінімапу -setting.coreitems.name = Показувати предмети в ядрі (в роботі) +setting.coreitems.name = Показувати предмети в ядрі (дороблюється) setting.position.name = Показувати координати гравця setting.musicvol.name = Гучність музики setting.atmosphere.name = Показувати планетарну атмосферу -setting.ambientvol.name = Звуки навколишнього середовища +setting.ambientvol.name = Звуки довкілля setting.mutemusic.name = Заглушити музику setting.sfxvol.name = Гучність звукових ефектів setting.mutesound.name = Заглушити звук @@ -697,7 +733,7 @@ setting.chatopacity.name = Непрозорість чату setting.lasersopacity.name = Непрозорість лазерів енергопостачання setting.bridgeopacity.name = Непрозорість мостів setting.playerchat.name = Показувати хмару чата над гравцями -public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити у Налаштування->Гра->Загальнодоступність гри. +public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри. public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри. uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд… uiscale.cancel = Скасувати & Вийти @@ -711,6 +747,7 @@ category.blocks.name = Вибір блока command.attack = Атака command.rally = Точка збору command.retreat = Відступити +command.idle = Бездіяти placement.blockselectkeys = \n[lightgray]Ключ: [{0}, keybind.respawn.name = Відродження keybind.control.name = Контролювання одиниці @@ -722,7 +759,8 @@ keybind.toggle_power_lines.name = Показувати лазери енерго keybind.toggle_block_status.name = Показувати стан блоків keybind.move_x.name = Рух по осі X keybind.move_y.name = Рух по осі Y -keybind.mouse_move.name = Слідкувати за мишею +keybind.mouse_move.name = Рухатися за мишею +keybind.pan.name = Політ камери за мишею keybind.boost.name = Прискорення keybind.schematic_select.name = Вибрати ділянку keybind.schematic_menu.name = Меню схем @@ -750,12 +788,15 @@ keybind.diagonal_placement.name = Діагональне розміщення keybind.pick.name = Вибрати блок keybind.break_block.name = Зламати блок keybind.deselect.name = Скасувати +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Постріл keybind.zoom.name = Наблизити keybind.menu.name = Меню keybind.pause.name = Пауза keybind.pause_building.name = Призупинити/Продовжити будування -keybind.minimap.name = Міні-мапа +keybind.minimap.name = Мінімапа keybind.chat.name = Чат keybind.player_list.name = Список гравців keybind.console.name = Консоль @@ -766,10 +807,10 @@ keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_next.name = Наступна історія чату keybind.chat_scroll.name = Прокрутка чату keybind.drop_unit.name = Скинути бойову одиницю -keybind.zoom_minimap.name = Збільшити міні-мапу +keybind.zoom_minimap.name = Збільшити мінімапу mode.help.title = Опис режимів гри mode.survival.name = Виживання -mode.survival.description = Звичайний режим. В цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. +mode.survival.description = Звичайний режим. У цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. mode.sandbox.name = Пісочниця mode.sandbox.description = Нескінченні ресурси та хвилі йдуть за вашим бажанням. mode.editor.name = Редактор @@ -784,29 +825,34 @@ rules.reactorexplosions = Вибухи реактора rules.wavetimer = Таймер для хвиль rules.waves = Хвилі rules.attack = Режим атаки +rules.buildai = Будування ШІ rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ rules.blockhealthmultiplier = Множник здоров’я блоків rules.blockdamagemultiplier = Множник шкоди блоків rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць rules.unithealthmultiplier = Множник здоров’я бойових одиниць rules.unitdamagemultiplier = Множник шкоди бойових одиниць -rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (плитки) +rules.enemycorebuildradius = Радіус оборони для ворожого ядра:[lightgray] (плитки) rules.wavespacing = Інтервал хвиль:[lightgray] (секунди) rules.buildcostmultiplier = Множник затрат на будування rules.buildspeedmultiplier = Множник швидкості будування -rules.deconstructrefundmultiplier = Множник відшкодування при демонтажі +rules.deconstructrefundmultiplier = Множник відшкодування у разі демонтажу rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках) rules.unitammo = Бойові одиниці потребують боєприпасів rules.title.waves = Хвилі -rules.title.resourcesbuilding = Ресурси & будування +rules.title.resourcesbuilding = Ресурси й будування rules.title.enemy = Противники rules.title.unit = Бойові одиниці rules.title.experimental = Експериментальне rules.title.environment = Середовище rules.lighting = Світлотінь +rules.fire = Вогонь +rules.explosions = Шкода від вибухів блоків і одиниць rules.ambientlight = Навколишнє світло -rules.solarpowermultiplier = Множник сонячної енергії +rules.weather = Погода +rules.weather.frequency = Повторюваність: +rules.weather.duration = Тривалість: content.item.name = Предмети content.liquid.name = Рідини @@ -832,9 +878,11 @@ liquid.water.name = Вода liquid.slag.name = Шлак liquid.oil.name = Нафта liquid.cryofluid.name = Кріогенна рідина + item.explosiveness = [lightgray]Вибухонебезпечність: {0} % item.flammability = [lightgray]Вогненебезпечність: {0} % item.radioactivity = [lightgray]Радіоактивність: {0} % + unit.health = [lightgray]Здоров’я: {0} unit.speed = [lightgray]Швидкість: {0} unit.weapon = [lightgray]Зброя: {0} @@ -843,6 +891,7 @@ unit.minespeed = [lightgray]Швидкість видобутку: {0} % unit.minepower = [lightgray]Потужність видобутку: {0} unit.ability = [lightgray]Здібність: {0} unit.buildspeed = [lightgray]Швидкість будування: {0} % + liquid.heatcapacity = [lightgray]Теплоємність: {0} liquid.viscosity = [lightgray]В’язкість: {0} liquid.temperature = [lightgray]Температура: {0} @@ -853,11 +902,12 @@ unit.fortress.name = Фортеця unit.nova.name = Нова unit.pulsar.name = Пульсар unit.quasar.name = Квазар -unit.crawler.name = Камікадзе +unit.crawler.name = Плазун unit.atrax.name = Атракс unit.spiroct.name = Павучник unit.arkyid.name = Аркиїд -unit.flare.name = Фальшфейєр +unit.toxopid.name = Отруйник +unit.flare.name = Фальшфеєр unit.horizon.name = Горизонт unit.zenith.name = Зеніт unit.antumbra.name = Тіньовик @@ -865,34 +915,43 @@ unit.eclipse.name = Затьмарник unit.mono.name = Єдинак unit.poly.name = Багацько unit.mega.name = Мега +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Грампус unit.minke.name = Смугач малий unit.bryde.name = Смугач Брайда +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Альфа unit.beta.name = Бета unit.gamma.name = Гамма +unit.scepter.name = Верховна влада +unit.reign.name = Верховний Порядок +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Пункт постачання block.parallax.name = Паралакс block.cliff.name = Скеля block.sand-boulder.name = Пісочний валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Сіль -block.saltrocks.name = Соляні камені +block.salt-wall.name = Соляна стіна block.pebbles.name = Галька block.tendrils.name = Щупальця -block.sandrocks.name = Піщані скелі +block.sand-wall.name = Піскова стіна block.spore-pine.name = Спорова сосна -block.sporerocks.name = Спорові камені -block.rock.name = Камінь -block.snowrock.name = Сніжний камінь +block.spore-wall.name = Спорова стіна +block.boulder.name = Брила +block.snow-boulder.name = Снігова брила block.snow-pine.name = Сніжні сосни block.shale.name = Сланець block.shale-boulder.name = Сланцевий валун block.moss.name = Мох block.shrubs.name = Кущі block.spore-moss.name = Споровий мох -block.shalerocks.name = Сланцеві породи +block.shale-wall.name = Сланцева стіна block.scrap-wall.name = Стіна з брухту block.scrap-wall-large.name = Велика стіна з брухту block.scrap-wall-huge.name = Величезна стіна з брухту @@ -917,16 +976,20 @@ block.darksand.name = Темний пісок block.ice.name = Лід block.snow.name = Сніг block.craters.name = Кратери -block.sand-water.name = Пісок з водою -block.darksand-water.name = Темний пісок з водою +block.sand-water.name = Пісок із водою +block.darksand-water.name = Темний пісок із водою block.char.name = Випалена земля -block.holostone.name = Голографічний камінь +block.dacite.name = Дацит +block.dacite-wall.name = Дацитова стіна block.ice-snow.name = Крижаний сніг -block.rocks.name = Камені -block.icerocks.name = Крижані камені -block.snowrocks.name = Снігові камені -block.dunerocks.name = Піщані камені +block.stone-wall.name = Кам’яна стіна +block.ice-wall.name = Крижана стіна +block.snow-wall.name = Снігова стіна +block.dune-wall.name = Дюнова стіна block.pine.name = Сосна +block.dirt.name = Ґрунт +block.dirt-wall.name = Ґрунтова стіна +block.mud.name = Mud block.white-tree-dead.name = Мертве біле дерево block.white-tree.name = Біле дерево block.spore-cluster.name = Скупчення спор @@ -942,10 +1005,9 @@ block.dark-panel-4.name = Темна панель 4 block.dark-panel-5.name = Темна панель 5 block.dark-panel-6.name = Темна панель 6 block.dark-metal.name = Темний метал -block.ignarock.name = Магматичні гірські породи +block.basalt.name = Базальт block.hotrock.name = Гарячий камінь block.magmarock.name = Магмовий камінь -block.cliffs.name = Скелі block.copper-wall.name = Мідна стіна block.copper-wall-large.name = Велика мідна стіна block.titanium-wall.name = Титанова стіна @@ -967,7 +1029,7 @@ block.conveyor.name = Конвеєр block.titanium-conveyor.name = Титановий конвеєр block.plastanium-conveyor.name = Пластанієвий конвеєр block.armored-conveyor.name = Броньований конвеєр -block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що і титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. +block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що й титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. block.junction.name = Перехрестя block.router.name = Маршрутизатор block.distributor.name = Розподілювач @@ -981,7 +1043,7 @@ block.underflow-gate.name = Недостатній затвор block.silicon-smelter.name = Кремнієвий плавильний завод block.phase-weaver.name = Фазовий ткач block.pulverizer.name = Подрібнювач -block.cryofluidmixer.name = Змішувач кріогенної рідини +block.cryofluid-mixer.name = Змішувач кріогенної рідини block.melter.name = Плавильня block.incinerator.name = Сміттєспалювальний завод block.spore-press.name = Споровий прес @@ -994,7 +1056,7 @@ block.diode.name = Діод block.battery.name = Акумулятор block.battery-large.name = Великий акумулятор block.combustion-generator.name = Генератор згорання -block.turbine-generator.name = Паровий генератор +block.steam-generator.name = Паровий генератор block.differential-generator.name = Диференційний генератор block.impact-reactor.name = Імпульсний реактор block.mechanical-drill.name = Механічний бур @@ -1056,18 +1118,28 @@ block.container.name = Сховище block.launch-pad.name = Стартовий майданчик block.launch-pad-large.name = Великий стартовий майданчик block.segment.name = Сегмент +block.command-center.name = Командний центр block.ground-factory.name = Наземний завод block.air-factory.name = Повітряний завод block.naval-factory.name = Морський завод block.additive-reconstructor.name = Додавальний реконструктор block.multiplicative-reconstructor.name = Примножувальний реконструктор block.exponential-reconstructor.name = Експоненційний реконструктор -block.tetrative-reconstructor.name = Тетративний реконструктор +block.tetrative-reconstructor.name = Тетративний реконструктор block.payload-conveyor.name = Вантажний конвеєр block.payload-router.name = Розвантажувальний маршрутизатор block.disassembler.name = Розбирач block.silicon-crucible.name = Кремнієвий тигель -block.large-overdrive-projector.name = Великий прискорювач +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Перемикач +block.micro-processor.name = Мікропроцесор +block.logic-processor.name = Логічний процесор +block.hyper-processor.name = Гіперпроцесор +block.logic-display.name = Логічний дисплей +block.large-logic-display.name = Великий логічний дисплей +block.memory-cell.name = Комірка пам’яті + team.blue.name = Синя team.crux.name = Червона team.sharded.name = Помаранчева @@ -1077,39 +1149,39 @@ team.green.name = Зелена team.purple.name = Фіолетова tutorial.next = [lightgray]<Натисніть для продовження> -tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\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\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від відкритої вкладки.\n[accent]Натисніть ПКМ[], щоб зупинити будування. -tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоб підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоб скасувати розміщення. +tutorial.intro = Ви розпочали[scarlet] навчання з Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\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\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\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Побудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро. -tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро. -tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються у будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди повинні бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази. -tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоб заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1 +tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення в лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро. +tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро. +tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються в будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди мають бути побудовані для відбиття[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.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоб зламати його.\nЗнищте область, утримуючи палець протягом декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоб підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні. +tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоби зняти паузу. +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.deposit = Покладіть предмети в блок, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[] -tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоб стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді. +tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоби стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді. tutorial.waves.mobile = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль. Ваш корабель буде автоматично атакувати противників.\nПобудуйте більше башт і бурів. Добудьте більше міді. tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши свою базу позаду, та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску. item.copper.description = Початковий будівельний матеріал. Широко використовується у всіх типах блоків. -item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та у транспортуванні рідин. +item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та в транспортуванні рідин. item.metaglass.description = Дуже жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини. item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як електричний компонент. -item.sand.description = Поширений матеріал, який широко використовується при виплавці, як при сплавленні, так і в якості відходів. +item.sand.description = Поширений матеріал, який широко використовується у виплавці, як під час сплавлення, так і в якості відходів. item.coal.description = Скам’янілі рослинні речовини, що утворилися задовго до посіву. Широко використовується для виробництва пального та ресурсів. item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків. item.thorium.description = Щільний радіоактивний метал, що використовується в якості конструкційної опори та ядерного палива. item.scrap.description = Залишки старих споруд та підрозділів. Містить мікроелементи багатьох різних металів. item.silicon.description = Надзвичайно корисний напівпровідник. Має застосування в сонячних батареях, складній електроніці та боєприпасах для башт. item.plastanium.description = Легкий пластичний матеріал, що використовується в сучасних літальних апаратах та у фрагментованих боєприпасах. -item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та у технології самовідновлення. +item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та в технології самовідновлення. item.surge-alloy.description = Удосконалений сплав з унікальними електричними властивостями. item.spore-pod.description = Струмок синтетичних спор, синтезований з атмосферних концентрацій для промислових цілей. Використовується для перетворення на нафту, вибухівку та паливо. item.blast-compound.description = Нестабільна сполука, яка використовується в бомбах і вибухівках. Синтезується зі спорових стручків та інших летких речовин. Використовувати як паливо не рекомендується. @@ -1117,24 +1189,24 @@ item.pyratite.description = Надзвичайно легкозаймиста р liquid.water.description = Найкорисніша рідина. Зазвичай використовується для охолодження машин та перероблювання відходів. liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя. liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена у вугілля в якості палива або використана як куля. -liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує. +liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Має здатність надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує. block.message.description = Зберігає повідомлення. Використовується для комунікації між союзниками. block.graphite-press.description = Стискає шматки вугілля в чисті аркуші графіту. block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкого та ефективного перероблювання вугілля. -block.silicon-smelter.description = Змішує пісок з чистим вугіллям. Виробляє кремній. +block.silicon-smelter.description = Змішує пісок із чистим вугіллям. Виробляє кремній. block.kiln.description = Виплавляє пісок та свинець у сполуку, відому як метаскло. Для запуску потрібна невелика кількість енергії. -block.plastanium-compressor.description = Виробляє пластаній з нафти та титану. +block.plastanium-compressor.description = Виробляє пластаній із нафти та титану. block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піску. Для роботи потрібна велика кількість енергії. block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву. -block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання у торієвому реактору. -block.blast-mixer.description = Подрібнює і змішує скупчення спор з піротитом для отримання вибухової суміші. +block.cryofluid-mixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання в торієвому реактору. +block.blast-mixer.description = Подрібнює і змішує скупчення спор із піротитом для отримання вибухової суміші. block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піротит. -block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання у баштах «Хвиля». +block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання в баштах «Хвиля». block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджені матеріали. block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти. block.pulverizer.description = Подрібнює брухт у дрібний пісок. -block.coal-centrifuge.description = Нафта перетворюється у шматки вугілля. +block.coal-centrifuge.description = Нафта перетворюється в шматки вугілля. block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує. block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця. block.power-source.description = Постійно створює енергію. Тільки пісочниця. @@ -1142,30 +1214,30 @@ block.item-source.description = Постійно створює предмети block.item-void.description = Знищує будь-які предмети. Тільки пісочниця. block.liquid-source.description = Постійно створює рідини. Тільки пісочниця. block.liquid-void.description = Видаляє будь-які рідини. Тільки пісочниця. -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 = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів. -block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток. -block.thorium-wall.description = Сильний захисний блок.\nГідний захист від противників. -block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від противників.\nЗаймає декілька плиток. -block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі. -block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі.\nЗаймає декілька плиток. -block.surge-wall.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином. -block.surge-wall-large.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток. -block.door.description = Невеликі двері. Можна відкрити або закрити, натиснувши. -block.door-large.description = Великі двері. Можна відкрити та закрити, натиснувши.\nЗаймає декілька плиток. -block.mender.description = Періодично ремонтує блоки у його радіусі дії. Захищає башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності. -block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки у його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. +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 = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів. +block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток. +block.thorium-wall.description = Сильний оборонний блок.\nГарна оборона від противників. +block.thorium-wall-large.description = Сильний оборонний блок.\nГарна оборона від противників.\nЗаймає декілька плиток. +block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару. +block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.\nЗаймає декілька плиток. +block.surge-wall.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином. +block.surge-wall-large.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток. +block.door.description = Невеликі двері. Можна відчинити або зачинити, натиснувши на них. +block.door-large.description = Великі двері. Можна відчинити та зачинити, натиснувши на них.\nЗаймає декілька плиток. +block.mender.description = Періодично ремонтує блоки в його радіусі дії. Боронить башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності. +block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки в його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. -block.force-projector.description = Створює навколо себе шестикутне силове поле, захищаючи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину. +block.force-projector.description = Створює навколо себе шестикутне силове поле, боронячи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину. block.shock-mine.description = Наносить шкоду противникам, коли вони наступають на міну. Майже невидима для противника. block.conveyor.description = Базовий транспортний блок. Переміщує елементи вперед і автоматично перетворює їх у блоки. Можна обертати. block.titanium-conveyor.description = Покращений блок транспорту елементів. Переміщує предмети швидше, ніж звичайні конвеєри. -block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду. +block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду.\nПотребує кілька точок завантаження та розвантаження для максимальної пропускної здатності. block.junction.description = Діє як міст для двох перехресних конвеєрних стрічок. Корисно в ситуаціях, коли два різних конвеєри перевозять різні матеріали в різні місця. -block.bridge-conveyor.description = Покращений блок транспорту елементів. Дозволяє транспортувати предмети до 3-ох плиток з будь-якої місцевості чи будівлі. +block.bridge-conveyor.description = Покращений блок транспорту елементів. Дає змогу транспортувати предмети до 3-ох плиток із будь-якої місцевості чи будівлі. block.phase-conveyor.description = Покращений блок транспорту елементів. Використовує енергію для телепортування елементів на під’єднаний фазовий конвеєр через кілька плиток. block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться зліва та/чи справа. block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони. @@ -1174,35 +1246,35 @@ block.distributor.description = Поліпшений маршрутизатор. block.overflow-gate.description = Вивантажує лише вліво та/або вправо, якщо передній шлях заблокований. block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий та/або правий шлях заблоковано. block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергія. -block.mechanical-pump.description = Дешевий насос з повільним виходом, але не потребує енергоспоживання. +block.mechanical-pump.description = Дешевий насос із повільним виходом, але не потребує енергоспоживання. block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію. block.thermal-pump.description = Найкращий насос. block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами. -block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує і більше зберігає рідини, ніж стандартні трубопроводи. -block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин з боків окрім інших трубопроводів.\nПротікає менше. +block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує й більше зберігає рідини, ніж стандартні трубопроводи. +block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин із боків окрім інших трубопроводів.\nПротікає менше. block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней. -block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях з непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. +block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях із непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. block.liquid-junction.description = Діє як міст для двох каналів, що перетинаються. Корисно в ситуаціях, коли два різні трубопроводи транспортують різні рідини в різні місця. -block.bridge-conduit.description = Удосконалений блок транспортування рідини. Дозволяє транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. +block.bridge-conduit.description = Удосконалений блок транспортування рідини. Надає можливість транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. block.phase-conduit.description = Удосконалений блок транспортування рідини. Використовує енергію для транспортування рідин до приєднаного фазового каналу через декілька плиток. block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них. block.power-node-large.description = Поліпшений вузол живлення з більшим радіусом дії. block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії. block.diode.description = Живлення акумулятора може протікати через цей блок лише в одному напрямку, але лише в тому випадку, якщо інша сторона має менше енергії. -block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту. +block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор. block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля. -block.thermal-generator.description = Генерує енергію при розміщенні в спекотних місцях. -block.turbine-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари. -block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною і піротитом, що горить. +block.thermal-generator.description = Генерує енергію у разі розміщення в спекотних місцях. +block.steam-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари. +block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною й піротитом, що горить. block.rtg-generator.description = Простий і надійний генератор. Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю. block.solar-panel.description = Забезпечує невелику кількість енергії від сонця. -block.solar-panel-large.description = Значно ефективніша версія стандартної сонячної панелі. +block.solar-panel-large.description = Значно ефективніша ніж стандартна сонячна панель. block.thorium-reactor.description = Виробляє значну кількість енергії з торію. Вимагає постійного охолодження. Сильно вибухне, якщо подаватиметься недостатня кількість теплоносія. Вихідна потужність залежить від заповненості, базова потужність генерується на повній місткості. -block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії при максимальній ефективності. Для запуску процесу потрібно значні обсяги енергії. +block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії за максимальною ефективності. Для запуску процесу потрібно значні обсяги енергії. block.mechanical-drill.description = Недорогий бур. Якщо розмістити на доречних плитках, то виводитиме предмети постійно, але повільно. Придатний лише для базових ресурсів. -block.pneumatic-drill.description = Поліпшений бур, здатний добувати титан. Видобуває швидше, ніж механічний бур. -block.laser-drill.description = Дозволяє виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. +block.pneumatic-drill.description = Поліпшений бур, здатний видобувати титан. Видобуває швидше, ніж механічний бур. +block.laser-drill.description = Дає змогу виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. block.blast-drill.description = Найкращий бур. Потрібна велика кількість енергії. block.water-extractor.description = Видобуває підземні води. Використовується в місцях, де немає поверхневої води. block.cultivator.description = Культивує невеликі концентрації спор в атмосфері на готові до промисловості стручки. @@ -1213,15 +1285,15 @@ block.core-nucleus.description = Третя й остання версія ка block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.unloader.description = Вивантажує предмети з блока, який не переміщує предмети, на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок. -block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик дозволяє вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте у нього ресурси та забезпечте енергією. +block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик надає можливість вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте в нього ресурси та забезпечте енергією. block.launch-pad-large.description = Поліпшена версія стартового майданчика. Зберігає більше предметів. Запускається частіше. -block.duo.description = Мала і дешева башта. Корисна проти наземних одиниць. -block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла у противників. +block.duo.description = Мала й дешева башта. Корисна проти наземних одиниць. +block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла в противників. block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані. block.hail.description = Невелика артилерійська башта з далеким радіусом дії. block.wave.description = Башта середнього розміру. Випускає потоками рідини в противників. Автоматично гасить пожежі при постачанні води. block.lancer.description = Лазерна башта середнього розміру, яка атакує наземних противників. Заряджає і вистрілює потужні пучки енергії. -block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики у противників. +block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики в противників. block.swarmer.description = Ракетна башта середнього розміру. Атакує як повітряних, так і наземних противників. Запускає ракети, які летять у противників самостійно. block.salvo.description = Більш велика, вдосконалена версія башти «Подвійна». Вистрілює швидкий залп куль у противника. block.fuse.description = Велика енергетична башта з малим радіусом дії. Стріляє трьома пронизливими променями на найближчих противників. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 13cf2709e2..506a29aa99 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -20,6 +20,8 @@ gameover = 游戏结束 gameover.pvp = [accent] {0}[]队获胜! highscore = [accent]新纪录! copied = 已复制。 +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = 音乐加载中 load.map = 地图加载中 @@ -63,8 +65,7 @@ stat.delivered = 装运资源: stat.playtime = 游玩时间:[accent] {0} stat.rank = 最终评级:[accent]{0} -launcheditems = [accent]装运的资源 -launchinfo = [unlaunched]发射你的核心后,你将获得用蓝字标识的资源。 +globalitems = [accent]Global Items map.delete = 确定要删除“[accent]{0}[]”地图吗? level.highscore = 最高分:[accent]{0} level.select = 选择关卡 @@ -114,6 +115,7 @@ mod.disable = 禁用 mod.content = 内容: mod.delete.error = 无法删除模组。可能文件被占用。 mod.requiresversion = [scarlet]所需的游戏版本:[accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]缺少前置模组:{0} mod.erroredcontent = [scarlet]内容错误 mod.errors = 读取内容时发生错误. @@ -137,6 +139,8 @@ mod.scripts.disable = 你的设备不支持含有脚本的模组。必须禁用 about.button = 关于 name = 名字: noname = 先取一个[accent]玩家名[]。 +planetmap = Planet Map +launchcore = Launch Core filename = 文件名: unlocked = 解锁了新内容! completed = [accent]己研究 @@ -144,6 +148,7 @@ techtree = 科技树 research.list = [lightgray]研究: research = 研究 researched = [lightgray]{0}己研究。 +research.progress = {0}% complete players = {0} 位玩家在线 players.single = {0} 位玩家在线 players.search = search @@ -340,6 +345,11 @@ waves.load = 从剪贴板读取 waves.invalid = 剪贴板中的波次信息无效。 waves.copied = 波次信息已复制。 waves.none = 没有定义敌人。\n请注意,这将自动替换为默认的敌人列表。 + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<默认> details = 详情… edit = 编辑… @@ -459,7 +469,8 @@ locked = 已锁定 complete = [lightgray]完成: requirement.wave = {1}中的第{0}波次 requirement.core = 在{0}中摧毁敌方核心 -requirement.unlock = 解锁{0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = 暂停:\n[lightgray]{0} bestwave = [lightgray]最高波次:{0} launch = < 发射 > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = 禁用建筑 addall = 添加所有 +launch.destination = Destination: {0} configure.invalid = 数量必须是0到{0}之间的数字。 zone.unlocked = [lightgray]{0} 已解锁。 zone.requirement.complete = 完成{0}。\n已达成解锁{1}的要求。 @@ -496,6 +508,20 @@ error.io = 网络 I/O 错误。 error.any = 未知网络错误。 error.bloom = 未能初始化特效。\n您的设备可能不支持。 +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = 图像 settings.cleardata = 清除游戏数据… settings.clear.confirm = 您确定要清除此数据?\n此操作无法撤销! settings.clearall.confirm = [scarlet]警告![]\n这将清除所有数据,包括存档、地图、解锁和按键绑定。\n按「是」后,游戏将删除所有数据并自动退出。 +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< 暂停 > clear = 清除 banned = [scarlet]已禁止 @@ -557,8 +585,11 @@ blocks.itemsmoved = 移动速度 blocks.launchtime = 发射间隔时间 blocks.shootrange = 范围 blocks.size = 尺寸 +blocks.displaysize = Display Size blocks.liquidcapacity = 液体容量 blocks.powerrange = 能量范围 +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = 最多连接 blocks.poweruse = 使用能量 blocks.powerdamage = 功率/损伤 @@ -574,11 +605,14 @@ blocks.boosteffect = 增强效果 blocks.maxunits = 最大单位数量 blocks.health = 生命值 blocks.buildtime = 建造时间 +blocks.maxconsecutive = Max Consecutive blocks.buildcost = 建造花费 blocks.inaccuracy = 误差 blocks.shots = 发射数 blocks.reload = 每秒发射数 blocks.ammo = 弹药 +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = 需要更好的钻头 bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = 液体 unit.powerunits = 能量 unit.degrees = 度 unit.seconds = 秒 +unit.minutes = mins unit.persecond = /秒 +unit.perminute = /min unit.timesspeed = 倍 速度 unit.percent = % +unit.shieldhealth = shield health unit.items = 物品 unit.thousands = k unit.millions = mil +unit.billions = b category.general = 普通 category.power = 能量 category.liquids = 液体 @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = 攻击 command.rally = 集合 command.retreat = 撤退 +command.idle = Idle placement.blockselectkeys = \n[lightgray]按键:[{0}, keybind.respawn.name = 重生 keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = 显隐方块状态 keybind.move_x.name = 水平移动 keybind.move_y.name = 竖直移动 keybind.mouse_move.name = 跟随鼠标 +keybind.pan.name = Pan View keybind.boost.name = 推送 keybind.schematic_select.name = 选择区域 keybind.schematic_menu.name = 蓝图目录 @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = 斜线建造 keybind.pick.name = 选择建筑 keybind.break_block.name = 破坏建筑 keybind.deselect.name = 取消选择 +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = 射击 keybind.zoom.name = 缩放 keybind.menu.name = 菜单 @@ -782,6 +825,7 @@ rules.reactorexplosions = 反应堆爆炸 rules.wavetimer = 波次计时器 rules.waves = 波次 rules.attack = 攻击模式 +rules.buildai = AI Building rules.enemyCheat = 敌人(红队)无限资源 rules.blockhealthmultiplier = 建筑生命倍数 rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = 单位 rules.title.experimental = 实验性 rules.title.environment = Environment rules.lighting = 光照 +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = 环境光 -rules.solarpowermultiplier = 太阳能发电倍数 +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = 物品 content.liquid.name = 液体 @@ -830,9 +878,11 @@ liquid.water.name = 水 liquid.slag.name = 矿渣 liquid.oil.name = 石油 liquid.cryofluid.name = 冷冻液 + item.explosiveness = [lightgray]爆炸性:{0}% item.flammability = [lightgray]易燃性:{0}% item.radioactivity = [lightgray]放射性:{0}% + unit.health = [lightgray]生命值:{0} unit.speed = [lightgray]速度:{0} unit.weapon = [lightgray]武器{0} @@ -856,6 +906,7 @@ unit.crawler.name = 爬行者 unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = 悬崖 block.sand-boulder.name = 沙砂巨石 block.grass.name = 草地 block.slag.name = 矿渣 block.salt.name = 盐碱地 -block.saltrocks.name = 盐碱岩石 +block.salt-wall.name = Salt Wall block.pebbles.name = 鹅卵石 block.tendrils.name = 卷须 -block.sandrocks.name = 沙岩块 +block.sand-wall.name = Sand Wall block.spore-pine.name = 孢子树 -block.sporerocks.name = 孢子岩石 -block.rock.name = 岩石 -block.snowrock.name = 雪岩石 +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = 雪树 block.shale.name = 页岩地 block.shale-boulder.name = 页岩巨石 block.moss.name = 苔藓地 block.shrubs.name = 灌木丛 block.spore-moss.name = 孢子苔藓地 -block.shalerocks.name = 页岩岩石 +block.shale-wall.name = Shale Wall block.scrap-wall.name = 废墙 block.scrap-wall-large.name = 大型废墙 block.scrap-wall-huge.name = 巨型废墙 @@ -919,13 +979,17 @@ block.craters.name = 陨石坑 block.sand-water.name = 沙 水 block.darksand-water.name = 暗沙 水 block.char.name = 焦土 -block.holostone.name = 霍洛石头 +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = 冰雪地 -block.rocks.name = 岩石 -block.icerocks.name = 冰岩石 -block.snowrocks.name = 雪岩石 -block.dunerocks.name = 沙丘岩石 +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = 松树 +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = 枯萎的白树 block.white-tree.name = 白树 block.spore-cluster.name = 孢子簇 @@ -941,10 +1005,9 @@ block.dark-panel-4.name = 暗面板4 block.dark-panel-5.name = 暗面板5 block.dark-panel-6.name = 暗面板6 block.dark-metal.name = 暗金属 -block.ignarock.name = 伊格纳石头 +block.basalt.name = Basalt block.hotrock.name = 热石头 block.magmarock.name = 岩浆石头 -block.cliffs.name = 悬崖 block.copper-wall.name = 铜墙 block.copper-wall-large.name = 大型铜墙 block.titanium-wall.name = 钛墙 @@ -980,7 +1043,7 @@ block.underflow-gate.name = 反向溢流门 block.silicon-smelter.name = 硅冶炼厂 block.phase-weaver.name = 相织物编织器 block.pulverizer.name = 粉碎机 -block.cryofluidmixer.name = 冷冻液混合器 +block.cryofluid-mixer.name = 冷冻液混合器 block.melter.name = 熔炉 block.incinerator.name = 焚化炉 block.spore-press.name = 孢子压缩机 @@ -993,7 +1056,7 @@ block.diode.name = 二极管 block.battery.name = 电池 block.battery-large.name = 大型电池 block.combustion-generator.name = 火力发电机 -block.turbine-generator.name = 涡轮发电机 +block.steam-generator.name = 涡轮发电机 block.differential-generator.name = 温差发电机 block.impact-reactor.name = 冲击反应堆 block.mechanical-drill.name = 机械钻头 @@ -1055,6 +1118,7 @@ block.container.name = 容器 block.launch-pad.name = 发射台 block.launch-pad-large.name = 大型发射台 block.segment.name = 分割机 +block.command-center.name = Command Center block.ground-factory.name = 地面工厂 block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = 蓝 team.crux.name = 红 team.sharded.name = 黄 @@ -1126,7 +1199,7 @@ block.kiln.description = 将铅和沙子熔炼成钢化玻璃,需要少量电 block.plastanium-compressor.description = 用石油和钛生产塑钢。 block.phase-weaver.description = 用放射性钍和大量沙子生产相织物。 block.alloy-smelter.description = 用钛、铅、硅和铜生产巨浪合金。 -block.cryofluidmixer.description = 将水和细的钛粉混成冷却液。钍反应堆的必备之物。 +block.cryofluid-mixer.description = 将水和细的钛粉混成冷却液。钍反应堆的必备之物。 block.blast-mixer.description = 用油料将硫转化为不易燃但更具爆炸性的爆炸化合物。 block.pyratite-mixer.description = 将煤、铅和沙子混合成高度易燃的硫。 block.melter.description = 将废料熔化成矿渣,以便进一步加工或用于炮塔弹药。 @@ -1192,7 +1265,7 @@ block.battery.description = 存储能量作为缓冲,在发电量不足时提 block.battery-large.description = 比普通电池容量更大。 block.combustion-generator.description = 燃烧煤等材料发电。 block.thermal-generator.description = 放置在炽热的地形上能够发电。 -block.turbine-generator.description = 先进的火力发电机,效率更高,但需要水来产生蒸汽。 +block.steam-generator.description = 先进的火力发电机,效率更高,但需要水来产生蒸汽。 block.differential-generator.description = 利用低温流体与燃烧的硫之间的温差产生大量能量。 block.rtg-generator.description = 一种简单可靠的发电机。利用放射性化合物的衰变产生的热量,以缓慢的速度产生能量。 block.solar-panel.description = 普通太阳能板,提供少量电力。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index ea90067971..85efa9a527 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -20,6 +20,8 @@ gameover = 遊戲結束 gameover.pvp = [accent]{0}[]隊獲勝! highscore = [accent]新的高分紀錄! copied = 已複製。 +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = 音效載入中 load.map = 地圖載入中 @@ -63,8 +65,7 @@ stat.delivered = 發射的核心資源: stat.playtime = 遊玩時間:[accent] {0} stat.rank = 最終排名:[accent]{0} -launcheditems = [accent]已發射的物品 -launchinfo = [unlaunched][[發射]核心以獲得藍字部分的物品。 +globalitems = [accent]Global Items map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? level.highscore = 最高分:[accent]{0} level.select = 選擇關卡 @@ -114,6 +115,7 @@ mod.disable = 禁用 mod.content = 內容: mod.delete.error = 無法刪除模組,檔案可能在使用中。 mod.requiresversion = [scarlet]最低遊戲版本要求:[accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]缺少必須項目: {0} mod.erroredcontent = [scarlet]內容錯誤 mod.errors = 載入內容時發生錯誤 @@ -137,6 +139,8 @@ mod.scripts.disable = 您的設備不支持包含指令檔的模組。您必須 about.button = 關於 name = 名稱: noname = 請先選擇一個[accent]玩家名稱[]。 +planetmap = Planet Map +launchcore = Launch Core filename = 檔案名稱︰ unlocked = 已解鎖新內容! completed = [accent]完成 @@ -144,6 +148,7 @@ techtree = 科技樹 research.list = [lightgray]研究︰ research = 研究 researched = [lightgray]{0}研究完成。 +research.progress = {0}% complete players = {0}個線上玩家 players.single = {0}個線上玩家 players.search = 搜尋 @@ -340,6 +345,11 @@ waves.load = 從剪貼板加載 waves.invalid = 剪貼板中的波次無效。 waves.copied = 波次已被複製。 waves.none = 無自定義敵人.\n請注意,空佈局將自動替換為預設佈局。 + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]〈默認〉 details = 詳情... edit = 編輯... @@ -459,7 +469,8 @@ locked = 鎖定 complete = [lightgray]完成: requirement.wave = 在{1}到達第{0}波 requirement.core = 在{0}摧毀敵人核心 -requirement.unlock = 解鎖{0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = 繼續區域:\n[lightgray]{0} bestwave = [lightgray]最高波次:{0} launch = < 發射 > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = 禁用方塊 addall = 全部加入 +launch.destination = Destination: {0} configure.invalid = 數值必須介於 0 到 {0}。 zone.unlocked = [lightgray]{0}已解鎖。 zone.requirement.complete = 到達波次{0}:\n滿足{1}區域要求。 @@ -496,6 +508,20 @@ error.io = 網絡輸出入錯誤。 error.any = 未知網絡錯誤。 error.bloom = 初始化特效失敗.\n您的設備可能不支援它 +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = 圖形 settings.cleardata = 清除遊戲數據... settings.clear.confirm = 您確定要清除數據嗎?\n此操作無法撤回! settings.clearall.confirm = [scarlet]警告![]\n這將清除所有數據,包括存檔、地圖、解鎖和熱鍵綁定。\n按「是」後,遊戲將刪除所有數據並自動退出。 +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]〈已暫停〉 clear = 清除 banned = [scarlet]已被封禁 @@ -557,8 +585,11 @@ blocks.itemsmoved = 移動速度 blocks.launchtime = 發射間隔 blocks.shootrange = 範圍 blocks.size = 尺寸 +blocks.displaysize = Display Size blocks.liquidcapacity = 液體容量 blocks.powerrange = 輸出範圍 +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = 最大連接數 blocks.poweruse = 能量使用 blocks.powerdamage = 能量/傷害 @@ -574,11 +605,14 @@ blocks.boosteffect = 提升效應 blocks.maxunits = 最大活躍單位 blocks.health = 耐久度 blocks.buildtime = 建設時間 +blocks.maxconsecutive = Max Consecutive blocks.buildcost = 建造成本 blocks.inaccuracy = 誤差 blocks.shots = 射擊數 blocks.reload = 射擊次數/秒 blocks.ammo = 彈藥 +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = 需要更好的鑽頭 bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = 液體單位 unit.powerunits = 能量單位 unit.degrees = 度 unit.seconds = 秒 +unit.minutes = mins unit.persecond = /秒 +unit.perminute = /min unit.timesspeed = ×速度 unit.percent = % +unit.shieldhealth = shield health unit.items = 物品 unit.thousands = k unit.millions = mil +unit.billions = b category.general = 一般 category.power = 能量 category.liquids = 液體 @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = 攻擊 command.rally = 集結 command.retreat = 撤退 +command.idle = Idle placement.blockselectkeys = \n[lightgray]按鍵:[{0}, keybind.respawn.name = 重生 keybind.control.name = 控制單位 @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = 開啟方塊狀態顯示 keybind.move_x.name = 水平移動 keybind.move_y.name = 垂直移動 keybind.mouse_move.name = 跟隨滑鼠 +keybind.pan.name = Pan View keybind.boost.name = 噴射 keybind.schematic_select.name = 選擇區域 keybind.schematic_menu.name = 藍圖目錄 @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = 對角線放置 keybind.pick.name = 選擇方塊 keybind.break_block.name = 移除方塊 keybind.deselect.name = 取消選取 +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = 射擊 keybind.zoom.name = 縮放 keybind.menu.name = 主選單 @@ -782,6 +825,7 @@ rules.reactorexplosions = 反應爐爆炸 rules.wavetimer = 波次時間 rules.waves = 波次 rules.attack = 攻擊模式 +rules.buildai = AI Building rules.enemyCheat = 電腦無限資源 rules.blockhealthmultiplier = 建築物耐久度倍數 rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = 單位 rules.title.experimental = 實驗中 rules.title.environment = 環境 rules.lighting = 光照 +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = 環境光照 -rules.solarpowermultiplier = 太陽能倍數 +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = 物品 content.liquid.name = 液體 @@ -830,9 +878,11 @@ liquid.water.name = 水 liquid.slag.name = 熔渣 liquid.oil.name = 原油 liquid.cryofluid.name = 冷凍液 + item.explosiveness = [lightgray]爆炸性:{0}% item.flammability = [lightgray]易燃性:{0}% item.radioactivity = [lightgray]放射性:{0}% + unit.health = [lightgray]生命值:{0} unit.speed = [lightgray]速度:{0} unit.weapon = [lightgray]武器: {0} @@ -856,6 +906,7 @@ unit.crawler.name = 爬行機甲 unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = 峭壁 block.sand-boulder.name = 沙礫 block.grass.name = 草 block.slag.name = 熔渣 block.salt.name = 鹽 -block.saltrocks.name = 鹽岩 +block.salt-wall.name = Salt Wall block.pebbles.name = 卵石 block.tendrils.name = 卷鬚 -block.sandrocks.name = 沙岩 +block.sand-wall.name = Sand Wall block.spore-pine.name = 孢子松 -block.sporerocks.name = 孢子岩 -block.rock.name = 岩石 -block.snowrock.name = 雪巖 +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = 雪松 block.shale.name = 頁岩 block.shale-boulder.name = 頁岩巨石 block.moss.name = 苔蘚 block.shrubs.name = 灌木 block.spore-moss.name = 孢子苔蘚 -block.shalerocks.name = 頁岩岩石 +block.shale-wall.name = Shale Wall block.scrap-wall.name = 廢牆 block.scrap-wall-large.name = 大型廢牆 block.scrap-wall-huge.name = 巨型廢牆 @@ -919,13 +979,17 @@ block.craters.name = 隕石坑 block.sand-water.name = 沙水 block.darksand-water.name = 黑沙水 block.char.name = 燒焦 -block.holostone.name = 霍洛石頭 +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = 冰雪 -block.rocks.name = 岩石 -block.icerocks.name = 冰岩 -block.snowrocks.name = 雪巖 -block.dunerocks.name = 沙丘岩 +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = 松樹 +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = 枯萎白樹 block.white-tree.name = 白樹 block.spore-cluster.name = 孢子簇 @@ -941,10 +1005,9 @@ block.dark-panel-4.name = 黑面板 4 block.dark-panel-5.name = 黑面板 5 block.dark-panel-6.name = 黑面板 6 block.dark-metal.name = 黑金屬 -block.ignarock.name = 火成岩 +block.basalt.name = Basalt block.hotrock.name = 熱岩 block.magmarock.name = 岩漿岩 -block.cliffs.name = 懸崖 block.copper-wall.name = 銅牆 block.copper-wall-large.name = 大型銅牆 block.titanium-wall.name = 鈦牆 @@ -980,7 +1043,7 @@ block.underflow-gate.name = 反向溢流器 block.silicon-smelter.name = 煉矽廠 block.phase-weaver.name = 相織布編織器 block.pulverizer.name = 粉碎機 -block.cryofluidmixer.name = 冷凍液混合器 +block.cryofluid-mixer.name = 冷凍液混合器 block.melter.name = 熔爐 block.incinerator.name = 焚化爐 block.spore-press.name = 孢子壓縮機 @@ -993,7 +1056,7 @@ block.diode.name = 二極體 block.battery.name = 電池 block.battery-large.name = 大型電池 block.combustion-generator.name = 燃燒發電機 -block.turbine-generator.name = 渦輪發電機 +block.steam-generator.name = 渦輪發電機 block.differential-generator.name = 差動發電機 block.impact-reactor.name = 衝擊反應堆 block.mechanical-drill.name = 機械鑽頭 @@ -1055,6 +1118,7 @@ block.container.name = 容器 block.launch-pad.name = 小型發射台 block.launch-pad-large.name = 大型發射台 block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = 藍 team.crux.name = 紅 team.sharded.name = 黃 @@ -1126,7 +1199,7 @@ block.kiln.description = 將沙子和鉛熔煉成鋼化玻璃。需要少量能 block.plastanium-compressor.description = 將原油和鈦壓縮製造塑鋼。 block.phase-weaver.description = 使用放射性的釷和大量的沙子生產相織布。需要巨量能量。 block.alloy-smelter.description = 使用鈦、鉛、矽和銅以生產波動合金。 -block.cryofluidmixer.description = 混合水和研磨的鈦粉製造冷卻效率更高的冷凍液。對釷反應堆是必要的。 +block.cryofluid-mixer.description = 混合水和研磨的鈦粉製造冷卻效率更高的冷凍液。對釷反應堆是必要的。 block.blast-mixer.description = 混合胞子碎塊將火焰彈變成比較不易燃但更具爆炸性的爆炸混合物。 block.pyratite-mixer.description = 混合煤、鉛和沙子混合成為易燃的火焰彈。 block.melter.description = 將廢料加熱到很高的溫度產生熔渣,用於進一步製程或波浪炮。 @@ -1192,7 +1265,7 @@ block.battery.description = 有能量剩餘時存儲電力並在能量短缺時 block.battery-large.description = 比普通電池存儲更多的能量。 block.combustion-generator.description = 透過燃燒原油或可燃物品以產生能量。 block.thermal-generator.description = 放置在熱的位置時會產生能量。 -block.turbine-generator.description = 比燃燒發電機更有效率,但需要水才能運作。 +block.steam-generator.description = 比燃燒發電機更有效率,但需要水才能運作。 block.differential-generator.description = 利用冷卻液和燃燒火焰彈之間的溫差產生大量的能量。 block.rtg-generator.description = 一種簡單、可靠的發電機,使用放射性化合物衰變所產生的熱產生少量能量。不需要冷卻,但產生的能量比釷反應堆少。 block.solar-panel.description = 透過太陽產生少量的能量。 diff --git a/core/assets/contributors b/core/assets/contributors index ee8b77ddb9..69de5a3d8e 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -89,3 +89,9 @@ Daniel Dusek DeltaNedas GioIacca9 SnakkiZXZ +sk7725 +The Slaylord +ThePlayerA +YellOw139 +PetrGasparik +LeoDog896 diff --git a/core/assets/fonts/font.woff b/core/assets/fonts/font.woff index 7960523d0f..4d8ed4b9f7 100644 Binary files a/core/assets/fonts/font.woff and b/core/assets/fonts/font.woff differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index f364d6e709..417ed98b34 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -21,15 +21,8 @@ 63723=ice|block-ice-medium 63722=ice-snow|block-ice-snow-medium 63721=cliffs|block-cliffs-medium -63720=rocks|block-rocks-medium -63719=sporerocks|block-sporerocks-medium 63718=rock|block-rock-medium 63717=snowrock|block-snowrock-medium -63716=icerocks|block-icerocks-medium -63715=snowrocks|block-snowrocks-medium -63714=dunerocks|block-dunerocks-medium -63713=sandrocks|block-sandrocks-medium -63712=saltrocks|block-saltrocks-medium 63711=spore-pine|block-spore-pine-medium 63710=snow-pine|block-snow-pine-medium 63709=pine|block-pine-medium @@ -38,7 +31,6 @@ 63706=white-tree|block-white-tree-medium 63705=spore-cluster|block-spore-cluster-medium 63704=shale|block-shale-medium -63703=shalerocks|block-shalerocks-medium 63702=shale-boulder|block-shale-boulder-medium 63701=sand-boulder|block-sand-boulder-medium 63700=moss|block-moss-medium @@ -70,7 +62,7 @@ 63674=plastanium-compressor|block-plastanium-compressor-medium 63673=phase-weaver|block-phase-weaver-medium 63672=alloy-smelter|block-alloy-smelter-medium -63671=cryofluidmixer|block-cryofluidmixer-medium +63671=cryofluid-mixer|block-cryofluid-mixer-medium 63670=blast-mixer|block-blast-mixer-medium 63669=pyratite-mixer|block-pyratite-mixer-medium 63668=melter|block-melter-medium @@ -134,7 +126,7 @@ 63610=battery-large|block-battery-large-medium 63609=combustion-generator|block-combustion-generator-medium 63608=thermal-generator|block-thermal-generator-medium -63607=turbine-generator|block-turbine-generator-medium +63607=steam-generator|block-steam-generator-medium 63606=differential-generator|block-differential-generator-medium 63605=rtg-generator|block-rtg-generator-medium 63604=solar-panel|block-solar-panel-medium @@ -292,3 +284,33 @@ 63452=cataclyst|unit-cataclyst-medium 63451=scepter|unit-scepter-medium 63450=reign|unit-reign-medium +63449=dirt|block-dirt-medium +63448=dirtwall|block-dirtwall-medium +63447=stone-wall|block-stone-wall-medium +63446=spore-wall|block-spore-wall-medium +63445=ice-wall|block-ice-wall-medium +63444=snow-wall|block-snow-wall-medium +63443=dune-wall|block-dune-wall-medium +63442=sand-wall|block-sand-wall-medium +63441=salt-wall|block-salt-wall-medium +63440=shale-wall|block-shale-wall-medium +63439=dirt-wall|block-dirt-wall-medium +63438=holostone-wall|block-holostone-wall-medium +63437=basalt|block-basalt-medium +63436=dacite|block-dacite-medium +63435=boulder|block-boulder-medium +63434=snow-boulder|block-snow-boulder-medium +63433=dacite-wall|block-dacite-wall-medium +63432=dacite-boulder|block-dacite-boulder-medium +63431=large-logic-display|block-large-logic-display-medium +63430=omura|unit-omura-medium +63429=mud|block-mud-medium +63428=sei|unit-sei-medium +63427=quad|unit-quad-medium +63426=oct|unit-oct-medium +63425=vela|unit-vela-medium +63424=corvus|unit-corvus-medium +63423=memory-bank|block-memory-bank-medium +63422=foreshadow|block-foreshadow-medium +63421=tsunami|block-tsunami-medium +63420=space|block-space-medium diff --git a/core/assets/maps/caldera.msav b/core/assets/maps/caldera.msav index 4ed0889f5e..fae2a2e862 100644 Binary files a/core/assets/maps/caldera.msav and b/core/assets/maps/caldera.msav differ diff --git a/core/assets/maps/craters.msav b/core/assets/maps/craters.msav index b879701ae6..b10b354bf0 100644 Binary files a/core/assets/maps/craters.msav and b/core/assets/maps/craters.msav differ diff --git a/core/assets/maps/fork.msav b/core/assets/maps/fork.msav index 0a6a82d226..f4bf6985fe 100644 Binary files a/core/assets/maps/fork.msav and b/core/assets/maps/fork.msav differ diff --git a/core/assets/maps/fortress.msav b/core/assets/maps/fortress.msav index c5f58e0380..db60a0490d 100644 Binary files a/core/assets/maps/fortress.msav and b/core/assets/maps/fortress.msav differ diff --git a/core/assets/maps/glacier.msav b/core/assets/maps/glacier.msav index 1494079697..83a4f07437 100644 Binary files a/core/assets/maps/glacier.msav and b/core/assets/maps/glacier.msav differ diff --git a/core/assets/maps/islands.msav b/core/assets/maps/islands.msav index 48e13f8b6f..1b833e98d0 100644 Binary files a/core/assets/maps/islands.msav and b/core/assets/maps/islands.msav differ diff --git a/core/assets/maps/labyrinth.msav b/core/assets/maps/labyrinth.msav index 7501a592ad..d63ca28bf9 100644 Binary files a/core/assets/maps/labyrinth.msav and b/core/assets/maps/labyrinth.msav differ diff --git a/core/assets/maps/maze.msav b/core/assets/maps/maze.msav index ea34efa876..25386f23c4 100644 Binary files a/core/assets/maps/maze.msav and b/core/assets/maps/maze.msav differ diff --git a/core/assets/maps/shattered.msav b/core/assets/maps/shattered.msav index cad5016e9d..a822e2d121 100644 Binary files a/core/assets/maps/shattered.msav and b/core/assets/maps/shattered.msav differ diff --git a/core/assets/maps/tendrils.msav b/core/assets/maps/tendrils.msav index 178c11a03e..3034fb5ec1 100644 Binary files a/core/assets/maps/tendrils.msav and b/core/assets/maps/tendrils.msav differ diff --git a/core/assets/maps/triad.msav b/core/assets/maps/triad.msav index a693b02cba..fd25effa9c 100644 Binary files a/core/assets/maps/triad.msav and b/core/assets/maps/triad.msav differ diff --git a/core/assets/maps/veins.msav b/core/assets/maps/veins.msav index 6ad97e728a..744dbaf99d 100644 Binary files a/core/assets/maps/veins.msav and b/core/assets/maps/veins.msav differ diff --git a/core/assets/maps/wasteland.msav b/core/assets/maps/wasteland.msav index f7bb73595e..b00e76fd12 100644 Binary files a/core/assets/maps/wasteland.msav and b/core/assets/maps/wasteland.msav differ diff --git a/core/assets/music/game4.ogg b/core/assets/music/game4.ogg index 5b9dbe5ee4..051c414540 100644 Binary files a/core/assets/music/game4.ogg and b/core/assets/music/game4.ogg differ diff --git a/core/assets/planets/serpulo.dat b/core/assets/planets/serpulo.dat deleted file mode 100644 index 3a1465dfde..0000000000 Binary files a/core/assets/planets/serpulo.dat and /dev/null differ diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 5377350e3d..81a07f2bef 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -74,6 +74,7 @@ importPackage(Packages.mindustry.gen) importPackage(Packages.mindustry.graphics) importPackage(Packages.mindustry.graphics.g3d) importPackage(Packages.mindustry.input) +importPackage(Packages.mindustry.io) importPackage(Packages.mindustry.logic) importPackage(Packages.mindustry.maps) importPackage(Packages.mindustry.maps.filters) @@ -107,7 +108,6 @@ importPackage(Packages.mindustry.world.draw) importPackage(Packages.mindustry.world.meta) importPackage(Packages.mindustry.world.meta.values) importPackage(Packages.mindustry.world.modules) -importPackage(Packages.mindustry.world.producers) const PlayerIpUnbanEvent = Packages.mindustry.game.EventType.PlayerIpUnbanEvent const PlayerIpBanEvent = Packages.mindustry.game.EventType.PlayerIpBanEvent const PlayerUnbanEvent = Packages.mindustry.game.EventType.PlayerUnbanEvent @@ -117,6 +117,7 @@ const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent +const UnitDrownEvent = Packages.mindustry.game.EventType.UnitDrownEvent const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent const BlockDestroyEvent = Packages.mindustry.game.EventType.BlockDestroyEvent const BuildSelectEvent = Packages.mindustry.game.EventType.BuildSelectEvent @@ -127,6 +128,7 @@ const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent +const TapEvent = Packages.mindustry.game.EventType.TapEvent const ConfigEvent = Packages.mindustry.game.EventType.ConfigEvent const DepositEvent = Packages.mindustry.game.EventType.DepositEvent const WithdrawEvent = Packages.mindustry.game.EventType.WithdrawEvent @@ -153,7 +155,6 @@ const SaveLoadEvent = Packages.mindustry.game.EventType.SaveLoadEvent const MapPublishEvent = Packages.mindustry.game.EventType.MapPublishEvent const MapMakeEvent = Packages.mindustry.game.EventType.MapMakeEvent const ResizeEvent = Packages.mindustry.game.EventType.ResizeEvent -const LaunchEvent = Packages.mindustry.game.EventType.LaunchEvent const LoseEvent = Packages.mindustry.game.EventType.LoseEvent const WinEvent = Packages.mindustry.game.EventType.WinEvent const Trigger = Packages.mindustry.game.EventType.Trigger diff --git a/core/assets/shaders/mud.frag b/core/assets/shaders/mud.frag new file mode 100644 index 0000000000..3858cdec63 --- /dev/null +++ b/core/assets/shaders/mud.frag @@ -0,0 +1,29 @@ +#define HIGHP + +#define NSCALE 180.0 / 2.0 + +uniform sampler2D u_texture; +uniform sampler2D u_noise; + +uniform vec2 u_campos; +uniform vec2 u_resolution; +uniform float u_time; + +varying vec2 v_texCoords; + +void main(){ + vec2 c = v_texCoords.xy; + vec2 coords = vec2(c.x * u_resolution.x + u_campos.x, c.y * u_resolution.y + u_campos.y); + + float btime = u_time / 70000.0; + float noise = sin((texture2D(u_noise, (coords) / NSCALE + vec2(btime) * vec2(-0.9, 0.8)).r + texture2D(u_noise, (coords) / NSCALE + vec2(abs(sin(btime)) * 1.1) * vec2(-0.8, -1.0)).r) / 2.0); + vec4 color = texture2D(u_texture, c); + + if(noise > 0.54 && noise < 0.68){ + color.rgb *= 1.4; + }else if(!(noise > 0.40 && noise < 0.54)){ + color.rgb *= 1.2; + } + + gl_FragColor = color; +} diff --git a/core/assets/shaders/slag.frag b/core/assets/shaders/slag.frag index 2dae9dc45c..f904d48dbf 100755 --- a/core/assets/shaders/slag.frag +++ b/core/assets/shaders/slag.frag @@ -22,12 +22,10 @@ void main(){ float noise = (texture2D(u_noise, (coords) / NSCALE + vec2(btime) * vec2(-0.9, 0.8)).r + texture2D(u_noise, (coords) / NSCALE + vec2(btime * 1.1) * vec2(0.8, -1.0)).r) / 2.0; vec4 color = texture2D(u_texture, c); - if(color.a > 0.1){ - if(noise > 0.6){ - color.rgb = S2; - }else if (noise > 0.54){ - color.rgb = S1; - } + if(noise > 0.6){ + color.rgb = S2; + }else if (noise > 0.54){ + color.rgb = S1; } gl_FragColor = color; diff --git a/core/assets/shaders/space.frag b/core/assets/shaders/space.frag new file mode 100755 index 0000000000..4b95cf7438 --- /dev/null +++ b/core/assets/shaders/space.frag @@ -0,0 +1,23 @@ +#define HIGHP +#define NSCALE 2700.0 +#define CAMSCALE (NSCALE*5.0) + +uniform sampler2D u_texture; +uniform sampler2D u_stars; + +uniform vec2 u_campos; +uniform vec2 u_ccampos; +uniform vec2 u_resolution; +uniform float u_time; + +varying vec2 v_texCoords; + +void main(){ + vec2 c = v_texCoords.xy; + vec2 coords = vec2(c.x * u_resolution.x, c.y * u_resolution.y); + + vec4 color = texture2D(u_texture, c); + color.rgb = texture2D(u_stars, coords/NSCALE + vec2(-0.1, -0.1) + u_ccampos / CAMSCALE).rgb; + + gl_FragColor = color; +} \ No newline at end of file diff --git a/core/assets/shaders/tar.frag b/core/assets/shaders/tar.frag index 39b0c27492..ea2a3b3f1d 100644 --- a/core/assets/shaders/tar.frag +++ b/core/assets/shaders/tar.frag @@ -20,7 +20,7 @@ void main(){ vec4 color = texture2D(u_texture, c); if(!(noise > 0.54 && noise < 0.58)){ - color.rgb *= 0.6; + color.rgb *= vec3(0.6, 0.6, 0.7); } gl_FragColor = color; diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 4d9968f45e..3e19c96e61 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/fallback/sprites.atlas b/core/assets/sprites/fallback/sprites.atlas index c7332f3ba6..fd8aece5ae 100644 --- a/core/assets/sprites/fallback/sprites.atlas +++ b/core/assets/sprites/fallback/sprites.atlas @@ -6,408 +6,240 @@ filter: nearest,nearest repeat: none white-tree rotate: false - xy: 1, 389 + xy: 1127, 1273 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead rotate: false - xy: 1322, 1705 + xy: 1127, 951 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead-shadow rotate: false - xy: 1, 1677 + xy: 403, 843 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 white-tree-shadow rotate: false - xy: 1, 1677 + xy: 403, 843 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 -exponential-reconstructor - rotate: false - xy: 1387, 479 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -exponential-reconstructor-top - rotate: false - xy: 1387, 253 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -factory-in-7 - rotate: false - xy: 549, 33 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 factory-in-9 rotate: false - xy: 613, 835 + xy: 1015, 371 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 -factory-out-7 - rotate: false - xy: 1613, 963 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 factory-out-9 rotate: false - xy: 903, 1125 + xy: 725, 81 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor rotate: false - xy: 1193, 1415 + xy: 1015, 81 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor-top rotate: false - xy: 613, 545 + xy: 1338, 515 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 -antumbra-wreck0 - rotate: false - xy: 1613, 479 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck1 - rotate: false - xy: 1831, 479 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck2 - rotate: false - xy: 1613, 237 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-full - rotate: false - xy: 1161, 899 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 block-tetrative-reconstructor-full rotate: false - xy: 1, 99 + xy: 1449, 1385 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 -cracks-7-0 - rotate: false - xy: 1161, 673 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-1 - rotate: false - xy: 1161, 447 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-2 - rotate: false - xy: 1161, 221 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-3 - rotate: false - xy: 1451, 1189 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-4 - rotate: false - xy: 1741, 1253 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-5 - rotate: false - xy: 581, 291 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-6 - rotate: false - xy: 1387, 931 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-7 - rotate: false - xy: 1387, 705 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-8-0 - rotate: false - xy: 903, 867 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-1 - rotate: false - xy: 1193, 1157 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-2 - rotate: false - xy: 903, 609 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-3 - rotate: false - xy: 1483, 1447 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-4 - rotate: false - xy: 1741, 1479 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-5 - rotate: false - xy: 323, 259 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-6 - rotate: false - xy: 291, 1 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-7 - rotate: false - xy: 903, 351 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 cracks-9-0 rotate: false - xy: 1644, 1737 + xy: 1449, 1095 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-1 rotate: false - xy: 323, 1387 + xy: 1449, 805 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-2 rotate: false - xy: 323, 1097 + xy: 1739, 1385 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-3 rotate: false - xy: 323, 807 + xy: 1739, 1095 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-4 rotate: false - xy: 323, 517 + xy: 1739, 805 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-5 rotate: false - xy: 613, 1415 + xy: 758, 661 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-6 rotate: false - xy: 613, 1125 + xy: 1048, 661 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-7 rotate: false - xy: 903, 1415 + xy: 725, 371 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 +eclipse-outline + rotate: false + xy: 1, 67 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 eclipse-wreck0 rotate: false - xy: 1, 1033 + xy: 403, 521 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck1 rotate: false - xy: 678, 1705 + xy: 1529, 1675 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck2 rotate: false - xy: 1, 711 + xy: 403, 199 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 -reign-wreck0 +oct-outline rotate: false - xy: 1603, 95 - size: 214, 140 - orig: 214, 140 + xy: 403, 1595 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 -reign-wreck1 +oct-wreck0 rotate: false - xy: 1819, 95 - size: 214, 140 - orig: 214, 140 + xy: 1, 791 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 -reign-wreck2 +oct-wreck1 rotate: false - xy: 807, 209 - size: 214, 140 - orig: 214, 140 + xy: 403, 1193 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 -unit-antumbra-full +oct-wreck2 rotate: false - xy: 1831, 237 - size: 216, 240 - orig: 216, 240 + xy: 805, 1595 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +omura-outline + rotate: false + xy: 1587, 1 + size: 280, 400 + orig: 280, 400 offset: 0, 0 index: -1 unit-eclipse-full rotate: false - xy: 1000, 1705 + xy: 805, 951 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 -unit-reign-full +unit-oct-full rotate: false - xy: 775, 67 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -circle - rotate: false - xy: 991, 6 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 -antumbra - rotate: false - xy: 1613, 721 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-cell - rotate: false - xy: 1831, 721 - size: 216, 240 - orig: 216, 240 + xy: 1, 389 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 eclipse rotate: false - xy: 1, 1355 + xy: 805, 1273 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-cell rotate: false - xy: 356, 1705 + xy: 1207, 1675 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 -reign +oct rotate: false - xy: 1387, 111 - size: 214, 140 - orig: 214, 140 + xy: 1, 1595 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 -toxopid-cannon +oct-cell rotate: false - xy: 1839, 1031 - size: 206, 220 - orig: 206, 220 + xy: 1, 1193 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 -toxopid-leg-base +omura rotate: false - xy: 1, 33 - size: 270, 64 - orig: 270, 64 + xy: 1305, 113 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-cell + rotate: false + xy: 1628, 403 + size: 280, 400 + orig: 280, 400 offset: 0, 0 index: -1 @@ -416,6209 +248,7328 @@ size: 2048,2048 format: rgba8888 filter: nearest,nearest repeat: none -core-silo +large-logic-display rotate: false - xy: 1810, 1887 - size: 160, 160 - orig: 160, 160 + xy: 1567, 102 + size: 192, 192 + orig: 192, 192 offset: 0, 0 index: -1 -launch-pad +exponential-reconstructor rotate: false - xy: 1135, 881 - size: 96, 96 - orig: 96, 96 + xy: 767, 1071 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -launch-pad-large +exponential-reconstructor-top rotate: false - xy: 487, 141 - size: 128, 128 - orig: 128, 128 + xy: 993, 1313 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -launch-pad-light +factory-in-7 rotate: false - xy: 1237, 1253 - size: 96, 96 - orig: 96, 96 + xy: 993, 1087 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -launchpod +factory-out-7 rotate: false - xy: 1673, 238 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -force-projector - rotate: false - xy: 1139, 387 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -force-projector-top - rotate: false - xy: 1139, 289 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mend-projector - rotate: false - xy: 1871, 277 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mend-projector-top - rotate: false - xy: 1871, 211 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overdrive-dome - rotate: false - xy: 1331, 959 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-dome-top - rotate: false - xy: 1429, 959 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -overdrive-projector - rotate: false - xy: 1871, 145 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overdrive-projector-top - rotate: false - xy: 1855, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-loader - rotate: false - xy: 845, 579 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-unloader - rotate: false - xy: 943, 579 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -distributor - rotate: false - xy: 1629, 423 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver-base - rotate: false - xy: 1433, 1155 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor - rotate: false - xy: 1527, 959 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-edge - rotate: false - xy: 1233, 861 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-top - rotate: false - xy: 1331, 861 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-top - rotate: false - xy: 1331, 861 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router - rotate: false - xy: 1429, 861 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-edge - rotate: false - xy: 1527, 861 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-over - rotate: false - xy: 1629, 1219 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-drill - rotate: false - xy: 349, 1107 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rim - rotate: false - xy: 487, 1311 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rotator - rotate: false - xy: 479, 1181 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-top - rotate: false - xy: 479, 1051 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -drill-top - rotate: false - xy: 1607, 357 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-liquid - rotate: false - xy: 1607, 357 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -laser-drill - rotate: false - xy: 1139, 1273 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rim - rotate: false - xy: 1139, 1175 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rotator - rotate: false - xy: 1139, 1077 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-top - rotate: false - xy: 1135, 979 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-drill - rotate: false - xy: 1827, 475 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-rotator - rotate: false - xy: 1827, 409 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-top - rotate: false - xy: 1827, 343 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -oil-extractor - rotate: false - xy: 1335, 1057 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-liquid - rotate: false - xy: 1433, 1057 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-rotator - rotate: false - xy: 1531, 1057 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-top - rotate: false - xy: 1233, 959 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -pneumatic-drill - rotate: false - xy: 1893, 429 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-rotator - rotate: false - xy: 1893, 363 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-top - rotate: false - xy: 1959, 495 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -place-arrow - rotate: false - xy: 1629, 1121 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-bottom - rotate: false - xy: 1335, 1253 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-liquid - rotate: false - xy: 1237, 1155 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-top - rotate: false - xy: 1433, 1253 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rotary-pump - rotate: false - xy: 1937, 99 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-pump - rotate: false - xy: 1237, 567 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hyper-processor - rotate: false - xy: 1041, 1273 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-display - rotate: false - xy: 1335, 1155 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-processor - rotate: false - xy: 1605, 159 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -battery-large - rotate: false - xy: 747, 328 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-large-top - rotate: false - xy: 747, 230 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator - rotate: false - xy: 1041, 289 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-liquid - rotate: false - xy: 1041, 191 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-top - rotate: false - xy: 1041, 93 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -impact-reactor - rotate: false - xy: 1421, 1465 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-bottom - rotate: false - xy: 1551, 1465 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-light - rotate: false - xy: 1681, 1465 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-0 - rotate: false - xy: 1811, 1465 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-1 - rotate: false - xy: 487, 531 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-2 - rotate: false - xy: 487, 401 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-3 - rotate: false - xy: 487, 271 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -power-node-large - rotate: false - xy: 1959, 429 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rtg-generator - rotate: false - xy: 1671, 106 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -solar-panel-large - rotate: false - xy: 1433, 763 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor - rotate: false - xy: 1335, 665 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-lights - rotate: false - xy: 1237, 469 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-top - rotate: false - xy: 1335, 567 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter - rotate: false - xy: 747, 524 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-top - rotate: false - xy: 747, 426 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-mixer - rotate: false - xy: 1778, 673 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-forge - rotate: false - xy: 1941, 1529 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -coal-centrifuge - rotate: false - xy: 1475, 324 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-bottom - rotate: false - xy: 1539, 192 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-liquid - rotate: false - xy: 1539, 126 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-top - rotate: false - xy: 1563, 456 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator - rotate: false - xy: 1575, 60 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-middle - rotate: false - xy: 1629, 489 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-top - rotate: false - xy: 1695, 502 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -disassembler - rotate: false - xy: 1037, 975 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-liquid - rotate: false - xy: 1037, 877 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-spinner - rotate: false - xy: 1121, 779 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -graphite-press - rotate: false - xy: 1761, 409 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln - rotate: false - xy: 1695, 370 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln-top - rotate: false - xy: 1673, 304 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter-top - rotate: false - xy: 1673, 304 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -multi-press - rotate: false - xy: 1531, 1155 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -phase-weaver - rotate: false - xy: 1921, 693 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-bottom - rotate: false - xy: 1844, 627 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-weave - rotate: false - xy: 1844, 561 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor - rotate: false - xy: 1910, 627 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor-top - rotate: false - xy: 1910, 561 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pyratite-mixer - rotate: false - xy: 1937, 297 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-crucible - rotate: false - xy: 1335, 763 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-crucible-top - rotate: false - xy: 1237, 665 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -container - rotate: false - xy: 1407, 215 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation - rotate: false - xy: 465, 661 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team - rotate: false - xy: 901, 1583 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus - rotate: false - xy: 1, 158 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team - rotate: false - xy: 1324, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard - rotate: false - xy: 943, 481 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team - rotate: false - xy: 943, 383 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault - rotate: false - xy: 1237, 371 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-2 - rotate: false - xy: 1778, 607 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-3 - rotate: false - xy: 747, 132 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-4 - rotate: false - xy: 349, 977 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -lancer-heat - rotate: false - xy: 1607, 225 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -meltdown-heat - rotate: false - xy: 595, 791 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -ripple-heat - rotate: false - xy: 1625, 925 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salvo-heat - rotate: false - xy: 1803, 79 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-left - rotate: false - xy: 1869, 79 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-right - rotate: false - xy: 1935, 33 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -additive-reconstructor - rotate: false - xy: 841, 1069 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -additive-reconstructor-top - rotate: false - xy: 841, 971 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory - rotate: false - xy: 747, 622 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -command-center - rotate: false - xy: 1409, 281 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -factory-in-3 - rotate: false - xy: 1139, 681 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-in-5 - rotate: false - xy: 173, 584 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-out-3 - rotate: false - xy: 1139, 583 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-out-5 - rotate: false - xy: 163, 422 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-top-3 - rotate: false - xy: 1139, 485 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ground-factory - rotate: false - xy: 1139, 93 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor - rotate: false - xy: 163, 260 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-top - rotate: false - xy: 163, 98 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory - rotate: false - xy: 1237, 1057 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rally-point - rotate: false - xy: 1937, 231 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -resupply-point - rotate: false - xy: 1937, 165 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -copper-wall-large - rotate: false - xy: 1475, 258 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large - rotate: false - xy: 1695, 436 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large-open - rotate: false - xy: 1761, 475 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-wall-large - rotate: false - xy: 1855, 693 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-wall-large - rotate: false - xy: 1893, 495 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-gigantic - rotate: false - xy: 629, 1441 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge2 - rotate: false - xy: 1723, 811 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge3 - rotate: false - xy: 1237, 763 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-large1 - rotate: false - xy: 1976, 627 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large2 - rotate: false - xy: 1976, 561 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large3 - rotate: false - xy: 1707, 13 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large4 - rotate: false - xy: 1773, 13 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thruster - rotate: false - xy: 609, 921 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -circle-end - rotate: false - xy: 725, 720 - size: 100, 199 - orig: 100, 199 + xy: 1219, 1313 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 circle-shadow rotate: false - xy: 1, 1846 + xy: 1620, 684 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 -laser-end +antumbra-outline rotate: false - xy: 1237, 66 - size: 72, 72 - orig: 72, 72 + xy: 719, 143 + size: 216, 240 + orig: 216, 240 offset: 0, 0 index: -1 -minelaser-end +antumbra-wreck0 rotate: false - xy: 1335, 339 - size: 72, 72 - orig: 72, 72 + xy: 941, 385 + size: 216, 240 + orig: 216, 240 offset: 0, 0 index: -1 -parallax-laser-end +antumbra-wreck1 rotate: false - xy: 1333, 265 - size: 72, 72 - orig: 72, 72 + xy: 937, 143 + size: 216, 240 + orig: 216, 240 offset: 0, 0 index: -1 -arkyid-wreck0 +antumbra-wreck2 rotate: false - xy: 499, 1441 - size: 128, 128 - orig: 128, 128 + xy: 1667, 1313 + size: 216, 240 + orig: 216, 240 offset: 0, 0 index: -1 -arkyid-wreck1 +block-exponential-reconstructor-full rotate: false - xy: 357, 1367 - size: 128, 128 - orig: 128, 128 + xy: 1823, 1797 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -arkyid-wreck2 +corvus-outline rotate: false - xy: 349, 1237 - size: 128, 128 - orig: 128, 128 + xy: 933, 1 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -atrax-wreck0 +corvus-wreck0 rotate: false - xy: 1531, 729 - size: 88, 64 - orig: 88, 64 + xy: 993, 945 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -atrax-wreck1 +corvus-wreck1 rotate: false - xy: 1531, 663 - size: 88, 64 - orig: 88, 64 + xy: 985, 803 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -atrax-wreck2 +corvus-wreck2 rotate: false - xy: 1529, 597 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -block-additive-reconstructor-full - rotate: false - xy: 747, 34 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-air-factory-full - rotate: false - xy: 1911, 1367 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-blast-drill-full - rotate: false - xy: 335, 847 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-foundation-full - rotate: false - xy: 335, 717 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-nucleus-full - rotate: false - xy: 1, 482 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-core-shard-full - rotate: false - xy: 1907, 1269 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-cryofluidmixer-full - rotate: false - xy: 1778, 541 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cultivator-full - rotate: false - xy: 1899, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cyclone-full - rotate: false - xy: 1941, 1627 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-fuse-full - rotate: false - xy: 943, 1171 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-ground-factory-full - rotate: false - xy: 841, 873 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-impact-reactor-full - rotate: false - xy: 335, 587 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-lancer-full - rotate: false - xy: 1895, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-laser-drill-full - rotate: false - xy: 827, 775 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-liquid-tank-full - rotate: false - xy: 845, 677 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mass-driver-full - rotate: false - xy: 845, 481 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mechanical-drill-full - rotate: false - xy: 1895, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-meltdown-full - rotate: false - xy: 479, 921 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-full - rotate: false - xy: 1, 320 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-naval-factory-full - rotate: false - xy: 845, 383 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-oil-extractor-full - rotate: false - xy: 845, 285 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-parallax-full - rotate: false - xy: 1311, 53 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-payload-conveyor-full - rotate: false - xy: 845, 187 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-icon - rotate: false - xy: 845, 187 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-payload-router-full - rotate: false - xy: 845, 89 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon - rotate: false - xy: 845, 89 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-phase-weaver-full - rotate: false - xy: 1377, 53 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pneumatic-drill-full - rotate: false - xy: 1965, 957 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-ripple-full - rotate: false - xy: 925, 775 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-salvo-full - rotate: false - xy: 1961, 891 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scatter-full - rotate: false - xy: 1961, 825 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-full - rotate: false - xy: 943, 677 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge1 - rotate: false - xy: 943, 677 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-scrap-wall-large-full - rotate: false - xy: 1619, 555 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-segment-full - rotate: false - xy: 1409, 347 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-spectre-full - rotate: false - xy: 465, 791 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-spore-press-full - rotate: false - xy: 1433, 522 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-swarmer-full - rotate: false - xy: 1431, 456 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-turbine-generator-full - rotate: false - xy: 1499, 522 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-water-extractor-full - rotate: false - xy: 1497, 456 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-wave-full - rotate: false - xy: 1475, 390 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bryde-wreck0 - rotate: false - xy: 509, 1713 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck1 - rotate: false - xy: 651, 1713 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck2 - rotate: false - xy: 793, 1713 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -core-foundation-team-crux - rotate: false - xy: 1031, 1615 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team-sharded - rotate: false - xy: 1161, 1615 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-team-crux - rotate: false - xy: 1486, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team-sharded - rotate: false - xy: 1648, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-team-crux - rotate: false - xy: 943, 285 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team-sharded - rotate: false - xy: 943, 187 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 1473, 192 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-1 - rotate: false - xy: 1407, 149 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-2 - rotate: false - xy: 1473, 126 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-3 - rotate: false - xy: 1443, 60 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-4 - rotate: false - xy: 1509, 60 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-5 - rotate: false - xy: 1541, 390 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-6 - rotate: false - xy: 1541, 324 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-7 - rotate: false - xy: 1541, 258 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-3-0 - rotate: false - xy: 943, 89 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-1 - rotate: false - xy: 943, 1073 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-2 - rotate: false - xy: 939, 975 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-3 - rotate: false - xy: 939, 877 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-4 - rotate: false - xy: 1023, 779 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-5 - rotate: false - xy: 1041, 681 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-6 - rotate: false - xy: 1041, 583 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-7 - rotate: false - xy: 1041, 485 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-4-0 - rotate: false - xy: 1291, 1595 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-1 - rotate: false - xy: 1421, 1595 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-2 - rotate: false - xy: 1551, 1595 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-3 - rotate: false - xy: 1681, 1595 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-4 - rotate: false - xy: 1811, 1595 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-5 - rotate: false - xy: 1031, 1485 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-6 - rotate: false - xy: 1161, 1485 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-7 - rotate: false - xy: 1291, 1465 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-5-0 - rotate: false - xy: 980, 1745 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-1 - rotate: false - xy: 1142, 1745 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-2 - rotate: false - xy: 1304, 1725 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-3 - rotate: false - xy: 1466, 1725 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-4 - rotate: false - xy: 1628, 1725 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-5 - rotate: false - xy: 1790, 1725 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-6 - rotate: false - xy: 173, 908 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-7 - rotate: false - xy: 173, 746 - size: 160, 160 - orig: 160, 160 + xy: 969, 661 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 cracks-6-0 rotate: false - xy: 1, 1652 + xy: 1367, 494 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-1 rotate: false - xy: 204, 1855 + xy: 1561, 490 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-2 rotate: false - xy: 1, 1458 + xy: 1755, 490 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-3 rotate: false - xy: 398, 1855 + xy: 1823, 693 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-4 rotate: false - xy: 1, 1264 + xy: 1373, 296 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-5 rotate: false - xy: 592, 1855 + xy: 1567, 296 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-6 rotate: false - xy: 1, 1070 + xy: 1761, 296 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-7 rotate: false - xy: 786, 1855 + xy: 1373, 102 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 -cyclone +cracks-7-0 rotate: false - xy: 1041, 387 + xy: 1823, 1571 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-1 + rotate: false + xy: 807, 1539 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-2 + rotate: false + xy: 1033, 1539 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-3 + rotate: false + xy: 541, 1297 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-4 + rotate: false + xy: 541, 1071 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-5 + rotate: false + xy: 1259, 1539 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-6 + rotate: false + xy: 1485, 1555 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-7 + rotate: false + xy: 767, 1297 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-8-0 + rotate: false + xy: 565, 1765 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-1 + rotate: false + xy: 1, 559 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-2 + rotate: false + xy: 283, 1297 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-3 + rotate: false + xy: 823, 1765 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-4 + rotate: false + xy: 1, 301 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-5 + rotate: false + xy: 283, 1039 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-6 + rotate: false + xy: 1081, 1765 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-7 + rotate: false + xy: 1, 43 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +omura-wreck0 + rotate: false + xy: 1, 1621 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck1 + rotate: false + xy: 1, 1219 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck2 + rotate: false + xy: 283, 1621 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +quad-outline + rotate: false + xy: 541, 849 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck0 + rotate: false + xy: 763, 849 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck1 + rotate: false + xy: 525, 627 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck2 + rotate: false + xy: 747, 627 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +reign-outline + rotate: false + xy: 1661, 1171 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck0 + rotate: false + xy: 1441, 1033 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck1 + rotate: false + xy: 1657, 1029 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck2 + rotate: false + xy: 1219, 949 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +sei-outline + rotate: false + xy: 283, 797 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck0 + rotate: false + xy: 259, 555 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck1 + rotate: false + xy: 259, 313 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck2 + rotate: false + xy: 259, 71 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +toxopid-cannon-outline + rotate: false + xy: 1209, 727 + size: 206, 220 + orig: 206, 220 + offset: 0, 0 + index: -1 +toxopid-leg-base + rotate: false + xy: 283, 1555 + size: 270, 64 + orig: 270, 64 + offset: 0, 0 + index: -1 +unit-antumbra-full + rotate: false + xy: 1155, 143 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +unit-corvus-full + rotate: false + xy: 1435, 891 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +unit-omura-full + rotate: false + xy: 1, 817 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +unit-quad-full + rotate: false + xy: 501, 405 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +unit-reign-full + rotate: false + xy: 1651, 887 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +unit-sei-full + rotate: false + xy: 565, 1523 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +circle + rotate: false + xy: 1417, 688 + size: 201, 201 + orig: 201, 201 + offset: 0, 0 + index: -1 +antumbra + rotate: false + xy: 501, 163 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +antumbra-cell + rotate: false + xy: 723, 385 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +corvus + rotate: false + xy: 501, 21 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-cell + rotate: false + xy: 717, 1 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-weapon-heat + rotate: false + xy: 1149, 1 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +quad + rotate: false + xy: 1219, 1091 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-cell + rotate: false + xy: 1445, 1317 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +reign + rotate: false + xy: 1445, 1175 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +sei + rotate: false + xy: 1339, 1781 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-cell + rotate: false + xy: 1581, 1781 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +toxopid-cannon + rotate: false + xy: 1159, 439 + size: 206, 220 + orig: 206, 220 + offset: 0, 0 + index: -1 +omura-cannon + rotate: false + xy: 1761, 17 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 + +sprites3.png +size: 2048,2048 +format: rgba8888 +filter: nearest,nearest +repeat: none +launch-pad + rotate: false + xy: 813, 99 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -fortress-wreck0 +launch-pad-large rotate: false - xy: 1703, 1317 - size: 100, 80 - orig: 100, 80 + xy: 725, 1041 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -fortress-wreck1 +launch-pad-light rotate: false - xy: 1805, 1301 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck2 - rotate: false - xy: 759, 1371 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fuse - rotate: false - xy: 1139, 191 + xy: 813, 1 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -horizon-wreck0 +force-projector rotate: false - xy: 1825, 981 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck1 - rotate: false - xy: 1821, 907 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck2 - rotate: false - xy: 1821, 833 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 1761, 343 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck0 - rotate: false - xy: 1805, 277 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck1 - rotate: false - xy: 1805, 211 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck2 - rotate: false - xy: 1805, 145 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver - rotate: false - xy: 1531, 1253 + xy: 1527, 1221 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -mega-wreck0 +force-projector-top rotate: false - xy: 739, 1167 + xy: 1625, 1193 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +overdrive-dome + rotate: false + xy: 1589, 1095 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +overdrive-dome-top + rotate: false + xy: 1687, 1095 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-loader + rotate: false + xy: 1267, 529 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-unloader + rotate: false + xy: 1231, 235 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mass-driver-base + rotate: false + xy: 1009, 5 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor + rotate: false + xy: 1785, 1095 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor-edge + rotate: false + xy: 1589, 997 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor-top + rotate: false + xy: 1687, 997 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-top + rotate: false + xy: 1687, 997 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router + rotate: false + xy: 1785, 997 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-edge + rotate: false + xy: 1883, 1095 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-over + rotate: false + xy: 1883, 997 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +blast-drill + rotate: false + xy: 335, 1233 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +blast-drill-rim + rotate: false + xy: 335, 1103 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +blast-drill-rotator + rotate: false + xy: 465, 1233 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +blast-drill-top + rotate: false + xy: 335, 973 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +laser-drill + rotate: false + xy: 1491, 1025 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-rim + rotate: false + xy: 813, 295 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-rotator + rotate: false + xy: 911, 295 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-top + rotate: false + xy: 813, 197 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor + rotate: false + xy: 1205, 137 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-liquid + rotate: false + xy: 1205, 39 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-rotator + rotate: false + xy: 1303, 137 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-top + rotate: false + xy: 1303, 39 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +place-arrow + rotate: false + xy: 1919, 1193 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +liquid-tank-bottom + rotate: false + xy: 911, 197 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +liquid-tank-liquid + rotate: false + xy: 911, 99 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +liquid-tank-top + rotate: false + xy: 911, 1 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thermal-pump + rotate: false + xy: 1365, 847 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +hyper-processor + rotate: false + xy: 1491, 1123 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +logic-display + rotate: false + xy: 1009, 201 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +battery-large + rotate: false + xy: 1169, 921 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +battery-large-top + rotate: false + xy: 1169, 823 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +differential-generator + rotate: false + xy: 1445, 1319 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +differential-generator-liquid + rotate: false + xy: 1543, 1319 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +differential-generator-top + rotate: false + xy: 1641, 1389 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +impact-reactor + rotate: false + xy: 595, 583 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-bottom + rotate: false + xy: 595, 453 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-light + rotate: false + xy: 585, 323 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-0 + rotate: false + xy: 585, 193 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-1 + rotate: false + xy: 585, 63 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-2 + rotate: false + xy: 725, 1301 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-3 + rotate: false + xy: 725, 1171 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +solar-panel-large + rotate: false + xy: 1883, 899 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor + rotate: false + xy: 1365, 749 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor-lights + rotate: false + xy: 1365, 651 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor-top + rotate: false + xy: 1365, 553 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +alloy-smelter + rotate: false + xy: 1071, 725 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +alloy-smelter-top + rotate: false + xy: 1071, 627 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-forge + rotate: false + xy: 1267, 725 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +disassembler + rotate: false + xy: 1739, 1389 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +disassembler-liquid + rotate: false + xy: 1837, 1389 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +disassembler-spinner + rotate: false + xy: 1641, 1291 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +multi-press + rotate: false + xy: 1107, 137 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +silicon-crucible + rotate: false + xy: 1687, 899 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +silicon-crucible-top + rotate: false + xy: 1785, 899 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-foundation + rotate: false + xy: 465, 583 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation-team + rotate: false + xy: 335, 453 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-nucleus + rotate: false + xy: 1, 11 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team + rotate: false + xy: 1421, 1887 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-shard + rotate: false + xy: 1331, 1141 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team + rotate: false + xy: 1295, 1039 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault + rotate: false + xy: 1463, 535 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault-team + rotate: false + xy: 1561, 801 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-3 + rotate: false + xy: 1169, 725 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-4 + rotate: false + xy: 465, 1103 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +foreshadow-heat + rotate: false + xy: 595, 713 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +meltdown-heat + rotate: false + xy: 725, 781 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +ripple-heat + rotate: false + xy: 1401, 39 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +tsunami-liquid + rotate: false + xy: 1463, 731 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +tsunami-top + rotate: false + xy: 1463, 633 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +additive-reconstructor + rotate: false + xy: 1099, 1019 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +additive-reconstructor-top + rotate: false + xy: 1071, 921 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +air-factory + rotate: false + xy: 1071, 823 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +factory-in-3 + rotate: false + xy: 1739, 1291 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +factory-in-5 + rotate: false + xy: 163, 170 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +factory-out-3 + rotate: false + xy: 1837, 1291 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +factory-out-5 + rotate: false + xy: 163, 8 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +factory-top-3 + rotate: false + xy: 1429, 1221 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ground-factory + rotate: false + xy: 1821, 1193 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +multiplicative-reconstructor + rotate: false + xy: 389, 1745 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +multiplicative-reconstructor-top + rotate: false + xy: 551, 1745 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +naval-factory + rotate: false + xy: 1107, 39 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-gigantic + rotate: false + xy: 985, 1313 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scrap-wall-huge2 + rotate: false + xy: 1491, 927 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-huge3 + rotate: false + xy: 1589, 899 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thruster + rotate: false + xy: 985, 1183 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +circle-end + rotate: false + xy: 969, 852 + size: 100, 199 + orig: 100, 199 + offset: 0, 0 + index: -1 +large-bomb + rotate: false + xy: 1245, 1341 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -mega-wreck1 +large-bomb-back rotate: false - xy: 739, 1065 + xy: 855, 495 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -mega-wreck2 +laser-end rotate: false - xy: 739, 963 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -meltdown - rotate: false - xy: 487, 11 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck0 - rotate: false - xy: 617, 401 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck1 - rotate: false - xy: 617, 271 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck2 - rotate: false - xy: 617, 141 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -parallax - rotate: false - xy: 1921, 759 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -quasar-wreck0 - rotate: false - xy: 1907, 1105 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck1 - rotate: false - xy: 845, 7 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck2 - rotate: false - xy: 927, 7 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -ripple - rotate: false - xy: 1629, 1023 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck0 - rotate: false - xy: 1727, 1105 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck1 - rotate: false - xy: 1727, 1007 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck2 - rotate: false - xy: 1723, 909 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salvo - rotate: false - xy: 1737, 79 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scatter - rotate: false - xy: 1641, 40 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scepter-wreck0 - rotate: false - xy: 980, 1907 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck1 - rotate: false - xy: 1, 786 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck2 - rotate: false - xy: 1152, 1907 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -segment - rotate: false - xy: 1839, 13 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 609, 1051 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct-wreck0 - rotate: false - xy: 1237, 294 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck1 - rotate: false - xy: 1335, 413 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck2 - rotate: false - xy: 1237, 217 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -toxopid-wreck0 - rotate: false - xy: 325, 200 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck1 - rotate: false - xy: 325, 8 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck2 - rotate: false - xy: 195, 1654 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -unit-arkyid-full - rotate: false - xy: 759, 1453 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-atrax-full - rotate: false - xy: 1621, 761 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -unit-bryde-full - rotate: false - xy: 499, 1571 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -unit-fortress-full - rotate: false - xy: 849, 1269 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -unit-horizon-full - rotate: false - xy: 1333, 191 + xy: 1945, 1543 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -unit-mega-full +minelaser-end rotate: false - xy: 841, 1167 - size: 100, 100 - orig: 100, 100 + xy: 1951, 325 + size: 72, 72 + orig: 72, 72 offset: 0, 0 index: -1 -unit-minke-full +parallax-laser-end rotate: false - xy: 889, 1453 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-quasar-full - rotate: false - xy: 1907, 1023 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -unit-risso-full - rotate: false - xy: 1433, 665 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -unit-scepter-full - rotate: false - xy: 1, 644 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -unit-spiroct-full - rotate: false - xy: 1237, 140 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -unit-toxopid-full - rotate: false - xy: 195, 1462 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -unit-zenith-full - rotate: false - xy: 1019, 1371 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck0 - rotate: false - xy: 1361, 1351 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck1 - rotate: false - xy: 1475, 1351 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck2 - rotate: false - xy: 1589, 1351 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -arkyid - rotate: false - xy: 641, 1583 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-cell - rotate: false - xy: 771, 1583 - size: 128, 128 - orig: 128, 128 + xy: 1609, 303 + size: 72, 72 + orig: 72, 72 offset: 0, 0 index: -1 arkyid-foot rotate: false - xy: 1333, 119 + xy: 1757, 319 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-joint-base rotate: false - xy: 1711, 739 + xy: 1829, 319 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-leg-base rotate: false - xy: 1703, 1399 + xy: 725, 455 size: 104, 64 orig: 104, 64 offset: 0, 0 index: -1 -atrax +arkyid-outline rotate: false - xy: 1531, 795 + xy: 1067, 1443 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-wreck0 + rotate: false + xy: 1197, 1443 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-wreck1 + rotate: false + xy: 357, 1363 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-wreck2 + rotate: false + xy: 487, 1363 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +artillery-mount-outline + rotate: false + xy: 1755, 247 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +atrax-outline + rotate: false + xy: 1519, 245 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 -atrax-base +atrax-wreck0 rotate: false - xy: 257, 32 - size: 64, 64 - orig: 64, 64 + xy: 1499, 179 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-wreck1 + rotate: false + xy: 1499, 113 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-wreck2 + rotate: false + xy: 1499, 47 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +beam-weapon-outline + rotate: false + xy: 1827, 555 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +block-additive-reconstructor-full + rotate: false + xy: 1169, 627 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-air-factory-full + rotate: false + xy: 1197, 1019 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-blast-drill-full + rotate: false + xy: 335, 843 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-core-foundation-full + rotate: false + xy: 465, 973 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-core-nucleus-full + rotate: false + xy: 1, 335 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-core-shard-full + rotate: false + xy: 1267, 921 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-cyclone-full + rotate: false + xy: 1267, 823 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-foreshadow-full + rotate: false + xy: 335, 713 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-fuse-full + rotate: false + xy: 1267, 627 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-ground-factory-full + rotate: false + xy: 1035, 397 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-impact-reactor-full + rotate: false + xy: 465, 843 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-laser-drill-full + rotate: false + xy: 1071, 529 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-liquid-tank-full + rotate: false + xy: 1169, 529 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-mass-driver-full + rotate: false + xy: 1133, 431 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-meltdown-full + rotate: false + xy: 335, 583 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-full + rotate: false + xy: 1, 173 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-naval-factory-full + rotate: false + xy: 1231, 431 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-oil-extractor-full + rotate: false + xy: 1329, 431 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-payload-conveyor-full + rotate: false + xy: 1133, 333 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor-icon + rotate: false + xy: 1133, 333 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-payload-router-full + rotate: false + xy: 1231, 333 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-icon + rotate: false + xy: 1231, 333 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-ripple-full + rotate: false + xy: 1329, 333 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-full + rotate: false + xy: 1035, 299 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-huge1 + rotate: false + xy: 1035, 299 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-spectre-full + rotate: false + xy: 465, 713 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-tsunami-full + rotate: false + xy: 1133, 235 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-vault-full + rotate: false + xy: 1329, 235 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +bryde-outline + rotate: false + xy: 675, 1573 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck0 + rotate: false + xy: 817, 1573 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck1 + rotate: false + xy: 959, 1573 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck2 + rotate: false + xy: 1101, 1573 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +core-foundation-team-crux + rotate: false + xy: 465, 453 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation-team-sharded + rotate: false + xy: 325, 323 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-nucleus-team-crux + rotate: false + xy: 1583, 1887 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team-sharded + rotate: false + xy: 1745, 1887 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-shard-team-crux + rotate: false + xy: 1393, 1043 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team-sharded + rotate: false + xy: 1357, 1515 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +corvus-foot + rotate: false + xy: 1427, 289 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +corvus-joint-base + rotate: false + xy: 1827, 247 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +toxopid-joint-base + rotate: false + xy: 1827, 247 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +cracks-3-0 + rotate: false + xy: 1455, 1515 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-1 + rotate: false + xy: 1553, 1515 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-2 + rotate: false + xy: 1651, 1487 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-3 + rotate: false + xy: 1749, 1487 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-4 + rotate: false + xy: 1847, 1487 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-5 + rotate: false + xy: 1347, 1417 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-6 + rotate: false + xy: 1347, 1319 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-7 + rotate: false + xy: 1445, 1417 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-4-0 + rotate: false + xy: 325, 193 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-1 + rotate: false + xy: 455, 323 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-2 + rotate: false + xy: 325, 63 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-3 + rotate: false + xy: 455, 193 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-4 + rotate: false + xy: 455, 63 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-5 + rotate: false + xy: 595, 1233 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-6 + rotate: false + xy: 595, 1103 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-7 + rotate: false + xy: 595, 973 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-5-0 + rotate: false + xy: 195, 1466 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-1 + rotate: false + xy: 173, 1304 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-2 + rotate: false + xy: 173, 1142 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-3 + rotate: false + xy: 173, 980 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-4 + rotate: false + xy: 173, 818 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-5 + rotate: false + xy: 173, 656 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-6 + rotate: false + xy: 173, 494 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-7 + rotate: false + xy: 163, 332 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cyclone + rotate: false + xy: 1543, 1417 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +foreshadow + rotate: false + xy: 595, 843 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +fortress-leg + rotate: false + xy: 325, 1 + size: 80, 60 + orig: 80, 60 + offset: 0, 0 + index: -1 +fortress-outline + rotate: false + xy: 969, 606 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck0 + rotate: false + xy: 1357, 1613 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck1 + rotate: false + xy: 1459, 1613 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck2 + rotate: false + xy: 1561, 1613 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fuse + rotate: false + xy: 1723, 1193 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +gamma-outline + rotate: false + xy: 1967, 105 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck0 + rotate: false + xy: 1967, 35 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +horizon-outline + rotate: false + xy: 1837, 1687 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck0 + rotate: false + xy: 1911, 1691 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck1 + rotate: false + xy: 1867, 1613 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck2 + rotate: false + xy: 1941, 1617 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +large-bullet-mount-outline + rotate: false + xy: 1679, 55 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 +large-laser-mount-outline + rotate: false + xy: 715, 65 + size: 96, 192 + orig: 96, 192 + offset: 0, 0 + index: -1 +large-purple-mount-outline + rotate: false + xy: 1823, 148 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 +mass-driver + rotate: false + xy: 1009, 103 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mega-outline + rotate: false + xy: 1245, 1239 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck0 + rotate: false + xy: 1229, 1137 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck1 + rotate: false + xy: 831, 393 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck2 + rotate: false + xy: 933, 393 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +meltdown + rotate: false + xy: 725, 911 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +minke-outline + rotate: false + xy: 1589, 142 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck0 + rotate: false + xy: 1589, 39 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck1 + rotate: false + xy: 1935, 1384 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck2 + rotate: false + xy: 1757, 719 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +omura-cannon-outline + rotate: false + xy: 195, 1770 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 +quasar-leg + rotate: false + xy: 1937, 735 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-outline + rotate: false + xy: 1705, 481 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck0 + rotate: false + xy: 1705, 399 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck1 + rotate: false + xy: 1787, 473 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck2 + rotate: false + xy: 1869, 473 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +reign-leg + rotate: false + xy: 357, 1493 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-weapon-outline + rotate: false + xy: 1742, 579 + size: 83, 138 + orig: 83, 138 + offset: 0, 0 + index: -1 +ripple + rotate: false + xy: 1401, 137 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +risso-outline + rotate: false + xy: 1823, 68 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +risso-wreck0 + rotate: false + xy: 1895, 167 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +risso-wreck1 + rotate: false + xy: 1895, 87 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +risso-wreck2 + rotate: false + xy: 1895, 7 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +scepter-leg + rotate: false + xy: 855, 1183 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +vela-leg + rotate: false + xy: 855, 1183 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-outline + rotate: false + xy: 195, 1628 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck0 + rotate: false + xy: 389, 1907 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck1 + rotate: false + xy: 1, 1207 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck2 + rotate: false + xy: 561, 1907 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +sei-launcher-outline + rotate: false + xy: 1869, 391 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +spectre + rotate: false + xy: 855, 1053 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +spiroct-outline + rotate: false + xy: 1757, 822 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck0 + rotate: false + xy: 1561, 549 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck1 + rotate: false + xy: 1853, 822 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck2 + rotate: false + xy: 1427, 458 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +toxopid-foot + rotate: false + xy: 1523, 443 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +toxopid-leg + rotate: false + xy: 1685, 1687 + size: 150, 72 + orig: 150, 72 + offset: 0, 0 + index: -1 +toxopid-outline + rotate: false + xy: 875, 1715 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck0 + rotate: false + xy: 1037, 1715 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck1 + rotate: false + xy: 1199, 1715 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck2 + rotate: false + xy: 1361, 1695 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +tsunami + rotate: false + xy: 1463, 829 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +unit-arkyid-full + rotate: false + xy: 1115, 1313 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +unit-atrax-full + rotate: false + xy: 1935, 1318 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +unit-bryde-full + rotate: false + xy: 665, 1431 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +unit-fortress-full + rotate: false + xy: 1115, 1117 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +unit-horizon-full + rotate: false + xy: 1683, 325 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +unit-mega-full + rotate: false + xy: 957, 495 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +unit-minke-full + rotate: false + xy: 1847, 719 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +unit-quasar-full + rotate: false + xy: 1951, 473 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +unit-risso-full + rotate: false + xy: 1967, 245 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +unit-scepter-full + rotate: false + xy: 1, 1065 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +unit-spiroct-full + rotate: false + xy: 1427, 381 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +unit-toxopid-full + rotate: false + xy: 1523, 1695 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +unit-vela-full + rotate: false + xy: 733, 1907 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +unit-zenith-full + rotate: false + xy: 1243, 1601 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +vault-team-crux + rotate: false + xy: 1561, 703 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault-team-sharded + rotate: false + xy: 1659, 801 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vela-outline + rotate: false + xy: 1, 781 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck0 + rotate: false + xy: 1, 639 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck1 + rotate: false + xy: 1249, 1907 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck2 + rotate: false + xy: 1, 497 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +zenith-outline + rotate: false + xy: 1115, 1199 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck0 + rotate: false + xy: 855, 825 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck1 + rotate: false + xy: 855, 711 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck2 + rotate: false + xy: 855, 597 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +arkyid + rotate: false + xy: 807, 1443 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-cell + rotate: false + xy: 937, 1443 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +atrax + rotate: false + xy: 1523, 377 + size: 88, 64 + orig: 88, 64 offset: 0, 0 index: -1 atrax-cell rotate: false - xy: 1133, 27 + xy: 1519, 311 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 bryde rotate: false - xy: 357, 1639 + xy: 1907, 1907 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-cell rotate: false - xy: 357, 1497 + xy: 1907, 1765 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 -fortress +corvus-base rotate: false - xy: 1809, 1383 - size: 100, 80 - orig: 100, 80 + xy: 1685, 1761 + size: 152, 124 + orig: 152, 124 offset: 0, 0 index: -1 -fortress-base +fortress rotate: false - xy: 1607, 291 - size: 64, 64 - orig: 64, 64 + xy: 969, 770 + size: 100, 80 + orig: 100, 80 offset: 0, 0 index: -1 fortress-cell rotate: false - xy: 155, 16 + xy: 969, 688 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 -fortress-leg +gamma rotate: false - xy: 1941, 1467 - size: 80, 60 - orig: 80, 60 + xy: 1967, 175 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 horizon rotate: false - xy: 1972, 1975 + xy: 1347, 1245 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-cell rotate: false - xy: 1972, 1901 + xy: 1951, 399 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -mace - rotate: false - xy: 1739, 277 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-base - rotate: false - xy: 1739, 211 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-cell - rotate: false - xy: 1673, 172 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-leg - rotate: false - xy: 1739, 145 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 mega rotate: false - xy: 861, 1351 + xy: 1663, 1585 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-cell rotate: false - xy: 747, 1269 + xy: 1765, 1585 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 minke rotate: false - xy: 595, 661 - size: 128, 128 - orig: 128, 128 + xy: 1615, 446 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 minke-cell rotate: false - xy: 617, 531 + xy: 725, 651 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -pulsar-leg +omura-cannon-heat rotate: false - xy: 1959, 363 - size: 64, 64 - orig: 64, 64 + xy: 1, 1770 + size: 192, 277 + orig: 192, 277 offset: 0, 0 index: -1 quasar rotate: false - xy: 951, 1269 + xy: 1909, 637 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-base rotate: false - xy: 1825, 1137 + xy: 1909, 555 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-cell rotate: false - xy: 1907, 1187 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-leg - rotate: false - xy: 1825, 1055 + xy: 1949, 817 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 reign-base rotate: false - xy: 1, 32 + xy: 367, 1619 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 reign-cell rotate: false - xy: 195, 1336 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -reign-leg - rotate: false - xy: 195, 1210 + xy: 521, 1619 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 risso rotate: false - xy: 1625, 827 - size: 96, 96 - orig: 96, 96 + xy: 1751, 68 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 risso-cell rotate: false - xy: 1727, 1203 + xy: 1393, 945 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scepter rotate: false - xy: 1, 928 + xy: 1, 1349 size: 170, 140 orig: 170, 140 offset: 0, 0 index: -1 scepter-base rotate: false - xy: 617, 11 + xy: 725, 521 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +vela-base + rotate: false + xy: 725, 521 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scepter-cell rotate: false - xy: 617, 1311 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scepter-leg - rotate: false - xy: 609, 1181 + xy: 855, 1313 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spiroct rotate: false - xy: 1335, 490 + xy: 1561, 626 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-cell rotate: false - xy: 1433, 588 + xy: 1659, 724 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 toxopid rotate: false - xy: 325, 392 + xy: 713, 1715 size: 160, 190 orig: 160, 190 offset: 0, 0 index: -1 toxopid-cell rotate: false - xy: 195, 1084 + xy: 511, 1493 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 -toxopid-foot +vela rotate: false - xy: 1041, 1 - size: 90, 90 - orig: 90, 90 + xy: 1, 923 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 -toxopid-joint-base +vela-cell rotate: false - xy: 1783, 739 - size: 70, 70 - orig: 70, 70 + xy: 905, 1907 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 -toxopid-leg +vela-weapon-heat rotate: false - xy: 357, 1781 - size: 150, 72 - orig: 150, 72 + xy: 1077, 1907 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 artillery-mount rotate: false - xy: 1706, 667 + xy: 1683, 253 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 beam-weapon rotate: false - xy: 1825, 1219 + xy: 1827, 637 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 large-bullet-mount rotate: false - xy: 1952, 1788 + xy: 1679, 154 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount rotate: false - xy: 1041, 1079 + xy: 715, 259 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 large-purple-mount rotate: false - xy: 1706, 568 + xy: 1751, 148 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 +omura-cannon-heat + rotate: false + xy: 1, 1491 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 reign-weapon rotate: false - xy: 1621, 621 + xy: 1657, 563 size: 83, 138 orig: 83, 138 offset: 0, 0 index: -1 +sei-launcher + rotate: false + xy: 1787, 391 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 zenith rotate: false - xy: 1133, 1371 + xy: 855, 939 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-cell rotate: false - xy: 1247, 1351 + xy: 985, 1069 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 -sprites3.png -size: 2048,512 +sprites4.png +size: 2048,1024 format: rgba8888 filter: nearest,nearest repeat: none +launchpod + rotate: false + xy: 1201, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mend-projector + rotate: false + xy: 339, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mend-projector-top + rotate: false + xy: 405, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 mender rotate: false - xy: 1247, 271 + xy: 785, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-top rotate: false - xy: 1281, 271 + xy: 785, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +overdrive-projector + rotate: false + xy: 471, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +overdrive-projector-top + rotate: false + xy: 537, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 shock-mine rotate: false - xy: 1393, 195 + xy: 819, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 713, 219 + xy: 425, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 781, 185 + xy: 445, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 815, 219 + xy: 445, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 815, 185 + xy: 462, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 625, 151 + xy: 462, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-0 rotate: false - xy: 465, 305 + xy: 133, 495 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-full rotate: false - xy: 465, 305 + xy: 133, 495 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-1 rotate: false - xy: 499, 321 + xy: 133, 461 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-2 rotate: false - xy: 499, 287 + xy: 133, 427 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-3 rotate: false - xy: 465, 271 + xy: 167, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-0 rotate: false - xy: 499, 253 + xy: 190, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-1 rotate: false - xy: 533, 313 + xy: 190, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-2 rotate: false - xy: 567, 313 + xy: 187, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-3 rotate: false - xy: 533, 279 + xy: 187, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-0 rotate: false - xy: 567, 279 + xy: 187, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-1 rotate: false - xy: 533, 245 + xy: 201, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-2 rotate: false - xy: 567, 245 + xy: 224, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-3 rotate: false - xy: 1493, 273 + xy: 224, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-0 rotate: false - xy: 1527, 279 + xy: 221, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-1 rotate: false - xy: 1561, 279 + xy: 221, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-2 rotate: false - xy: 1595, 279 + xy: 221, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-3 rotate: false - xy: 1629, 279 + xy: 235, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-0 rotate: false - xy: 441, 237 + xy: 258, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-1 rotate: false - xy: 441, 203 + xy: 258, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-2 rotate: false - xy: 441, 169 + xy: 255, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-3 rotate: false - xy: 475, 219 + xy: 255, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 849, 185 + xy: 493, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 829, 151 + xy: 493, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 829, 117 + xy: 507, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 863, 151 + xy: 513, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 863, 117 + xy: 513, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 625, 83 + xy: 513, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 659, 83 + xy: 513, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 693, 83 + xy: 513, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 727, 83 + xy: 530, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 761, 83 + xy: 530, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 795, 83 + xy: 527, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 829, 83 + xy: 527, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 863, 83 + xy: 527, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1527, 245 + xy: 541, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1561, 245 + xy: 547, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1595, 245 + xy: 547, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1629, 245 + xy: 547, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1663, 245 + xy: 547, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1697, 249 + xy: 547, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor rotate: false - xy: 1087, 237 + xy: 847, 469 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-0 rotate: false - xy: 1053, 203 + xy: 881, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-1 rotate: false - xy: 1121, 237 + xy: 915, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-2 rotate: false - xy: 1087, 203 + xy: 813, 447 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-edge rotate: false - xy: 1155, 237 + xy: 847, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-stack rotate: false - xy: 1121, 203 + xy: 881, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1033, 135 + xy: 938, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1101, 169 + xy: 938, 259 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1033, 101 + xy: 935, 225 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1067, 135 + xy: 935, 191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1135, 169 + xy: 955, 157 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1067, 101 + xy: 955, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1101, 135 + xy: 955, 89 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1169, 169 + xy: 955, 55 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1101, 101 + xy: 955, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1135, 135 + xy: 171, 709 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1203, 169 + xy: 171, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1135, 101 + xy: 171, 641 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1169, 135 + xy: 171, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1237, 169 + xy: 171, 573 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1169, 101 + xy: 205, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1203, 135 + xy: 205, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1271, 169 + xy: 205, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1203, 101 + xy: 205, 623 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1237, 135 + xy: 205, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cross rotate: false - xy: 1493, 239 + xy: 581, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +distributor + rotate: false + xy: 541, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 inverted-sorter rotate: false - xy: 1833, 219 + xy: 615, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 855, 15 + xy: 717, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 923, 15 + xy: 847, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 951, 203 + xy: 881, 531 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 1019, 237 + xy: 915, 531 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 985, 203 + xy: 881, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1053, 237 + xy: 915, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 1935, 185 + xy: 836, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 1799, 151 + xy: 819, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 underflow-gate rotate: false - xy: 1271, 135 + xy: 273, 667 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +drill-top + rotate: false + xy: 739, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-liquid + rotate: false + xy: 739, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mechanical-drill + rotate: false + xy: 1861, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mechanical-drill-rotator + rotate: false + xy: 1927, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mechanical-drill-top + rotate: false + xy: 207, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pneumatic-drill + rotate: false + xy: 1131, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pneumatic-drill-rotator + rotate: false + xy: 1197, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pneumatic-drill-top + rotate: false + xy: 1263, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 water-extractor rotate: false - xy: 67, 117 + xy: 1923, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 133, 183 + xy: 67, 697 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 199, 249 + xy: 67, 631 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 265, 315 + xy: 67, 565 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 509, 211 + xy: 241, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 591, 143 + xy: 323, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 771, 287 + xy: 391, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 727, 117 + xy: 479, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 713, 185 + xy: 439, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 747, 219 + xy: 445, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 747, 219 + xy: 445, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 747, 185 + xy: 445, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 781, 219 + xy: 445, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 659, 117 + xy: 459, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 693, 151 + xy: 473, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 693, 117 + xy: 479, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 727, 151 + xy: 479, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 727, 151 + xy: 479, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 727, 151 + xy: 479, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 761, 151 + xy: 479, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 761, 117 + xy: 479, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 795, 151 + xy: 496, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 795, 117 + xy: 496, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 795, 117 + xy: 496, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 849, 219 + xy: 493, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 873, 287 + xy: 731, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate rotate: false - xy: 883, 185 + xy: 745, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate-top rotate: false - xy: 897, 151 + xy: 751, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 897, 117 + xy: 751, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 897, 83 + xy: 751, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 907, 303 + xy: 751, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 1111, 271 + xy: 779, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-liquid rotate: false - xy: 1145, 271 + xy: 813, 617 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-liquid rotate: false - xy: 1145, 271 + xy: 813, 617 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-liquid rotate: false - xy: 1145, 271 + xy: 813, 617 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 917, 235 + xy: 813, 549 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 917, 201 + xy: 847, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 951, 237 + xy: 813, 515 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 985, 237 + xy: 847, 503 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-cap rotate: false - xy: 1155, 203 + xy: 813, 413 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-0 rotate: false - xy: 1223, 237 + xy: 847, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-1 rotate: false - xy: 1189, 203 + xy: 813, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-2 rotate: false - xy: 1257, 237 + xy: 881, 395 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-3 rotate: false - xy: 1223, 203 + xy: 915, 395 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-4 rotate: false - xy: 1291, 237 + xy: 847, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1325, 203 + xy: 847, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1697, 181 + xy: 881, 327 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1731, 181 + xy: 915, 327 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1765, 185 + xy: 802, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +rotary-pump + rotate: false + xy: 1659, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +logic-processor + rotate: false + xy: 1267, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +memory-bank + rotate: false + xy: 273, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 memory-cell rotate: false - xy: 1213, 271 + xy: 785, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 1315, 271 + xy: 785, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor rotate: false - xy: 923, 49 + xy: 813, 583 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch rotate: false - xy: 999, 135 + xy: 921, 89 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch-on rotate: false - xy: 1067, 169 + xy: 921, 55 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery rotate: false - xy: 475, 185 + xy: 255, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-top rotate: false - xy: 475, 151 + xy: 241, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 625, 117 + xy: 459, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 659, 151 + xy: 459, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode rotate: false - xy: 1527, 211 + xy: 581, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode-arrow rotate: false - xy: 1561, 211 + xy: 598, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator rotate: false - xy: 1731, 215 + xy: 609, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-top rotate: false - xy: 1765, 219 + xy: 615, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node rotate: false - xy: 1257, 203 + xy: 881, 361 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +power-node-large + rotate: false + xy: 1329, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 power-source rotate: false - xy: 1291, 203 + xy: 915, 361 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 1325, 237 + xy: 813, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +rtg-generator + rotate: false + xy: 1725, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 rtg-generator-top rotate: false - xy: 1969, 185 + xy: 833, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 1765, 151 + xy: 819, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +steam-generator + rotate: false + xy: 1131, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-cap + rotate: false + xy: 1197, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-top + rotate: false + xy: 1263, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine0 + rotate: false + xy: 1329, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine1 + rotate: false + xy: 1395, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 surge-tower rotate: false - xy: 1, 183 + xy: 1461, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 199, 381 + xy: 1659, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator +blast-mixer rotate: false - xy: 67, 183 + xy: 1, 697 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-cap +coal-centrifuge rotate: false - xy: 133, 249 + xy: 1, 103 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-top +cryofluid-mixer-bottom rotate: false - xy: 199, 315 + xy: 1927, 957 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-turbine0 +cryofluid-mixer-liquid rotate: false - xy: 265, 381 + xy: 211, 891 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-turbine1 +cryofluid-mixer-top rotate: false - xy: 331, 447 + xy: 277, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator + rotate: false + xy: 343, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator-middle + rotate: false + xy: 409, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator-top + rotate: false + xy: 475, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +graphite-press + rotate: false + xy: 871, 891 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 incinerator rotate: false - xy: 1799, 219 + xy: 615, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 787, 49 + xy: 700, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 821, 15 + xy: 717, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +kiln + rotate: false + xy: 937, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +kiln-top + rotate: false + xy: 1003, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +silicon-smelter-top + rotate: false + xy: 1003, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 liquid-source rotate: false - xy: 975, 271 + xy: 768, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-void rotate: false - xy: 1009, 271 + xy: 765, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 1179, 271 + xy: 785, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +phase-weaver + rotate: false + xy: 735, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +phase-weaver-bottom + rotate: false + xy: 801, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +phase-weaver-weave + rotate: false + xy: 867, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-compressor + rotate: false + xy: 933, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-compressor-top + rotate: false + xy: 999, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 pulverizer rotate: false - xy: 1799, 185 + xy: 802, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 1833, 185 + xy: 799, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +pyratite-mixer + rotate: false + xy: 1461, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 separator rotate: false - xy: 1, 447 + xy: 471, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 1, 381 + xy: 537, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-spinner rotate: false - xy: 67, 447 + xy: 603, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 1, 315 + xy: 669, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 67, 381 + xy: 735, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 133, 447 + xy: 801, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 1, 249 + xy: 867, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 67, 315 + xy: 933, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 133, 381 + xy: 999, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 199, 447 + xy: 1065, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -rock1 +boulder1 rotate: false - xy: 283, 99 + xy: 1527, 709 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -rock2 +boulder2 rotate: false - xy: 283, 49 + xy: 1577, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder1 + rotate: false + xy: 697, 651 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder2 + rotate: false + xy: 747, 651 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-boulder1 rotate: false - xy: 2003, 185 + xy: 870, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-boulder2 rotate: false - xy: 447, 15 + xy: 904, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder1 rotate: false - xy: 1393, 229 + xy: 867, 191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder2 rotate: false - xy: 1359, 195 + xy: 901, 191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -snowrock1 +snow-boulder1 rotate: false - xy: 391, 331 + xy: 1547, 509 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock2 +snow-boulder2 rotate: false - xy: 441, 339 + xy: 1597, 509 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-cluster1 rotate: false - xy: 333, 113 + xy: 1317, 509 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster2 rotate: false - xy: 333, 71 + xy: 1359, 509 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster3 rotate: false - xy: 375, 113 + xy: 1401, 509 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 +container + rotate: false + xy: 1069, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team + rotate: false + xy: 1135, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 unloader rotate: false - xy: 1271, 101 + xy: 239, 599 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 1305, 135 + xy: 273, 633 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 431, 297 + xy: 133, 529 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 455, 117 + xy: 241, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-2 + rotate: false + xy: 71, 767 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 hail-heat rotate: false - xy: 1545, 313 + xy: 1945, 407 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 +lancer-heat + rotate: false + xy: 1135, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +salvo-heat + rotate: false + xy: 1857, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 scorch-heat rotate: false - xy: 515, 7 + xy: 904, 259 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 397, 447 + xy: 67, 433 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +wave-top + rotate: false + xy: 67, 367 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center + rotate: false + xy: 871, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-team + rotate: false + xy: 1, 37 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rally-point + rotate: false + xy: 1527, 825 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 1901, 185 + xy: 836, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +resupply-point + rotate: false + xy: 1593, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 copper-wall rotate: false - xy: 1731, 249 + xy: 564, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +copper-wall-large + rotate: false + xy: 1333, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 door rotate: false - xy: 1595, 211 + xy: 598, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +door-large + rotate: false + xy: 607, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +door-large-open + rotate: false + xy: 673, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 door-open rotate: false - xy: 1629, 211 + xy: 595, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 1019, 203 + xy: 813, 481 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +phase-wall-large + rotate: false + xy: 669, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 plastanium-wall rotate: false - xy: 1189, 237 + xy: 915, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +plastanium-wall-large + rotate: false + xy: 1065, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large1 + rotate: false + xy: 141, 771 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large2 + rotate: false + xy: 207, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large3 + rotate: false + xy: 273, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large4 + rotate: false + xy: 339, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 scrap-wall2 rotate: false - xy: 549, 7 + xy: 867, 225 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 583, 7 + xy: 901, 225 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1359, 229 + xy: 833, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1359, 229 + xy: 833, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 965, 101 + xy: 921, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 67, 249 + xy: 1527, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 999, 101 + xy: 921, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 265, 447 + xy: 1725, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 1305, 169 + xy: 239, 667 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 1, 117 + xy: 1791, 759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bullet rotate: false - xy: 1623, 459 + xy: 1993, 969 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 1677, 459 + xy: 821, 705 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 491, 371 + xy: 1987, 473 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-mid rotate: false - xy: 2037, 70 + xy: 975, 244 size: 1, 199 orig: 1, 199 offset: 0, 0 index: -1 error rotate: false - xy: 233, 99 + xy: 1147, 659 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser rotate: false - xy: 193, 133 + xy: 1977, 709 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser rotate: false - xy: 259, 199 + xy: 1983, 709 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 missile rotate: false - xy: 332, 5 + xy: 133, 677 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 417, 117 + xy: 133, 639 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 parallax-laser rotate: false - xy: 325, 265 + xy: 975, 445 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 particle rotate: false - xy: 399, 155 + xy: 1275, 509 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 1503, 307 + xy: 1191, 603 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 shell rotate: false - xy: 375, 47 + xy: 133, 601 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 1455, 269 + xy: 133, 563 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 transfer rotate: false - xy: 2037, 271 + xy: 981, 449 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 1237, 101 + xy: 239, 633 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white rotate: false - xy: 1949, 458 + xy: 1197, 704 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 +alpha-outline + rotate: false + xy: 1027, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 alpha-wreck0 rotate: false - xy: 1831, 463 + xy: 1077, 709 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck1 rotate: false - xy: 1881, 463 + xy: 1127, 709 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck2 rotate: false - xy: 1931, 463 + xy: 1177, 709 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 arc rotate: false - xy: 1355, 421 + xy: 133, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -beta-wreck0 - rotate: false - xy: 1549, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 1599, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 1649, 409 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-arc-full - rotate: false - xy: 489, 117 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-char-full - rotate: false - xy: 509, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-full - rotate: false - xy: 543, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 543, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 577, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 577, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-full - rotate: false - xy: 577, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-full - rotate: false - xy: 1663, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 1697, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dunerocks-full - rotate: false - xy: 1731, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 1765, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-full - rotate: false - xy: 1799, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-full - rotate: false - xy: 1833, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-full - rotate: false - xy: 1867, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 1901, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 1935, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 1969, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-full - rotate: false - xy: 2003, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-full - rotate: false - xy: 523, 143 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-full - rotate: false - xy: 557, 143 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-full - rotate: false - xy: 523, 109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-full - rotate: false - xy: 557, 109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 591, 109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-coal-full - rotate: false - xy: 605, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 639, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 673, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 707, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 741, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 775, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-full - rotate: false - xy: 809, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plated-conduit-full - rotate: false - xy: 843, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-full - rotate: false - xy: 601, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 601, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 635, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rock-full - rotate: false - xy: 1699, 409 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-full - rotate: false - xy: 635, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-full - rotate: false - xy: 669, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-full - rotate: false - xy: 669, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 703, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-full - rotate: false - xy: 703, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-full - rotate: false - xy: 737, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 737, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 737, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-full - rotate: false - xy: 771, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 805, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-full - rotate: false - xy: 805, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 839, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 839, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-full - rotate: false - xy: 1749, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-full - rotate: false - xy: 611, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-full - rotate: false - xy: 1503, 313 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 611, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sporerocks-full - rotate: false - xy: 645, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 645, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 679, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-full - rotate: false - xy: 679, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 679, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-0 - rotate: false - xy: 1765, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-1 - rotate: false - xy: 1799, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-2 - rotate: false - xy: 1833, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-3 - rotate: false - xy: 1867, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-4 - rotate: false - xy: 1901, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-5 - rotate: false - xy: 1935, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-6 - rotate: false - xy: 1969, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-7 - rotate: false - xy: 2003, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -crawler-wreck0 - rotate: false - xy: 132, 33 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck1 - rotate: false - xy: 199, 149 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck2 - rotate: false - xy: 265, 215 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck0 - rotate: false - xy: 183, 83 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck1 - rotate: false - xy: 182, 33 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 249, 149 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -duo - rotate: false - xy: 1663, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 655, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 705, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 755, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -gamma-wreck0 - rotate: false - xy: 579, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 637, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 695, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -hail - rotate: false - xy: 1697, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-blast-compound-large - rotate: false - xy: 1587, 313 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-medium - rotate: false - xy: 1901, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-blast-compound-small - rotate: false - xy: 1423, 271 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-blast-compound-tiny - rotate: false - xy: 2031, 495 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 955, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 1947, 363 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-medium - rotate: false - xy: 1969, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-small - rotate: false - xy: 1305, 109 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-coal-tiny - rotate: false - xy: 2031, 387 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 1005, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 1989, 363 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-medium - rotate: false - xy: 1355, 275 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-small - rotate: false - xy: 121, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-copper-tiny - rotate: false - xy: 475, 253 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 1055, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 1629, 313 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-medium - rotate: false - xy: 413, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-small - rotate: false - xy: 147, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-graphite-tiny - rotate: false - xy: 2031, 477 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 1105, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 1671, 317 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-medium - rotate: false - xy: 447, 83 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-small - rotate: false - xy: 173, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-lead-tiny - rotate: false - xy: 2031, 369 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 1155, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 1713, 317 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-medium - rotate: false - xy: 481, 83 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-small - rotate: false - xy: 199, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-metaglass-tiny - rotate: false - xy: 2031, 459 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 1205, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 1755, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-medium - rotate: false - xy: 515, 75 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-small - rotate: false - xy: 1427, 245 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-phase-fabric-tiny - rotate: false - xy: 455, 151 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 1255, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 1797, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-medium - rotate: false - xy: 583, 75 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-small - rotate: false - xy: 1427, 219 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-plastanium-tiny - rotate: false - xy: 1505, 221 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 1305, 405 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 1839, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-medium - rotate: false - xy: 549, 41 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-small - rotate: false - xy: 1453, 243 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-pyratite-tiny - rotate: false - xy: 1339, 151 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 505, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 1881, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-medium - rotate: false - xy: 617, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-small - rotate: false - xy: 1427, 193 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-sand-tiny - rotate: false - xy: 1365, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 555, 347 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 1923, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-medium - rotate: false - xy: 685, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-small - rotate: false - xy: 1453, 217 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-scrap-tiny - rotate: false - xy: 1505, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 605, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 1965, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-medium - rotate: false - xy: 753, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-small - rotate: false - xy: 1453, 191 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-silicon-tiny - rotate: false - xy: 1383, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 655, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 2007, 321 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-medium - rotate: false - xy: 855, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-small - rotate: false - xy: 1479, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-spore-pod-tiny - rotate: false - xy: 1401, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 705, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 315, 223 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-medium - rotate: false - xy: 651, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-small - rotate: false - xy: 1479, 187 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-surge-alloy-tiny - rotate: false - xy: 1505, 185 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 755, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 357, 239 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-medium - rotate: false - xy: 719, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-small - rotate: false - xy: 299, 155 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-thorium-tiny - rotate: false - xy: 1523, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 805, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 399, 239 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-medium - rotate: false - xy: 787, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-small - rotate: false - xy: 325, 155 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-titanium-tiny - rotate: false - xy: 1541, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-titanium-xlarge - rotate: false - xy: 855, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-cryofluid-large - rotate: false - xy: 357, 197 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-medium - rotate: false - xy: 889, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-small - rotate: false - xy: 1305, 83 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-cryofluid-tiny - rotate: false - xy: 1559, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 1005, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 399, 197 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-medium - rotate: false - xy: 883, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-small - rotate: false - xy: 1331, 109 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-oil-tiny - rotate: false - xy: 1577, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 1055, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 315, 181 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-medium - rotate: false - xy: 941, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-small - rotate: false - xy: 1331, 83 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-slag-tiny - rotate: false - xy: 1595, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 1105, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 357, 155 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-medium - rotate: false - xy: 1077, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-small - rotate: false - xy: 1339, 169 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-water-tiny - rotate: false - xy: 1613, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 1155, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck0 - rotate: false - xy: 1005, 305 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 1055, 305 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 1105, 305 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 869, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 927, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 985, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck0 - rotate: false - xy: 1159, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 1217, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 1275, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 133, 133 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 199, 199 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 265, 265 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -repair-point - rotate: false - xy: 1867, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scorch - rotate: false - xy: 481, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-0 - rotate: false - xy: 1867, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-1 - rotate: false - xy: 1901, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-10 - rotate: false - xy: 965, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-11 - rotate: false - xy: 1033, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-2 - rotate: false - xy: 1935, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-3 - rotate: false - xy: 1969, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-4 - rotate: false - xy: 2003, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-5 - rotate: false - xy: 931, 167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-6 - rotate: false - xy: 931, 133 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-7 - rotate: false - xy: 931, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-8 - rotate: false - xy: 965, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-9 - rotate: false - xy: 999, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -swarmer - rotate: false - xy: 133, 315 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-alpha-full - rotate: false - xy: 1455, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-beta-full - rotate: false - xy: 1505, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-crawler-full - rotate: false - xy: 1555, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 1605, 355 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-full - rotate: false - xy: 1655, 359 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-gamma-full - rotate: false - xy: 1449, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-mace-full - rotate: false - xy: 1, 51 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-mono-full - rotate: false - xy: 1705, 359 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 1507, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-poly-full - rotate: false - xy: 1565, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 331, 331 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -wave - rotate: false - xy: 331, 381 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -item-blast-compound - rotate: false - xy: 1867, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal - rotate: false - xy: 1935, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper - rotate: false - xy: 2003, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite - rotate: false - xy: 1389, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead - rotate: false - xy: 413, 45 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass - rotate: false - xy: 447, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric - rotate: false - xy: 481, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium - rotate: false - xy: 549, 75 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite - rotate: false - xy: 515, 41 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand - rotate: false - xy: 583, 41 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap - rotate: false - xy: 651, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon - rotate: false - xy: 719, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod - rotate: false - xy: 821, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy - rotate: false - xy: 617, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium - rotate: false - xy: 685, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium - rotate: false - xy: 753, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid - rotate: false - xy: 889, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil - rotate: false - xy: 873, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag - rotate: false - xy: 907, 269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water - rotate: false - xy: 1043, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blank - rotate: false - xy: 1949, 455 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -shape-3 - rotate: false - xy: 67, 52 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 1731, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 1781, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 arkyid-leg rotate: false - xy: 397, 389 + xy: 67, 132 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 +artillery-outline + rotate: false + xy: 1277, 701 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 atrax-foot rotate: false - xy: 1905, 371 + xy: 1945, 449 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 atrax-joint rotate: false - xy: 877, 327 + xy: 175, 743 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 atrax-leg rotate: false - xy: 375, 85 + xy: 137, 743 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 atrax-leg-base rotate: false - xy: 333, 43 + xy: 133, 715 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 -beta +beta-outline rotate: false - xy: 1449, 405 + xy: 67, 20 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-wreck0 + rotate: false + xy: 1989, 835 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-wreck1 + rotate: false + xy: 1989, 779 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-wreck2 + rotate: false + xy: 1989, 723 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +block-arc-full + rotate: false + xy: 241, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-basalt-full + rotate: false + xy: 241, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-boulder-full + rotate: false + xy: 1377, 709 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -beta-cell +block-char-full rotate: false - xy: 1499, 405 + xy: 269, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-command-center-full + rotate: false + xy: 141, 837 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-conduit-full + rotate: false + xy: 275, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-container-full + rotate: false + xy: 277, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-conveyor-full + rotate: false + xy: 275, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-0 + rotate: false + xy: 275, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-craters-full + rotate: false + xy: 275, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cryofluid-mixer-full + rotate: false + xy: 1, 631 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cultivator-full + rotate: false + xy: 343, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-dacite-boulder-full + rotate: false + xy: 1427, 709 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -crawler +block-dacite-full rotate: false - xy: 1799, 413 + xy: 275, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-full + rotate: false + xy: 275, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-metal-full + rotate: false + xy: 292, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-full + rotate: false + xy: 292, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-full + rotate: false + xy: 289, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-full + rotate: false + xy: 289, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dune-wall-full + rotate: false + xy: 289, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-full + rotate: false + xy: 303, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-grass-full + rotate: false + xy: 309, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hail-full + rotate: false + xy: 309, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-full + rotate: false + xy: 309, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-full + rotate: false + xy: 309, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-full + rotate: false + xy: 309, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-full + rotate: false + xy: 326, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-lancer-full + rotate: false + xy: 1, 565 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-liquid-router-full + rotate: false + xy: 326, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-magmarock-full + rotate: false + xy: 323, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mechanical-drill-full + rotate: false + xy: 409, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-full + rotate: false + xy: 323, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-full + rotate: false + xy: 337, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mud-full + rotate: false + xy: 343, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-coal-full + rotate: false + xy: 343, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-copper-full + rotate: false + xy: 343, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-lead-full + rotate: false + xy: 343, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-scrap-full + rotate: false + xy: 343, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-thorium-full + rotate: false + xy: 360, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-titanium-full + rotate: false + xy: 360, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-parallax-full + rotate: false + xy: 1, 499 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-pebbles-full + rotate: false + xy: 357, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-weaver-full + rotate: false + xy: 475, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-plated-conduit-full + rotate: false + xy: 357, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-full + rotate: false + xy: 1, 433 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-pulse-conduit-full + rotate: false + xy: 357, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-full + rotate: false + xy: 371, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-full + rotate: false + xy: 377, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-wall-full + rotate: false + xy: 377, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-full + rotate: false + xy: 541, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-sand-boulder-full + rotate: false + xy: 377, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-full + rotate: false + xy: 377, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-full + rotate: false + xy: 377, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-full + rotate: false + xy: 1, 367 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-scorch-full + rotate: false + xy: 394, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-full + rotate: false + xy: 394, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall1 + rotate: false + xy: 394, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-large-full + rotate: false + xy: 607, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-segment-full + rotate: false + xy: 1, 301 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-shale-boulder-full + rotate: false + xy: 391, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-full + rotate: false + xy: 391, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-wall-full + rotate: false + xy: 405, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-full + rotate: false + xy: 411, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-boulder-full + rotate: false + xy: 1477, 709 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -crawler-base +block-snow-full rotate: false - xy: 1849, 413 - size: 48, 48 - orig: 48, 48 + xy: 411, 129 + size: 32, 32 + orig: 32, 32 offset: 0, 0 index: -1 -crawler-cell +block-snow-wall-full rotate: false - xy: 1899, 413 - size: 48, 48 - orig: 48, 48 + xy: 411, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-full + rotate: false + xy: 1987, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-full + rotate: false + xy: 411, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-full + rotate: false + xy: 673, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-spore-wall-full + rotate: false + xy: 411, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-steam-generator-full + rotate: false + xy: 1, 235 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-stone-full + rotate: false + xy: 428, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-full + rotate: false + xy: 428, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-full + rotate: false + xy: 739, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-tendrils-full + rotate: false + xy: 425, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-full + rotate: false + xy: 425, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-0 + rotate: false + xy: 425, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-full + rotate: false + xy: 1, 169 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-wave-full + rotate: false + xy: 805, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-team-crux + rotate: false + xy: 937, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-team-sharded + rotate: false + xy: 1003, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team-crux + rotate: false + xy: 1201, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team-sharded + rotate: false + xy: 1267, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +corvus-joint + rotate: false + xy: 67, 240 + size: 60, 60 + orig: 60, 60 + offset: 0, 0 + index: -1 +corvus-leg + rotate: false + xy: 949, 495 + size: 30, 68 + orig: 30, 68 + offset: 0, 0 + index: -1 +corvus-leg-base + rotate: false + xy: 307, 635 + size: 30, 64 + orig: 30, 64 + offset: 0, 0 + index: -1 +cracks-1-0 + rotate: false + xy: 564, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-1 + rotate: false + xy: 561, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-2 + rotate: false + xy: 561, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-3 + rotate: false + xy: 561, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-4 + rotate: false + xy: 575, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-5 + rotate: false + xy: 581, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-6 + rotate: false + xy: 581, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-7 + rotate: false + xy: 581, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-2-0 + rotate: false + xy: 1399, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-1 + rotate: false + xy: 1465, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-2 + rotate: false + xy: 1531, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-3 + rotate: false + xy: 1597, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-4 + rotate: false + xy: 1663, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-5 + rotate: false + xy: 1729, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-6 + rotate: false + xy: 1795, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-7 + rotate: false + xy: 1861, 957 + size: 64, 64 + orig: 64, 64 offset: 0, 0 index: -1 crawler-leg rotate: false - xy: 133, 83 + xy: 1777, 709 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -dagger +crawler-outline rotate: false - xy: 331, 281 + xy: 1827, 709 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -dagger-base +crawler-wreck0 rotate: false - xy: 1949, 405 + xy: 1877, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck1 + rotate: false + xy: 1927, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck2 + rotate: false + xy: 647, 653 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 1999, 405 + xy: 897, 657 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -flare +dagger-outline rotate: false - xy: 605, 405 + xy: 947, 659 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -gamma +dagger-wreck0 rotate: false - xy: 463, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-cell - rotate: false - xy: 521, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -mono - rotate: false - xy: 1305, 355 + xy: 997, 659 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -mono-cell +dagger-wreck1 rotate: false - xy: 955, 305 + xy: 1047, 659 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -nova +dagger-wreck2 rotate: false - xy: 753, 455 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 1255, 305 + xy: 1097, 659 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -nova-cell +duo rotate: false - xy: 811, 455 - size: 56, 56 - orig: 56, 56 + xy: 595, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +eruption-outline + rotate: false + xy: 1247, 643 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flamethrower-outline + rotate: false + xy: 1397, 651 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flare-outline + rotate: false + xy: 1497, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck0 + rotate: false + xy: 1547, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck1 + rotate: false + xy: 1597, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck2 + rotate: false + xy: 1647, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +gamma-wreck1 + rotate: false + xy: 1, 953 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck2 + rotate: false + xy: 1, 883 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +hail + rotate: false + xy: 595, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +heal-shotgun-weapon-outline + rotate: false + xy: 875, 707 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +heal-weapon-mount-outline + rotate: false + xy: 1797, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +heal-weapon-outline + rotate: false + xy: 1847, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-blast-compound-large + rotate: false + xy: 1987, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-blast-compound-medium + rotate: false + xy: 615, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-blast-compound-small + rotate: false + xy: 1993, 891 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-blast-compound-tiny + rotate: false + xy: 2029, 455 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-blast-compound-xlarge + rotate: false + xy: 1897, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-coal-large + rotate: false + xy: 1797, 417 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-coal-medium + rotate: false + xy: 632, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal-small + rotate: false + xy: 133, 401 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-coal-tiny + rotate: false + xy: 1923, 425 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-coal-xlarge + rotate: false + xy: 1947, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-copper-large + rotate: false + xy: 1839, 417 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-copper-medium + rotate: false + xy: 629, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper-small + rotate: false + xy: 2019, 891 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-copper-tiny + rotate: false + xy: 1275, 575 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-copper-xlarge + rotate: false + xy: 1997, 673 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-graphite-large + rotate: false + xy: 1881, 401 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-graphite-medium + rotate: false + xy: 643, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite-small + rotate: false + xy: 159, 401 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-graphite-tiny + rotate: false + xy: 417, 683 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-graphite-xlarge + rotate: false + xy: 1997, 623 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-lead-large + rotate: false + xy: 897, 565 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-lead-medium + rotate: false + xy: 649, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead-small + rotate: false + xy: 273, 607 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-lead-tiny + rotate: false + xy: 949, 347 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-lead-xlarge + rotate: false + xy: 1297, 601 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-metaglass-large + rotate: false + xy: 939, 565 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-metaglass-medium + rotate: false + xy: 649, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass-small + rotate: false + xy: 949, 469 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-metaglass-tiny + rotate: false + xy: 1085, 507 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-metaglass-xlarge + rotate: false + xy: 1347, 601 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-phase-fabric-large + rotate: false + xy: 981, 567 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-phase-fabric-medium + rotate: false + xy: 666, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric-small + rotate: false + xy: 981, 499 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-phase-fabric-tiny + rotate: false + xy: 2029, 437 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-phase-fabric-xlarge + rotate: false + xy: 1397, 601 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-plastanium-large + rotate: false + xy: 1023, 567 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-plastanium-medium + rotate: false + xy: 663, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium-small + rotate: false + xy: 339, 675 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-plastanium-tiny + rotate: false + xy: 1923, 407 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-plastanium-xlarge + rotate: false + xy: 1447, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-pyratite-large + rotate: false + xy: 1065, 567 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-pyratite-medium + rotate: false + xy: 663, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite-small + rotate: false + xy: 949, 443 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-pyratite-tiny + rotate: false + xy: 1275, 557 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-pyratite-xlarge + rotate: false + xy: 1497, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-sand-large + rotate: false + xy: 1107, 567 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-sand-medium + rotate: false + xy: 683, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand-small + rotate: false + xy: 1007, 499 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-sand-tiny + rotate: false + xy: 417, 665 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-sand-xlarge + rotate: false + xy: 1547, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-scrap-large + rotate: false + xy: 1149, 567 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-scrap-medium + rotate: false + xy: 683, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap-small + rotate: false + xy: 339, 649 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-scrap-tiny + rotate: false + xy: 435, 683 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-scrap-xlarge + rotate: false + xy: 1597, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-silicon-large + rotate: false + xy: 1191, 551 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-silicon-medium + rotate: false + xy: 683, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon-small + rotate: false + xy: 365, 675 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-silicon-tiny + rotate: false + xy: 949, 329 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-silicon-xlarge + rotate: false + xy: 1647, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-spore-pod-large + rotate: false + xy: 1233, 551 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-spore-pod-medium + rotate: false + xy: 697, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod-small + rotate: false + xy: 949, 417 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-spore-pod-tiny + rotate: false + xy: 1103, 507 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-spore-pod-xlarge + rotate: false + xy: 1697, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-surge-alloy-large + rotate: false + xy: 981, 525 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-surge-alloy-medium + rotate: false + xy: 697, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy-small + rotate: false + xy: 949, 391 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-surge-alloy-tiny + rotate: false + xy: 2029, 419 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-surge-alloy-xlarge + rotate: false + xy: 1747, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-thorium-large + rotate: false + xy: 1023, 525 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-thorium-medium + rotate: false + xy: 717, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium-small + rotate: false + xy: 1033, 499 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-thorium-tiny + rotate: false + xy: 435, 665 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-thorium-xlarge + rotate: false + xy: 1797, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-titanium-large + rotate: false + xy: 1065, 525 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-titanium-medium + rotate: false + xy: 717, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium-small + rotate: false + xy: 365, 649 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-titanium-tiny + rotate: false + xy: 453, 683 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-titanium-xlarge + rotate: false + xy: 1847, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +lancer + rotate: false + xy: 1069, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +large-artillery-outline + rotate: false + xy: 1947, 591 + size: 48, 66 + orig: 48, 66 + offset: 0, 0 + index: -1 +large-weapon-outline + rotate: false + xy: 1447, 559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-cryofluid-large + rotate: false + xy: 1107, 525 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-cryofluid-medium + rotate: false + xy: 734, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid-small + rotate: false + xy: 391, 675 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-cryofluid-tiny + rotate: false + xy: 1121, 507 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-cryofluid-xlarge + rotate: false + xy: 1497, 559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-oil-large + rotate: false + xy: 1149, 525 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-oil-medium + rotate: false + xy: 731, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil-small + rotate: false + xy: 949, 365 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-oil-tiny + rotate: false + xy: 2029, 401 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-oil-xlarge + rotate: false + xy: 1547, 559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-slag-large + rotate: false + xy: 1191, 509 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-slag-medium + rotate: false + xy: 768, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag-small + rotate: false + xy: 1059, 499 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-slag-tiny + rotate: false + xy: 453, 665 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-slag-xlarge + rotate: false + xy: 1597, 559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-water-large + rotate: false + xy: 1233, 509 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-water-medium + rotate: false + xy: 765, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water-small + rotate: false + xy: 391, 649 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-water-tiny + rotate: false + xy: 471, 683 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-water-xlarge + rotate: false + xy: 1647, 559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mace-leg + rotate: false + xy: 1531, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-outline + rotate: false + xy: 1597, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck0 + rotate: false + xy: 1663, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck1 + rotate: false + xy: 1729, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck2 + rotate: false + xy: 1795, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +missiles-mount-outline + rotate: false + xy: 1797, 559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-outline + rotate: false + xy: 1947, 541 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck0 + rotate: false + xy: 1997, 523 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck1 + rotate: false + xy: 847, 605 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck2 + rotate: false + xy: 897, 607 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-purple-weapon-outline + rotate: false + xy: 997, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-weapon-outline + rotate: false + xy: 1097, 609 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 nova-leg rotate: false - xy: 1305, 305 + xy: 1197, 593 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -poly +nova-outline rotate: false - xy: 1043, 455 + xy: 125, 70 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 -poly-cell +nova-wreck0 rotate: false - xy: 1101, 455 + xy: 125, 12 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 -power-cell +nova-wreck1 rotate: false - xy: 1333, 455 + xy: 183, 128 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 -pulsar +nova-wreck2 rotate: false - xy: 1, 1 - size: 58, 48 - orig: 58, 48 + xy: 183, 70 + size: 56, 56 + orig: 56, 56 offset: 0, 0 index: -1 -pulsar-base +parallax rotate: false - xy: 233, 49 + xy: 603, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +poly-outline + rotate: false + xy: 241, 701 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck0 + rotate: false + xy: 299, 701 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck1 + rotate: false + xy: 357, 701 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck2 + rotate: false + xy: 415, 701 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar-leg + rotate: false + xy: 1395, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pulsar-outline + rotate: false + xy: 1, 823 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck0 + rotate: false + xy: 71, 903 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck1 + rotate: false + xy: 141, 963 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck2 + rotate: false + xy: 1, 763 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +repair-point + rotate: false + xy: 799, 209 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +salvo + rotate: false + xy: 1791, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scatter + rotate: false + xy: 1923, 825 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scepter-weapon-outline + rotate: false + xy: 589, 655 + size: 56, 102 + orig: 56, 102 + offset: 0, 0 + index: -1 +scorch + rotate: false + xy: 870, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +segment + rotate: false + xy: 405, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +small-basic-weapon-outline + rotate: false + xy: 1347, 551 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -pulsar-cell +small-mount-weapon-outline rotate: false - xy: 61, 1 - size: 58, 48 - orig: 58, 48 + xy: 1447, 509 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 spiroct-foot rotate: false - xy: 1455, 307 + xy: 1897, 443 size: 46, 46 orig: 46, 46 offset: 0, 0 index: -1 spiroct-joint rotate: false - xy: 1833, 151 + xy: 819, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spiroct-leg rotate: false - xy: 232, 13 + xy: 1, 1 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 spiroct-leg-base rotate: false - xy: 282, 13 + xy: 1647, 523 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 +spiroct-weapon-outline + rotate: false + xy: 1747, 501 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +splash-0 + rotate: false + xy: 819, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-1 + rotate: false + xy: 853, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-10 + rotate: false + xy: 887, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-11 + rotate: false + xy: 921, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-2 + rotate: false + xy: 853, 123 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-3 + rotate: false + xy: 887, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-4 + rotate: false + xy: 853, 89 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-5 + rotate: false + xy: 887, 123 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-6 + rotate: false + xy: 853, 55 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-7 + rotate: false + xy: 887, 89 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-8 + rotate: false + xy: 887, 55 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-9 + rotate: false + xy: 853, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +swarmer + rotate: false + xy: 1593, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-alpha-full + rotate: false + xy: 1797, 509 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-beta-full + rotate: false + xy: 647, 703 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +unit-crawler-full + rotate: false + xy: 1847, 509 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-dagger-full + rotate: false + xy: 1647, 473 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-flare-full + rotate: false + xy: 1897, 491 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-gamma-full + rotate: false + xy: 71, 833 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +unit-mace-full + rotate: false + xy: 1857, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-mono-full + rotate: false + xy: 1947, 491 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-nova-full + rotate: false + xy: 705, 701 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-poly-full + rotate: false + xy: 763, 701 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-pulsar-full + rotate: false + xy: 141, 903 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +wave + rotate: false + xy: 67, 499 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +zenith-missiles-outline + rotate: false + xy: 1847, 459 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-blast-compound + rotate: false + xy: 615, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal + rotate: false + xy: 632, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper + rotate: false + xy: 629, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite + rotate: false + xy: 629, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead + rotate: false + xy: 649, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass + rotate: false + xy: 649, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric + rotate: false + xy: 649, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium + rotate: false + xy: 666, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite + rotate: false + xy: 663, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand + rotate: false + xy: 677, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap + rotate: false + xy: 683, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon + rotate: false + xy: 683, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod + rotate: false + xy: 700, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy + rotate: false + xy: 697, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium + rotate: false + xy: 711, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium + rotate: false + xy: 717, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid + rotate: false + xy: 734, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil + rotate: false + xy: 731, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag + rotate: false + xy: 751, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water + rotate: false + xy: 765, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +blank + rotate: false + xy: 799, 296 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +shape-3 + rotate: false + xy: 67, 302 + size: 63, 63 + orig: 63, 63 + offset: 0, 0 + index: -1 +alpha + rotate: false + xy: 927, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-cell + rotate: false + xy: 977, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +atrax-base + rotate: false + xy: 211, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +beta + rotate: false + xy: 67, 76 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-cell + rotate: false + xy: 1327, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler + rotate: false + xy: 1627, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-base + rotate: false + xy: 1677, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-cell + rotate: false + xy: 1727, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger + rotate: false + xy: 797, 651 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-base + rotate: false + xy: 847, 655 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare + rotate: false + xy: 1447, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +fortress-base + rotate: false + xy: 805, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +gamma-cell + rotate: false + xy: 129, 244 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +mace + rotate: false + xy: 1333, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-base + rotate: false + xy: 1399, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-cell + rotate: false + xy: 1465, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mono + rotate: false + xy: 1847, 559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-cell + rotate: false + xy: 1897, 541 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova + rotate: false + xy: 129, 186 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-base + rotate: false + xy: 1147, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-cell + rotate: false + xy: 125, 128 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly + rotate: false + xy: 183, 12 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-cell + rotate: false + xy: 132, 309 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +power-cell + rotate: false + xy: 473, 701 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar + rotate: false + xy: 71, 963 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-base + rotate: false + xy: 1247, 593 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +pulsar-cell + rotate: false + xy: 67, 190 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 vanguard rotate: false - xy: 1755, 363 + xy: 1997, 473 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vanguard-cell rotate: false - xy: 1805, 363 + xy: 1697, 451 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 artillery rotate: false - xy: 1981, 455 + xy: 1227, 701 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 eruption rotate: false - xy: 455, 389 + xy: 1197, 643 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun rotate: false - xy: 505, 405 + xy: 1297, 651 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower rotate: false - xy: 555, 397 + xy: 1347, 651 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-shotgun-weapon rotate: false - xy: 805, 405 - size: 48, 48 - orig: 48, 48 + xy: 1993, 917 + size: 50, 50 + orig: 50, 50 offset: 0, 0 index: -1 heal-weapon rotate: false - xy: 855, 405 + xy: 1697, 659 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 heal-weapon-mount rotate: false - xy: 905, 405 + xy: 1747, 659 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 large-artillery rotate: false - xy: 905, 337 + xy: 1897, 591 size: 48, 66 orig: 48, 66 offset: 0, 0 index: -1 large-weapon rotate: false - xy: 955, 355 + xy: 1997, 573 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles rotate: false - xy: 1205, 355 + xy: 1697, 559 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-mount rotate: false - xy: 1255, 355 + xy: 1747, 559 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-purple-weapon rotate: false - xy: 1155, 305 + xy: 947, 609 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-weapon rotate: false - xy: 1205, 305 + xy: 1047, 609 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scepter-weapon rotate: false - xy: 1391, 409 + xy: 531, 655 size: 56, 102 orig: 56, 102 offset: 0, 0 index: -1 small-basic-weapon rotate: false - xy: 1355, 359 + xy: 1297, 551 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-mount-weapon rotate: false - xy: 1355, 309 + xy: 1397, 551 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-weapon rotate: false - xy: 381, 281 + xy: 1497, 509 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spiroct-weapon rotate: false - xy: 1405, 347 + xy: 1697, 501 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 weapon rotate: false - xy: 1855, 363 + xy: 1747, 451 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith-missiles rotate: false - xy: 1405, 297 + xy: 1797, 459 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -sprites4.png +sprites5.png size: 2048,1024 format: rgba8888 filter: nearest,nearest @@ -6904,3533 +7855,5598 @@ scorch-9-2 offset: 0, 0 index: -1 -sprites5.png +sprites6.png size: 2048,512 format: rgba8888 filter: nearest,nearest repeat: none +basalt-edge + rotate: false + xy: 1, 399 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +basalt1 + rotate: false + xy: 2005, 463 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt2 + rotate: false + xy: 1299, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt3 + rotate: false + xy: 1333, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 char1 rotate: false - xy: 1281, 459 + xy: 1367, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char2 rotate: false - xy: 1315, 459 + xy: 1401, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char3 rotate: false - xy: 1349, 459 + xy: 1435, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliff rotate: false - xy: 1383, 459 + xy: 1469, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cliffs1 +cliff0 rotate: false - xy: 1417, 459 - size: 32, 32 - orig: 32, 32 + xy: 589, 137 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask1 + rotate: false + xy: 589, 137 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask129 + rotate: false + xy: 589, 137 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask131 + rotate: false + xy: 589, 137 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask3 + rotate: false + xy: 589, 137 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff1 + rotate: false + xy: 687, 235 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask130 + rotate: false + xy: 687, 235 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask2 + rotate: false + xy: 687, 235 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff2 + rotate: false + xy: 785, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask12 + rotate: false + xy: 785, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask132 + rotate: false + xy: 785, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask134 + rotate: false + xy: 785, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask14 + rotate: false + xy: 785, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask140 + rotate: false + xy: 785, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask142 + rotate: false + xy: 785, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask4 + rotate: false + xy: 785, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask6 + rotate: false + xy: 785, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff3 + rotate: false + xy: 883, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff4 + rotate: false + xy: 589, 71 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff5 + rotate: false + xy: 949, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff6 + rotate: false + xy: 1015, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff7 + rotate: false + xy: 1081, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask0 + rotate: false + xy: 1147, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask128 + rotate: false + xy: 1147, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask10 + rotate: false + xy: 1411, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask138 + rotate: false + xy: 1411, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask112 + rotate: false + xy: 1709, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask120 + rotate: false + xy: 1709, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask113 + rotate: false + xy: 1775, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask115 + rotate: false + xy: 1775, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask121 + rotate: false + xy: 1775, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask123 + rotate: false + xy: 1775, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask114 + rotate: false + xy: 1841, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask122 + rotate: false + xy: 1841, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask116 + rotate: false + xy: 1907, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask118 + rotate: false + xy: 1907, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask117 + rotate: false + xy: 787, 169 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask119 + rotate: false + xy: 787, 169 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask124 + rotate: false + xy: 787, 103 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask126 + rotate: false + xy: 787, 103 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask125 + rotate: false + xy: 787, 37 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask127 + rotate: false + xy: 787, 37 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask16 + rotate: false + xy: 1477, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask144 + rotate: false + xy: 1477, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask152 + rotate: false + xy: 1477, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask176 + rotate: false + xy: 1477, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask184 + rotate: false + xy: 1477, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask24 + rotate: false + xy: 1477, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask48 + rotate: false + xy: 1477, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask56 + rotate: false + xy: 1477, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask17 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask145 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask147 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask153 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask155 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask177 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask179 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask185 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask187 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask19 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask25 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask27 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask49 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask51 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask57 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask59 + rotate: false + xy: 1543, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask18 + rotate: false + xy: 1609, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask146 + rotate: false + xy: 1609, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask154 + rotate: false + xy: 1609, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask178 + rotate: false + xy: 1609, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask186 + rotate: false + xy: 1609, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask26 + rotate: false + xy: 1609, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask50 + rotate: false + xy: 1609, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask58 + rotate: false + xy: 1609, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask192 + rotate: false + xy: 885, 267 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask224 + rotate: false + xy: 885, 267 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask193 + rotate: false + xy: 853, 201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask195 + rotate: false + xy: 853, 201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask225 + rotate: false + xy: 853, 201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask227 + rotate: false + xy: 853, 201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask194 + rotate: false + xy: 853, 135 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask226 + rotate: false + xy: 853, 135 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask196 + rotate: false + xy: 853, 69 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask198 + rotate: false + xy: 853, 69 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask204 + rotate: false + xy: 853, 69 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask206 + rotate: false + xy: 853, 69 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask228 + rotate: false + xy: 853, 69 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask230 + rotate: false + xy: 853, 69 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask236 + rotate: false + xy: 853, 69 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask238 + rotate: false + xy: 853, 69 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask197 + rotate: false + xy: 951, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask199 + rotate: false + xy: 951, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask205 + rotate: false + xy: 951, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask207 + rotate: false + xy: 951, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask229 + rotate: false + xy: 951, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask231 + rotate: false + xy: 951, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask237 + rotate: false + xy: 951, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask239 + rotate: false + xy: 951, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask20 + rotate: false + xy: 1675, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask148 + rotate: false + xy: 1675, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask150 + rotate: false + xy: 1675, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask180 + rotate: false + xy: 1675, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask182 + rotate: false + xy: 1675, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask22 + rotate: false + xy: 1675, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask52 + rotate: false + xy: 1675, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask54 + rotate: false + xy: 1675, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask200 + rotate: false + xy: 1017, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask232 + rotate: false + xy: 1017, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask201 + rotate: false + xy: 1083, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask203 + rotate: false + xy: 1083, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask233 + rotate: false + xy: 1083, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask235 + rotate: false + xy: 1083, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask202 + rotate: false + xy: 1149, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask234 + rotate: false + xy: 1149, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask208 + rotate: false + xy: 1215, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask216 + rotate: false + xy: 1215, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask209 + rotate: false + xy: 1281, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask211 + rotate: false + xy: 1281, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask217 + rotate: false + xy: 1281, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask219 + rotate: false + xy: 1281, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask21 + rotate: false + xy: 1741, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask149 + rotate: false + xy: 1741, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask151 + rotate: false + xy: 1741, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask181 + rotate: false + xy: 1741, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask183 + rotate: false + xy: 1741, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask23 + rotate: false + xy: 1741, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask53 + rotate: false + xy: 1741, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask55 + rotate: false + xy: 1741, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask210 + rotate: false + xy: 1347, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask218 + rotate: false + xy: 1347, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask212 + rotate: false + xy: 1413, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask214 + rotate: false + xy: 1413, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask213 + rotate: false + xy: 1479, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask215 + rotate: false + xy: 1479, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask220 + rotate: false + xy: 1545, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask222 + rotate: false + xy: 1545, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask221 + rotate: false + xy: 1611, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask223 + rotate: false + xy: 1611, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask240 + rotate: false + xy: 1677, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask248 + rotate: false + xy: 1677, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask241 + rotate: false + xy: 1743, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask243 + rotate: false + xy: 1743, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask249 + rotate: false + xy: 1743, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask251 + rotate: false + xy: 1743, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask242 + rotate: false + xy: 1809, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask250 + rotate: false + xy: 1809, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask244 + rotate: false + xy: 1875, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask246 + rotate: false + xy: 1875, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask245 + rotate: false + xy: 1973, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask247 + rotate: false + xy: 1973, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask252 + rotate: false + xy: 1941, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask254 + rotate: false + xy: 1941, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask253 + rotate: false + xy: 919, 201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask255 + rotate: false + xy: 919, 201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask28 + rotate: false + xy: 1807, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask156 + rotate: false + xy: 1807, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask158 + rotate: false + xy: 1807, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask188 + rotate: false + xy: 1807, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask190 + rotate: false + xy: 1807, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask30 + rotate: false + xy: 1807, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask60 + rotate: false + xy: 1807, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask62 + rotate: false + xy: 1807, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask29 + rotate: false + xy: 1873, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask157 + rotate: false + xy: 1873, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask159 + rotate: false + xy: 1873, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask189 + rotate: false + xy: 1873, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask191 + rotate: false + xy: 1873, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask31 + rotate: false + xy: 1873, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask61 + rotate: false + xy: 1873, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask63 + rotate: false + xy: 1873, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask32 + rotate: false + xy: 1939, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask160 + rotate: false + xy: 1939, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask33 + rotate: false + xy: 589, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask161 + rotate: false + xy: 589, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask163 + rotate: false + xy: 589, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask35 + rotate: false + xy: 589, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask34 + rotate: false + xy: 655, 137 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask162 + rotate: false + xy: 655, 137 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask36 + rotate: false + xy: 655, 71 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask164 + rotate: false + xy: 655, 71 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask166 + rotate: false + xy: 655, 71 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask172 + rotate: false + xy: 655, 71 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask174 + rotate: false + xy: 655, 71 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask38 + rotate: false + xy: 655, 71 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask44 + rotate: false + xy: 655, 71 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask46 + rotate: false + xy: 655, 71 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask37 + rotate: false + xy: 655, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask165 + rotate: false + xy: 655, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask167 + rotate: false + xy: 655, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask173 + rotate: false + xy: 655, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask175 + rotate: false + xy: 655, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask39 + rotate: false + xy: 655, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask45 + rotate: false + xy: 655, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask47 + rotate: false + xy: 655, 5 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask40 + rotate: false + xy: 753, 235 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask168 + rotate: false + xy: 753, 235 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask41 + rotate: false + xy: 721, 169 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask169 + rotate: false + xy: 721, 169 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask171 + rotate: false + xy: 721, 169 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask43 + rotate: false + xy: 721, 169 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask42 + rotate: false + xy: 721, 103 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask170 + rotate: false + xy: 721, 103 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask5 + rotate: false + xy: 1213, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask13 + rotate: false + xy: 1213, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask133 + rotate: false + xy: 1213, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask135 + rotate: false + xy: 1213, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask141 + rotate: false + xy: 1213, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask143 + rotate: false + xy: 1213, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask15 + rotate: false + xy: 1213, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask7 + rotate: false + xy: 1213, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask64 + rotate: false + xy: 721, 37 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask96 + rotate: false + xy: 721, 37 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask65 + rotate: false + xy: 851, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask67 + rotate: false + xy: 851, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask97 + rotate: false + xy: 851, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask99 + rotate: false + xy: 851, 333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask66 + rotate: false + xy: 819, 267 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask98 + rotate: false + xy: 819, 267 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask68 + rotate: false + xy: 917, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask100 + rotate: false + xy: 917, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask102 + rotate: false + xy: 917, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask108 + rotate: false + xy: 917, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask110 + rotate: false + xy: 917, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask70 + rotate: false + xy: 917, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask76 + rotate: false + xy: 917, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask78 + rotate: false + xy: 917, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask69 + rotate: false + xy: 983, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask101 + rotate: false + xy: 983, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask103 + rotate: false + xy: 983, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask109 + rotate: false + xy: 983, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask111 + rotate: false + xy: 983, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask71 + rotate: false + xy: 983, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask77 + rotate: false + xy: 983, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask79 + rotate: false + xy: 983, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask72 + rotate: false + xy: 1049, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask104 + rotate: false + xy: 1049, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask73 + rotate: false + xy: 1115, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask105 + rotate: false + xy: 1115, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask107 + rotate: false + xy: 1115, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask75 + rotate: false + xy: 1115, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask74 + rotate: false + xy: 1181, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask106 + rotate: false + xy: 1181, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask8 + rotate: false + xy: 1279, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask136 + rotate: false + xy: 1279, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask80 + rotate: false + xy: 1247, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask88 + rotate: false + xy: 1247, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask81 + rotate: false + xy: 1313, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask83 + rotate: false + xy: 1313, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask89 + rotate: false + xy: 1313, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask91 + rotate: false + xy: 1313, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask82 + rotate: false + xy: 1379, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask90 + rotate: false + xy: 1379, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask84 + rotate: false + xy: 1445, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask86 + rotate: false + xy: 1445, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask85 + rotate: false + xy: 1511, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask87 + rotate: false + xy: 1511, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask9 + rotate: false + xy: 1345, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask11 + rotate: false + xy: 1345, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask137 + rotate: false + xy: 1345, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask139 + rotate: false + xy: 1345, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask92 + rotate: false + xy: 1577, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask94 + rotate: false + xy: 1577, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask93 + rotate: false + xy: 1643, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask95 + rotate: false + xy: 1643, 365 + size: 64, 64 + orig: 64, 64 offset: 0, 0 index: -1 coal1 rotate: false - xy: 1451, 459 + xy: 1503, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal2 rotate: false - xy: 1485, 459 + xy: 1537, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal3 rotate: false - xy: 1519, 459 + xy: 1571, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper1 rotate: false - xy: 1553, 459 + xy: 1605, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper2 rotate: false - xy: 1587, 459 + xy: 1639, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper3 rotate: false - xy: 1621, 459 + xy: 1673, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters1 rotate: false - xy: 1655, 459 + xy: 1707, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters2 rotate: false - xy: 1689, 459 + xy: 1741, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters3 rotate: false - xy: 1723, 459 + xy: 1775, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters4 rotate: false - xy: 1757, 459 + xy: 1809, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters5 rotate: false - xy: 1791, 459 + xy: 1843, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters6 rotate: false - xy: 1825, 459 + xy: 1877, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-edge + rotate: false + xy: 1, 301 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dacite-wall-large + rotate: false + xy: 919, 135 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dacite-wall1 + rotate: false + xy: 755, 3 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-wall2 + rotate: false + xy: 789, 3 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite1 + rotate: false + xy: 1911, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite2 + rotate: false + xy: 1945, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite3 + rotate: false + xy: 721, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal-large rotate: false - xy: 687, 329 + xy: 919, 69 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dark-metal1 rotate: false - xy: 1859, 459 + xy: 853, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal2 rotate: false - xy: 1893, 459 + xy: 887, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1 rotate: false - xy: 1927, 459 + xy: 921, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-edge rotate: false - xy: 1, 395 + xy: 99, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-2 rotate: false - xy: 1961, 459 + xy: 2007, 331 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-edge rotate: false - xy: 1, 297 + xy: 1, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-3 rotate: false - xy: 1995, 459 + xy: 985, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-edge rotate: false - xy: 99, 395 + xy: 99, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-4 rotate: false - xy: 753, 361 + xy: 1019, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-edge rotate: false - xy: 1, 199 + xy: 197, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-5 rotate: false - xy: 753, 327 + xy: 1053, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-edge rotate: false - xy: 99, 297 + xy: 1, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-6 rotate: false - xy: 753, 293 + xy: 1087, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-edge rotate: false - xy: 197, 395 + xy: 99, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-edge rotate: false - xy: 1, 101 + xy: 197, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water rotate: false - xy: 525, 1 + xy: 1233, 199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-edge rotate: false - xy: 99, 199 + xy: 295, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water1 rotate: false - xy: 655, 131 + xy: 1233, 165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water2 rotate: false - xy: 753, 259 + xy: 1233, 131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water3 rotate: false - xy: 689, 179 + xy: 1299, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water rotate: false - xy: 689, 145 + xy: 1333, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-edge rotate: false - xy: 197, 297 + xy: 1, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-water1 rotate: false - xy: 737, 225 + xy: 1367, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water2 rotate: false - xy: 1181, 409 + xy: 1401, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water3 rotate: false - xy: 1215, 409 + xy: 1435, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand1 rotate: false - xy: 491, 1 + xy: 1121, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand2 rotate: false - xy: 557, 67 + xy: 1183, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand3 rotate: false - xy: 655, 165 + xy: 2007, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater rotate: false - xy: 1249, 409 + xy: 1469, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-edge rotate: false - xy: 295, 395 + xy: 99, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dunerocks-large +dirt-edge rotate: false - xy: 785, 427 + xy: 197, 203 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dirt-wall-large + rotate: false + xy: 985, 233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dunerocks1 +dirt-wall1 rotate: false - xy: 1283, 425 + xy: 1605, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dunerocks2 +dirt-wall2 rotate: false - xy: 1317, 425 + xy: 1639, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt1 + rotate: false + xy: 1503, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt2 + rotate: false + xy: 1537, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt3 + rotate: false + xy: 1571, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall-large + rotate: false + xy: 985, 167 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dune-wall1 + rotate: false + xy: 1673, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall2 + rotate: false + xy: 1707, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge rotate: false - xy: 1351, 425 + xy: 1741, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge-stencil rotate: false - xy: 1, 3 + xy: 295, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 edgier rotate: false - xy: 1385, 425 + xy: 1775, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-edge rotate: false - xy: 99, 101 + xy: 393, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 grass1 rotate: false - xy: 1419, 425 + xy: 1809, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass2 rotate: false - xy: 1453, 425 + xy: 1843, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass3 rotate: false - xy: 1487, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-edge - rotate: false - xy: 197, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -holostone1 - rotate: false - xy: 1521, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone2 - rotate: false - xy: 1555, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone3 - rotate: false - xy: 1589, 425 + xy: 1877, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock1 rotate: false - xy: 1623, 425 + xy: 1911, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock2 rotate: false - xy: 1657, 425 + xy: 1945, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock3 rotate: false - xy: 1691, 425 + xy: 1217, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-edge rotate: false - xy: 295, 297 + xy: 99, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow-edge rotate: false - xy: 393, 395 + xy: 197, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow1 rotate: false - xy: 1827, 425 + xy: 2013, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow2 rotate: false - xy: 1861, 425 + xy: 2013, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow3 rotate: false - xy: 1895, 425 + xy: 1155, 65 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall-large + rotate: false + xy: 1051, 233 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +ice-wall1 + rotate: false + xy: 1189, 63 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall2 + rotate: false + xy: 1223, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice1 rotate: false - xy: 1725, 425 + xy: 1251, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice2 rotate: false - xy: 1759, 425 + xy: 1979, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice3 rotate: false - xy: 1793, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks-large - rotate: false - xy: 491, 35 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -icerocks1 - rotate: false - xy: 1929, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks2 - rotate: false - xy: 1963, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-edge - rotate: false - xy: 99, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ignarock1 - rotate: false - xy: 1997, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock2 - rotate: false - xy: 771, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock3 - rotate: false - xy: 1283, 391 + xy: 1979, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead1 rotate: false - xy: 1317, 391 + xy: 1257, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead2 rotate: false - xy: 1351, 391 + xy: 823, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead3 rotate: false - xy: 1385, 391 + xy: 857, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock1 rotate: false - xy: 1419, 391 + xy: 891, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock2 rotate: false - xy: 1453, 391 + xy: 925, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock3 rotate: false - xy: 1487, 391 + xy: 1267, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor rotate: false - xy: 1521, 391 + xy: 1267, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2 rotate: false - xy: 1555, 391 + xy: 1301, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-edge rotate: false - xy: 197, 101 + xy: 295, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-3 rotate: false - xy: 1589, 391 + xy: 1301, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-edge rotate: false - xy: 295, 199 + xy: 393, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-5 rotate: false - xy: 1623, 391 + xy: 1335, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-edge rotate: false - xy: 393, 297 + xy: 491, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged-edge rotate: false - xy: 491, 395 + xy: 197, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged1 rotate: false - xy: 1657, 391 + xy: 1335, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged2 rotate: false - xy: 1691, 391 + xy: 1369, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged3 rotate: false - xy: 1725, 391 + xy: 1369, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-edge rotate: false - xy: 197, 3 + xy: 295, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss-edge rotate: false - xy: 295, 101 + xy: 393, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss1 rotate: false - xy: 1759, 391 + xy: 1403, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss2 rotate: false - xy: 1793, 391 + xy: 1403, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss3 rotate: false - xy: 1827, 391 + xy: 1437, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud-edge + rotate: false + xy: 491, 301 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mud1 + rotate: false + xy: 1437, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud2 + rotate: false + xy: 1471, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud3 + rotate: false + xy: 1471, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal1 rotate: false - xy: 1861, 391 + xy: 1505, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal2 rotate: false - xy: 1895, 391 + xy: 1505, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal3 rotate: false - xy: 1929, 391 + xy: 1539, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper1 rotate: false - xy: 1963, 391 + xy: 1539, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper2 rotate: false - xy: 1997, 391 + xy: 1573, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper3 rotate: false - xy: 723, 179 + xy: 1573, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead1 rotate: false - xy: 723, 145 + xy: 1607, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead2 rotate: false - xy: 757, 191 + xy: 1607, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead3 rotate: false - xy: 757, 157 + xy: 1641, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap1 rotate: false - xy: 689, 111 + xy: 1641, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap2 rotate: false - xy: 723, 111 + xy: 1675, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap3 rotate: false - xy: 757, 123 + xy: 1675, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium1 rotate: false - xy: 791, 191 + xy: 1709, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium2 rotate: false - xy: 791, 157 + xy: 1709, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium3 rotate: false - xy: 791, 123 + xy: 1743, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium1 rotate: false - xy: 757, 89 + xy: 1743, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium2 rotate: false - xy: 791, 89 + xy: 1777, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium3 rotate: false - xy: 591, 99 + xy: 1777, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles1 rotate: false - xy: 591, 65 + xy: 1811, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles2 rotate: false - xy: 625, 97 + xy: 1811, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles3 rotate: false - xy: 625, 63 + xy: 1845, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pine rotate: false - xy: 687, 213 + xy: 1183, 183 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -rocks-large - rotate: false - xy: 589, 133 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rocks1 - rotate: false - xy: 659, 77 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rocks2 - rotate: false - xy: 693, 77 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 salt rotate: false - xy: 659, 43 + xy: 1845, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-edge rotate: false - xy: 393, 199 + xy: 589, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -saltrocks-large +salt-wall-large rotate: false - xy: 687, 263 + xy: 985, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks1 +salt-wall1 rotate: false - xy: 693, 43 + xy: 1879, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -saltrocks2 +salt-wall2 rotate: false - xy: 727, 55 + xy: 1879, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-edge rotate: false - xy: 491, 297 + xy: 295, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +sand-wall-large + rotate: false + xy: 1051, 167 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sand-wall1 + rotate: false + xy: 1319, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall2 + rotate: false + xy: 1353, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 sand-water rotate: false - xy: 761, 21 + xy: 1387, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-edge rotate: false - xy: 589, 395 + xy: 393, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-water1 rotate: false - xy: 795, 21 + xy: 1421, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water2 rotate: false - xy: 787, 393 + xy: 1455, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water3 rotate: false - xy: 787, 359 + xy: 1489, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand1 rotate: false - xy: 761, 55 + xy: 1913, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 795, 55 + xy: 1913, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand3 rotate: false - xy: 727, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-large - rotate: false - xy: 851, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sandrocks1 - rotate: false - xy: 821, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks2 - rotate: false - xy: 787, 325 + xy: 1285, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap1 rotate: false - xy: 855, 393 + xy: 1523, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap2 rotate: false - xy: 821, 359 + xy: 1557, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap3 rotate: false - xy: 787, 291 + xy: 1591, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-edge rotate: false - xy: 295, 3 + xy: 491, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +shale-wall-large + rotate: false + xy: 1117, 233 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shale-wall1 + rotate: false + xy: 1727, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-wall2 + rotate: false + xy: 1761, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 shale1 rotate: false - xy: 889, 393 + xy: 1625, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale2 rotate: false - xy: 821, 325 + xy: 1659, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale3 rotate: false - xy: 855, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shalerocks-large - rotate: false - xy: 917, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shalerocks1 - rotate: false - xy: 923, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shalerocks2 - rotate: false - xy: 821, 291 + xy: 1693, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-large rotate: false - xy: 983, 427 + xy: 1051, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shrubs1 rotate: false - xy: 855, 325 + xy: 1795, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs2 rotate: false - xy: 889, 359 + xy: 1829, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag rotate: false - xy: 957, 393 + xy: 1863, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-edge rotate: false - xy: 393, 101 + xy: 589, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-edge rotate: false - xy: 491, 199 + xy: 687, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-pine rotate: false - xy: 1181, 443 + xy: 1249, 249 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +snow-wall-large + rotate: false + xy: 1117, 167 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +snow-wall1 + rotate: false + xy: 1325, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow-wall2 + rotate: false + xy: 1359, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 snow1 rotate: false - xy: 855, 291 + xy: 1897, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow2 rotate: false - xy: 889, 325 + xy: 1931, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow3 rotate: false - xy: 923, 359 + xy: 1291, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -snowrocks-large +space rotate: false - xy: 1049, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snowrocks1 - rotate: false - xy: 991, 393 + xy: 1393, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -snowrocks2 +space-edge rotate: false - xy: 889, 291 - size: 32, 32 - orig: 32, 32 + xy: 393, 7 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 spawn rotate: false - xy: 923, 325 + xy: 1427, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-edge rotate: false - xy: 589, 297 + xy: 491, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 spore-moss1 rotate: false - xy: 957, 359 + xy: 1461, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss2 rotate: false - xy: 1025, 393 + xy: 1495, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss3 rotate: false - xy: 923, 291 + xy: 1529, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-pine rotate: false - xy: 1231, 443 + xy: 1183, 133 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -sporerocks-large +spore-wall-large rotate: false - xy: 1115, 427 + xy: 1183, 233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks1 +spore-wall1 rotate: false - xy: 957, 325 + xy: 1563, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sporerocks2 +spore-wall2 rotate: false - xy: 991, 359 + xy: 1597, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-edge rotate: false - xy: 687, 395 + xy: 589, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +stone-wall-large + rotate: false + xy: 1117, 101 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall1 + rotate: false + xy: 1733, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone-wall2 + rotate: false + xy: 1767, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 stone1 rotate: false - xy: 1059, 393 + xy: 1631, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 957, 291 + xy: 1665, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone3 rotate: false - xy: 991, 325 + xy: 1699, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water rotate: false - xy: 1025, 359 + xy: 1801, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-edge rotate: false - xy: 393, 3 + xy: 687, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tar rotate: false - xy: 1093, 393 + xy: 1835, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-edge rotate: false - xy: 491, 101 + xy: 785, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tendrils1 rotate: false - xy: 991, 291 + xy: 1869, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils2 rotate: false - xy: 1025, 325 + xy: 1903, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils3 rotate: false - xy: 1059, 359 + xy: 1291, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 1127, 393 + xy: 1325, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 1025, 291 + xy: 1359, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 1059, 325 + xy: 1393, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 1093, 359 + xy: 1427, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 1059, 291 + xy: 1461, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 1093, 325 + xy: 1495, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 1127, 359 + xy: 1529, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-edge rotate: false - xy: 589, 199 + xy: 491, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -sprites6.png +sprites7.png size: 2048,1024 format: rgba8888 filter: nearest,nearest repeat: none additive-reconstructor-icon-editor rotate: false - xy: 485, 627 + xy: 613, 763 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory-icon-editor rotate: false - xy: 613, 755 + xy: 1847, 925 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-icon-editor rotate: false - xy: 1555, 917 + xy: 711, 763 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 327, 103 + xy: 1667, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 375, 203 + xy: 423, 375 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt-icon-editor + rotate: false + xy: 423, 341 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt1 + rotate: false + xy: 423, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 131, 13 + xy: 423, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 1653, 917 + xy: 1945, 925 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 1, 15 + xy: 1, 23 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 1103, 721 + xy: 1397, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 165, 13 + xy: 423, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-forge-icon-editor rotate: false - xy: 1751, 917 + xy: 809, 763 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-loader-icon-editor rotate: false - xy: 1849, 917 + xy: 227, 281 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader-icon-editor rotate: false - xy: 1947, 917 + xy: 227, 183 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +boulder-icon-editor + rotate: false + xy: 1793, 843 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 bridge-conduit-icon-editor rotate: false - xy: 587, 363 + xy: 423, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 587, 329 + xy: 327, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 587, 295 + xy: 361, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 587, 295 + xy: 361, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 2045, 1012 + xy: 2043, 1020 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliff-icon-editor rotate: false - xy: 521, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliffs-icon-editor - rotate: false - xy: 555, 231 + xy: 1009, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 1169, 721 + xy: 1463, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 649, 589 + xy: 1043, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-center-icon-editor rotate: false - xy: 1235, 721 + xy: 1529, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conduit-icon-editor rotate: false - xy: 683, 589 + xy: 1077, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 1301, 721 + xy: 1595, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 1961, 719 + xy: 1111, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 1961, 685 + xy: 1145, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 1367, 721 + xy: 1661, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 323, 433 + xy: 323, 409 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 323, 563 + xy: 613, 861 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 227, 273 + xy: 517, 635 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 1961, 651 + xy: 1179, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 1961, 651 + xy: 1179, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cryofluidmixer-icon-editor +cryofluid-mixer-icon-editor rotate: false - xy: 1433, 721 + xy: 1727, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 1499, 721 + xy: 943, 501 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 227, 175 + xy: 131, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +dacite-boulder-icon-editor + rotate: false + xy: 1667, 711 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-icon-editor + rotate: false + xy: 1213, 497 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite1 + rotate: false + xy: 1213, 497 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-wall-icon-editor + rotate: false + xy: 1247, 497 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 dark-metal-icon-editor rotate: false - xy: 1961, 617 + xy: 1281, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 1989, 791 + xy: 1315, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 1989, 791 + xy: 1315, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 1989, 757 + xy: 1349, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 1989, 757 + xy: 1349, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 1995, 723 + xy: 649, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 1995, 723 + xy: 649, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 1995, 689 + xy: 683, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 1995, 689 + xy: 683, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 1995, 655 + xy: 717, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 1995, 655 + xy: 717, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 1995, 621 + xy: 751, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 1995, 621 + xy: 751, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 409, 201 + xy: 785, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 409, 201 + xy: 785, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 443, 201 + xy: 819, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 477, 201 + xy: 853, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 511, 197 + xy: 887, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 511, 197 + xy: 887, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 131, 47 + xy: 517, 537 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode-icon-editor rotate: false - xy: 545, 197 + xy: 395, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-icon-editor + rotate: false + xy: 1383, 497 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt1 + rotate: false + xy: 1383, 497 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-wall-icon-editor + rotate: false + xy: 1793, 809 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 disassembler-icon-editor rotate: false - xy: 229, 77 + xy: 325, 311 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 551, 463 + xy: 1007, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 633, 555 + xy: 1783, 775 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 1593, 753 + xy: 1007, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dunerocks-icon-editor +dune-wall-icon-editor rotate: false - xy: 667, 555 + xy: 1717, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 717, 605 + xy: 1717, 693 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt2 + rotate: false + xy: 1717, 659 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt3 + rotate: false + xy: 1701, 625 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 765, 655 + xy: 1735, 625 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 799, 655 + xy: 985, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters2 rotate: false - xy: 833, 655 + xy: 1019, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 867, 655 + xy: 1053, 463 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite2 + rotate: false + xy: 1087, 463 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite3 + rotate: false + xy: 1121, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water1 rotate: false - xy: 969, 655 + xy: 1223, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water2 rotate: false - xy: 1003, 655 + xy: 1257, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water3 rotate: false - xy: 1037, 655 + xy: 1291, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water1 rotate: false - xy: 765, 621 + xy: 1325, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water2 rotate: false - xy: 799, 621 + xy: 1359, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water3 rotate: false - xy: 833, 621 + xy: 1393, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 901, 655 + xy: 1155, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 935, 655 + xy: 1189, 463 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt2 + rotate: false + xy: 1817, 775 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt3 + rotate: false + xy: 1851, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 867, 621 + xy: 1885, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 867, 621 + xy: 1885, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 901, 621 + xy: 1919, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 935, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone1 - rotate: false - xy: 969, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-icon-editor - rotate: false - xy: 969, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone2 - rotate: false - xy: 1003, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone3 - rotate: false - xy: 1037, 621 + xy: 1953, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 361, 103 + xy: 1987, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 361, 103 + xy: 1987, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 701, 555 + xy: 1851, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 633, 521 + xy: 1885, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 617, 453 + xy: 425, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 617, 453 + xy: 425, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 651, 487 + xy: 425, 171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 617, 419 + xy: 425, 137 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 667, 521 + xy: 1919, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 667, 521 + xy: 1919, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 701, 521 + xy: 1953, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 617, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock1 - rotate: false - xy: 651, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-icon-editor - rotate: false - xy: 651, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock2 - rotate: false - xy: 685, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock3 - rotate: false - xy: 651, 419 + xy: 1987, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 685, 453 + xy: 429, 103 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 685, 453 + xy: 429, 103 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 685, 419 + xy: 429, 69 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 719, 487 + xy: 231, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 719, 453 + xy: 265, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 719, 453 + xy: 265, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 719, 419 + xy: 231, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 719, 419 + xy: 231, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 621, 385 + xy: 265, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 621, 385 + xy: 265, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 621, 351 + xy: 299, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 621, 351 + xy: 299, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 655, 385 + xy: 333, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 655, 385 + xy: 333, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 621, 317 + xy: 367, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 655, 351 + xy: 299, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 689, 385 + xy: 333, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 689, 385 + xy: 333, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 655, 317 + xy: 367, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 689, 351 + xy: 401, 35 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud1 + rotate: false + xy: 435, 35 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud-icon-editor + rotate: false + xy: 435, 35 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud2 + rotate: false + xy: 401, 1 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud3 + rotate: false + xy: 435, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 689, 317 + xy: 985, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 723, 385 + xy: 1019, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 723, 351 + xy: 1053, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 723, 317 + xy: 1087, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 621, 283 + xy: 1121, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 655, 283 + xy: 1155, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 689, 283 + xy: 1189, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 723, 283 + xy: 1223, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 579, 197 + xy: 1257, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 361, 69 + xy: 1291, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 361, 35 + xy: 1325, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 361, 1 + xy: 1359, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 1995, 587 + xy: 1393, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 1071, 621 + xy: 457, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 1105, 621 + xy: 491, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 1139, 621 + xy: 457, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 1173, 621 + xy: 525, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 1207, 621 + xy: 457, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 1241, 621 + xy: 491, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 1275, 621 + xy: 559, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 1309, 621 + xy: 457, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 1343, 621 + xy: 491, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 1343, 621 + xy: 491, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water1 rotate: false - xy: 1479, 621 + xy: 491, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water2 rotate: false - xy: 1513, 621 + xy: 525, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water3 rotate: false - xy: 751, 587 + xy: 559, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 1377, 621 + xy: 525, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 1377, 621 + xy: 525, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 1411, 621 + xy: 593, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 1445, 621 + xy: 457, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 785, 587 + xy: 491, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 785, 587 + xy: 491, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 819, 587 + xy: 525, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 853, 587 + xy: 559, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-slag rotate: false - xy: 887, 587 + xy: 593, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-icon-editor rotate: false - xy: 887, 587 + xy: 593, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 921, 587 + xy: 525, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 955, 587 + xy: 559, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 989, 587 + xy: 593, 337 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-space + rotate: false + xy: 559, 269 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +space-icon-editor + rotate: false + xy: 559, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spawn rotate: false - xy: 1023, 587 + xy: 593, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 1057, 587 + xy: 593, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 1057, 587 + xy: 593, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 1091, 587 + xy: 627, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 1125, 587 + xy: 627, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 1159, 587 + xy: 661, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 1159, 587 + xy: 661, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 1193, 587 + xy: 627, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 1227, 587 + xy: 661, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 1261, 587 + xy: 695, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 1261, 587 + xy: 695, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 1295, 587 + xy: 627, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 1295, 587 + xy: 627, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 1329, 587 + xy: 661, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 1363, 587 + xy: 695, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 1397, 587 + xy: 729, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 1431, 587 + xy: 661, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 1431, 587 + xy: 661, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 exponential-reconstructor-icon-editor rotate: false - xy: 1, 145 + xy: 1, 153 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 force-projector-icon-editor rotate: false - xy: 485, 529 + xy: 325, 213 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +foreshadow-icon-editor + rotate: false + xy: 937, 893 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 fuse-icon-editor rotate: false - xy: 711, 755 + xy: 615, 665 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 1659, 753 + xy: 1073, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ground-factory-icon-editor rotate: false - xy: 809, 787 + xy: 615, 567 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hail-icon-editor rotate: false - xy: 1465, 587 + xy: 695, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hyper-processor-icon-editor rotate: false - xy: 907, 787 + xy: 713, 665 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -icerocks-icon-editor +ice-wall-icon-editor rotate: false - xy: 1499, 587 + xy: 729, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-icon-editor rotate: false - xy: 735, 553 + xy: 763, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 775, 885 + xy: 1067, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 769, 553 + xy: 695, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 803, 553 + xy: 729, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 837, 553 + xy: 763, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 871, 553 + xy: 797, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 905, 553 + xy: 729, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 1725, 753 + xy: 1007, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 1791, 753 + xy: 1073, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +large-logic-display-icon-editor + rotate: false + xy: 323, 539 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 laser-drill-icon-editor rotate: false - xy: 1005, 787 + xy: 713, 567 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 1103, 787 + xy: 811, 665 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large-icon-editor rotate: false - xy: 905, 885 + xy: 1197, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 939, 553 + xy: 763, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 973, 553 + xy: 797, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1007, 553 + xy: 831, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 1201, 787 + xy: 811, 567 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-void-icon-editor rotate: false - xy: 1041, 553 + xy: 763, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-display-icon-editor rotate: false - xy: 1299, 787 + xy: 229, 85 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor-icon-editor rotate: false - xy: 1857, 753 + xy: 1139, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 1397, 787 + xy: 327, 115 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 1923, 753 + xy: 1073, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 1075, 553 + xy: 797, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 1035, 885 + xy: 1327, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 1109, 553 + xy: 831, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +memory-bank-icon-editor + rotate: false + xy: 1139, 663 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 memory-cell-icon-editor rotate: false - xy: 1143, 553 + xy: 865, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 1103, 655 + xy: 1205, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 1177, 553 + xy: 797, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1211, 553 + xy: 831, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor-icon-editor rotate: false - xy: 1245, 553 + xy: 865, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 453, 431 + xy: 453, 439 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor-icon-editor rotate: false - xy: 613, 853 + xy: 775, 861 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory-icon-editor rotate: false - xy: 1495, 787 + xy: 551, 439 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 1593, 819 + xy: 649, 469 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-icon-editor rotate: false - xy: 1691, 819 + xy: 747, 469 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 1169, 655 + xy: 1139, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 1279, 553 + xy: 831, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 parallax-icon-editor rotate: false - xy: 1235, 655 + xy: 1205, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 payload-conveyor-icon-editor rotate: false - xy: 1789, 819 + xy: 845, 469 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon-editor rotate: false - xy: 1887, 819 + xy: 1847, 827 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1313, 553 + xy: 865, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 1347, 553 + xy: 865, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 1381, 553 + xy: 627, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 1415, 553 + xy: 661, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 1301, 655 + xy: 1271, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 1367, 655 + xy: 1205, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 325, 187 + xy: 1733, 777 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 1433, 655 + xy: 1271, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-conveyor-icon-editor rotate: false - xy: 1449, 553 + xy: 695, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-icon-editor rotate: false - xy: 1483, 553 + xy: 729, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large-icon-editor rotate: false - xy: 1499, 655 + xy: 1271, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plated-conduit-icon-editor rotate: false - xy: 1533, 587 + xy: 763, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 1565, 687 + xy: 1337, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 1517, 553 + xy: 797, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 1631, 687 + xy: 1337, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 1567, 587 + xy: 831, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 1551, 553 + xy: 865, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 1601, 587 + xy: 899, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 1585, 553 + xy: 899, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 1697, 687 + xy: 1337, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 1635, 587 + xy: 899, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point-icon-editor rotate: false - xy: 1763, 687 + xy: 1009, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 325, 335 + xy: 1945, 827 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -rock-icon-editor - rotate: false - xy: 1985, 867 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rocks-icon-editor - rotate: false - xy: 1619, 553 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 rotary-pump-icon-editor rotate: false - xy: 1829, 687 + xy: 1075, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 1669, 587 + xy: 899, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 1895, 687 + xy: 1141, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks-icon-editor +salt-wall-icon-editor rotate: false - xy: 1653, 553 + xy: 899, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 551, 397 + xy: 1207, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 1703, 587 + xy: 459, 235 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall-icon-editor + rotate: false + xy: 459, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 1687, 553 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-icon-editor - rotate: false - xy: 1737, 587 + xy: 493, 235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 521, 331 + xy: 1273, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 1721, 553 + xy: 459, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 1165, 885 + xy: 1457, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 325, 237 + xy: 907, 763 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 1771, 587 + xy: 493, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 521, 265 + xy: 1339, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 segment-icon-editor rotate: false - xy: 1565, 621 + xy: 1403, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 1631, 621 + xy: 1403, 695 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 1755, 553 + xy: 527, 235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shalerocks-icon-editor +shale-wall-icon-editor rotate: false - xy: 1805, 587 + xy: 493, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 1789, 553 + xy: 527, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 1839, 587 + xy: 561, 235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-crucible-icon-editor rotate: false - xy: 423, 333 + xy: 909, 665 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 1697, 621 + xy: 1469, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +snow-boulder-icon-editor + rotate: false + xy: 1667, 661 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 snow-icon-editor rotate: false - xy: 1823, 553 + xy: 527, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 583, 543 + xy: 131, 5 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock-icon-editor +snow-wall-icon-editor rotate: false - xy: 715, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrocks-icon-editor - rotate: false - xy: 1873, 587 + xy: 561, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 1857, 553 + xy: 561, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 423, 235 + xy: 909, 567 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 1907, 587 + xy: 463, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 1891, 553 + xy: 463, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 1295, 885 + xy: 1587, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 1985, 825 + xy: 943, 459 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 327, 137 + xy: 181, 5 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 1763, 621 + xy: 1403, 629 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks-icon-editor +spore-wall-icon-editor rotate: false - xy: 1925, 553 + xy: 497, 133 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +steam-generator-icon-editor + rotate: false + xy: 1469, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall-icon-editor + rotate: false + xy: 497, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 1829, 621 + xy: 1535, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 753, 519 + xy: 531, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 1895, 621 + xy: 1469, 629 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 229, 11 + xy: 1535, 695 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 switch-icon-editor rotate: false - xy: 753, 485 + xy: 531, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 787, 519 + xy: 565, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tetrative-reconstructor-icon-editor rotate: false - xy: 323, 725 + xy: 323, 733 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 295, 11 + xy: 1601, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 809, 689 + xy: 1005, 795 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 907, 689 + xy: 1103, 795 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 753, 451 + xy: 565, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 583, 659 + xy: 1535, 629 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 1425, 885 + xy: 1717, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 787, 485 + xy: 469, 65 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 821, 519 + xy: 469, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 583, 593 + xy: 1601, 695 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-icon-editor +tsunami-icon-editor rotate: false - xy: 649, 689 - size: 64, 64 - orig: 64, 64 + xy: 1201, 795 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 underflow-gate-icon-editor rotate: false - xy: 787, 451 + xy: 503, 65 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 821, 485 + xy: 503, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 1005, 689 + xy: 1299, 795 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 649, 623 + xy: 1667, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 715, 689 + xy: 1601, 629 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 693 + xy: 1, 701 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 1, 371 + xy: 1, 379 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 -sprites7.png +sprites8.png size: 2048,1024 format: rgba8888 filter: nearest,nearest @@ -10444,7 +13460,7 @@ alpha-bg index: -1 bar rotate: false - xy: 1799, 693 + xy: 950, 175 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -10452,7 +13468,7 @@ bar index: -1 bar-top rotate: false - xy: 1770, 693 + xy: 950, 213 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -10467,21 +13483,21 @@ block-additive-reconstructor-large index: -1 block-additive-reconstructor-medium rotate: false - xy: 919, 647 + xy: 1571, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-additive-reconstructor-small rotate: false - xy: 855, 6 + xy: 2023, 789 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-additive-reconstructor-tiny rotate: false - xy: 301, 1 + xy: 1549, 553 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10502,21 +13518,21 @@ block-air-factory-large index: -1 block-air-factory-medium rotate: false - xy: 953, 647 + xy: 1605, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-air-factory-small rotate: false - xy: 105, 2 + xy: 1489, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-air-factory-tiny rotate: false - xy: 319, 1 + xy: 1009, 47 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10530,28 +13546,28 @@ block-air-factory-xlarge index: -1 block-alloy-smelter-large rotate: false - xy: 351, 47 + xy: 651, 283 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alloy-smelter-medium rotate: false - xy: 987, 647 + xy: 1639, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alloy-smelter-small rotate: false - xy: 1828, 705 + xy: 950, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 2003, 779 + xy: 301, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10565,28 +13581,28 @@ block-alloy-smelter-xlarge index: -1 block-arc-large rotate: false - xy: 451, 141 + xy: 596, 191 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 1021, 647 + xy: 1825, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 1251, 456 + xy: 979, 204 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 331, 598 + xy: 319, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10600,28 +13616,28 @@ block-arc-xlarge index: -1 block-armored-conveyor-large rotate: false - xy: 551, 233 + xy: 646, 241 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 1055, 647 + xy: 881, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 881, 6 + xy: 979, 178 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 131, 10 + xy: 337, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10633,7184 +13649,7499 @@ block-armored-conveyor-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-battery-large +block-basalt-large rotate: false - xy: 601, 284 + xy: 701, 324 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-battery-large-large +block-basalt-medium rotate: false - xy: 701, 384 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 1089, 647 + xy: 915, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-battery-large-small +block-basalt-small rotate: false - xy: 1854, 705 + xy: 979, 152 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-battery-large-tiny +block-basalt-tiny rotate: false - xy: 1308, 569 + xy: 1403, 333 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-battery-large-xlarge +block-basalt-xlarge rotate: false xy: 51, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-battery-medium +block-battery-large rotate: false - xy: 1123, 647 + xy: 501, 74 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-large + rotate: false + xy: 693, 282 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-medium + rotate: false + xy: 877, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-battery-small +block-battery-large-small rotate: false - xy: 1251, 430 + xy: 1455, 367 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-battery-tiny +block-battery-large-tiny rotate: false - xy: 1870, 479 + xy: 331, 598 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-battery-xlarge +block-battery-large-xlarge rotate: false xy: 131, 558 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-blast-drill-large +block-battery-medium rotate: false - xy: 651, 324 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 1157, 647 + xy: 911, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-blast-drill-small +block-battery-small rotate: false - xy: 907, 6 + xy: 1421, 346 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-blast-drill-tiny +block-battery-tiny rotate: false xy: 309, 672 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-blast-drill-xlarge +block-battery-xlarge rotate: false xy: 181, 608 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-blast-mixer-large +block-blast-drill-large rotate: false - xy: 501, 174 + xy: 688, 240 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-blast-mixer-medium +block-blast-drill-medium rotate: false - xy: 1191, 647 + xy: 877, 503 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-blast-mixer-small +block-blast-drill-small rotate: false - xy: 1880, 705 + xy: 485, 6 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-blast-mixer-tiny - rotate: false - xy: 2003, 761 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-mixer-xlarge - rotate: false - xy: 259, 769 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-forge-large - rotate: false - xy: 643, 282 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-forge-medium - rotate: false - xy: 1573, 799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-forge-small - rotate: false - xy: 933, 6 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-forge-tiny +block-blast-drill-tiny rotate: false xy: 331, 580 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-block-forge-xlarge +block-blast-drill-xlarge + rotate: false + xy: 259, 769 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-blast-mixer-large + rotate: false + xy: 451, 35 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-mixer-medium + rotate: false + xy: 911, 503 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-mixer-small + rotate: false + xy: 1013, 325 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-blast-mixer-tiny + rotate: false + xy: 1681, 345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-blast-mixer-xlarge rotate: false xy: 1, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-block-loader-large +block-block-forge-large rotate: false - xy: 351, 5 + xy: 493, 32 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-block-loader-medium +block-block-forge-medium rotate: false - xy: 1607, 799 + xy: 877, 469 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-block-loader-small +block-block-forge-small rotate: false - xy: 1906, 705 + xy: 1039, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-block-loader-tiny +block-block-forge-tiny rotate: false - xy: 2021, 759 + xy: 355, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-block-loader-xlarge +block-block-forge-xlarge rotate: false xy: 51, 428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-block-unloader-large +block-block-loader-large rotate: false - xy: 401, 74 + xy: 401, 8 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-block-unloader-medium +block-block-loader-medium rotate: false - xy: 1641, 799 + xy: 911, 469 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-block-unloader-small +block-block-loader-small rotate: false - xy: 959, 6 + xy: 1065, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-block-unloader-tiny +block-block-loader-tiny rotate: false - xy: 1888, 479 + xy: 373, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-block-unloader-xlarge +block-block-loader-xlarge rotate: false xy: 181, 558 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-bridge-conduit-large +block-block-unloader-large rotate: false - xy: 393, 32 + xy: 551, 91 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-bridge-conduit-medium +block-block-unloader-medium rotate: false - xy: 1675, 799 + xy: 877, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-bridge-conduit-small +block-block-unloader-small rotate: false - xy: 1251, 404 + xy: 1091, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-bridge-conduit-tiny +block-block-unloader-tiny rotate: false - xy: 1308, 551 + xy: 1421, 328 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-bridge-conduit-xlarge +block-block-unloader-xlarge rotate: false xy: 259, 719 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-bridge-conveyor-large - rotate: false - xy: 451, 99 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conveyor-medium - rotate: false - xy: 1709, 799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conveyor-small - rotate: false - xy: 1246, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conveyor-tiny - rotate: false - xy: 1306, 533 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conveyor-xlarge - rotate: false - xy: 1, 328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-large - rotate: false - xy: 493, 132 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-char-medium - rotate: false - xy: 1743, 799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-char-small - rotate: false - xy: 2021, 881 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-char-tiny - rotate: false - xy: 1306, 515 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-char-xlarge - rotate: false - xy: 51, 378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cliff-large - rotate: false - xy: 493, 90 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliff-medium - rotate: false - xy: 1777, 799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliff-small - rotate: false - xy: 2021, 855 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliff-tiny - rotate: false - xy: 1306, 497 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliff-xlarge - rotate: false - xy: 259, 669 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cliffs-large - rotate: false - xy: 701, 342 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliffs-medium - rotate: false - xy: 1811, 799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-small - rotate: false - xy: 2021, 829 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliffs-tiny - rotate: false - xy: 1326, 548 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliffs-xlarge - rotate: false - xy: 1, 278 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-coal-centrifuge-large - rotate: false - xy: 551, 191 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-coal-centrifuge-medium - rotate: false - xy: 1845, 799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-coal-centrifuge-small - rotate: false - xy: 2021, 803 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-coal-centrifuge-tiny - rotate: false - xy: 1344, 548 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-coal-centrifuge-xlarge - rotate: false - xy: 51, 328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-combustion-generator-large - rotate: false - xy: 443, 57 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-combustion-generator-medium - rotate: false - xy: 1879, 799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-combustion-generator-small - rotate: false - xy: 1828, 679 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-combustion-generator-tiny - rotate: false - xy: 1362, 548 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-combustion-generator-xlarge - rotate: false - xy: 1, 228 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-command-center-large - rotate: false - xy: 485, 48 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-command-center-medium - rotate: false - xy: 1913, 799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-small - rotate: false - xy: 1854, 679 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-command-center-tiny - rotate: false - xy: 1380, 548 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-command-center-xlarge - rotate: false - xy: 51, 278 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conduit-large - rotate: false - xy: 435, 15 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conduit-medium - rotate: false - xy: 1953, 857 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-small - rotate: false - xy: 1880, 679 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conduit-tiny - rotate: false - xy: 1324, 530 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conduit-xlarge - rotate: false - xy: 1, 178 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-container-large - rotate: false - xy: 477, 6 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-container-medium - rotate: false - xy: 1953, 823 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-small - rotate: false - xy: 1906, 679 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-container-tiny - rotate: false - xy: 1324, 512 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-container-xlarge - rotate: false - xy: 51, 228 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conveyor-large +block-boulder-large rotate: false xy: 751, 536 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-conveyor-medium +block-boulder-medium rotate: false - xy: 881, 563 + xy: 911, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-conveyor-small +block-boulder-small rotate: false - xy: 1932, 695 + xy: 1117, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-conveyor-tiny +block-boulder-tiny rotate: false - xy: 1342, 530 + xy: 1403, 315 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-conveyor-xlarge +block-boulder-xlarge rotate: false - xy: 1, 128 + xy: 1, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-copper-wall-large +block-bridge-conduit-large rotate: false xy: 751, 494 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-copper-wall-large-large +block-bridge-conduit-medium + rotate: false + xy: 877, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-bridge-conduit-small + rotate: false + xy: 1143, 325 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-bridge-conduit-tiny + rotate: false + xy: 1421, 310 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conduit-xlarge + rotate: false + xy: 51, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-bridge-conveyor-large rotate: false xy: 793, 536 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-copper-wall-large-medium +block-bridge-conveyor-medium rotate: false - xy: 877, 529 + xy: 911, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-copper-wall-large-small +block-bridge-conveyor-small rotate: false - xy: 1932, 669 + xy: 1169, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-copper-wall-large-tiny +block-bridge-conveyor-tiny rotate: false - xy: 1360, 530 + xy: 1371, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-copper-wall-large-xlarge +block-bridge-conveyor-xlarge rotate: false - xy: 51, 178 + xy: 259, 669 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-copper-wall-medium - rotate: false - xy: 877, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-small - rotate: false - xy: 1958, 695 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-tiny - rotate: false - xy: 1342, 512 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-xlarge - rotate: false - xy: 1, 78 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-foundation-large - rotate: false - xy: 793, 494 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 877, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-small - rotate: false - xy: 1958, 669 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-foundation-tiny - rotate: false - xy: 1378, 530 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-foundation-xlarge - rotate: false - xy: 51, 128 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-nucleus-large - rotate: false - xy: 835, 536 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-nucleus-medium - rotate: false - xy: 1569, 765 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-nucleus-small - rotate: false - xy: 2021, 777 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-nucleus-tiny - rotate: false - xy: 1360, 512 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-nucleus-xlarge - rotate: false - xy: 1, 28 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-shard-large - rotate: false - xy: 835, 494 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-shard-medium - rotate: false - xy: 1603, 765 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-shard-small - rotate: false - xy: 1327, 566 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-shard-tiny - rotate: false - xy: 1378, 512 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-shard-xlarge - rotate: false - xy: 51, 78 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-craters-large +block-char-large rotate: false xy: 751, 452 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-craters-medium +block-char-medium rotate: false - xy: 1637, 765 + xy: 1673, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-craters-small +block-char-small rotate: false - xy: 1353, 566 + xy: 1195, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-craters-tiny +block-char-tiny rotate: false - xy: 1324, 494 + xy: 1373, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-craters-xlarge +block-char-xlarge rotate: false - xy: 51, 28 + xy: 1, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cryofluidmixer-large +block-cliff-large + rotate: false + xy: 793, 494 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cliff-medium + rotate: false + xy: 1707, 649 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cliff-small + rotate: false + xy: 1221, 325 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cliff-tiny + rotate: false + xy: 1373, 271 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cliff-xlarge + rotate: false + xy: 51, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-coal-centrifuge-large + rotate: false + xy: 835, 536 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-coal-centrifuge-medium + rotate: false + xy: 1741, 658 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-coal-centrifuge-small + rotate: false + xy: 1007, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-coal-centrifuge-tiny + rotate: false + xy: 1373, 253 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-coal-centrifuge-xlarge + rotate: false + xy: 1, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-combustion-generator-large + rotate: false + xy: 751, 410 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-combustion-generator-medium + rotate: false + xy: 1909, 731 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-combustion-generator-small + rotate: false + xy: 1033, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-combustion-generator-tiny + rotate: false + xy: 1373, 235 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-combustion-generator-xlarge + rotate: false + xy: 51, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-command-center-large rotate: false xy: 793, 452 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cryofluidmixer-medium +block-command-center-medium rotate: false - xy: 1671, 765 + xy: 1867, 709 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cryofluidmixer-small +block-command-center-small rotate: false - xy: 1379, 566 + xy: 1059, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cryofluidmixer-tiny +block-command-center-tiny rotate: false - xy: 1342, 494 + xy: 1439, 323 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cryofluidmixer-xlarge +block-command-center-xlarge rotate: false - xy: 857, 975 + xy: 1, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cultivator-large +block-conduit-large + rotate: false + xy: 835, 494 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conduit-medium + rotate: false + xy: 1499, 597 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conduit-small + rotate: false + xy: 1085, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conduit-tiny + rotate: false + xy: 1457, 323 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conduit-xlarge + rotate: false + xy: 51, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-container-large + rotate: false + xy: 751, 368 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-container-medium + rotate: false + xy: 1951, 749 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-container-small + rotate: false + xy: 1111, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-container-tiny + rotate: false + xy: 1475, 323 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-container-xlarge + rotate: false + xy: 1, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-conveyor-large + rotate: false + xy: 793, 410 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conveyor-medium + rotate: false + xy: 1007, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conveyor-small + rotate: false + xy: 1137, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conveyor-tiny + rotate: false + xy: 1493, 323 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conveyor-xlarge + rotate: false + xy: 51, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-large rotate: false xy: 835, 452 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cultivator-medium +block-copper-wall-large-large rotate: false - xy: 1705, 765 + xy: 793, 368 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-medium + rotate: false + xy: 1041, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cultivator-small +block-copper-wall-large-small rotate: false - xy: 1272, 378 + xy: 1163, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cultivator-tiny +block-copper-wall-large-tiny rotate: false - xy: 1360, 494 + xy: 1439, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cultivator-xlarge +block-copper-wall-large-xlarge + rotate: false + xy: 1, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-medium + rotate: false + xy: 1075, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-small + rotate: false + xy: 1189, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-copper-wall-tiny + rotate: false + xy: 1457, 305 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-copper-wall-xlarge + rotate: false + xy: 51, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-foundation-large + rotate: false + xy: 835, 410 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-foundation-medium + rotate: false + xy: 1109, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-foundation-small + rotate: false + xy: 1215, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-foundation-tiny + rotate: false + xy: 1475, 305 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-foundation-xlarge + rotate: false + xy: 1, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-nucleus-large + rotate: false + xy: 835, 368 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-nucleus-medium + rotate: false + xy: 1143, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-nucleus-small + rotate: false + xy: 1009, 273 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-nucleus-tiny + rotate: false + xy: 1493, 305 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-nucleus-xlarge + rotate: false + xy: 51, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-shard-large + rotate: false + xy: 646, 199 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-shard-medium + rotate: false + xy: 1177, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-shard-small + rotate: false + xy: 1009, 247 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-shard-tiny + rotate: false + xy: 2029, 661 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-shard-xlarge + rotate: false + xy: 51, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-craters-large + rotate: false + xy: 688, 198 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-craters-medium + rotate: false + xy: 1211, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-craters-small + rotate: false + xy: 1035, 273 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-craters-tiny + rotate: false + xy: 1365, 47 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-craters-xlarge + rotate: false + xy: 857, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cryofluid-mixer-large + rotate: false + xy: 543, 49 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cryofluid-mixer-medium + rotate: false + xy: 1245, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cryofluid-mixer-small + rotate: false + xy: 1035, 247 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cryofluid-mixer-tiny + rotate: false + xy: 1365, 29 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cryofluid-mixer-xlarge rotate: false xy: 907, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cyclone-large +block-cultivator-large rotate: false - xy: 746, 410 + xy: 535, 7 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cyclone-medium +block-cultivator-medium rotate: false - xy: 1739, 765 + xy: 1279, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cyclone-small +block-cultivator-small rotate: false - xy: 1256, 561 + xy: 1061, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cyclone-tiny +block-cultivator-tiny rotate: false - xy: 1378, 494 + xy: 1365, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cyclone-xlarge +block-cultivator-xlarge rotate: false xy: 957, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-metal-large +block-cyclone-large rotate: false - xy: 788, 410 + xy: 596, 149 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-metal-medium +block-cyclone-medium rotate: false - xy: 1773, 765 + xy: 1313, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-metal-small +block-cyclone-small rotate: false - xy: 1282, 561 + xy: 1061, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-metal-tiny +block-cyclone-tiny rotate: false - xy: 1306, 479 + xy: 2030, 883 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-metal-xlarge +block-cyclone-xlarge rotate: false xy: 1007, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-1-large +block-dacite-boulder-large rotate: false - xy: 830, 410 + xy: 638, 157 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-1-medium +block-dacite-boulder-medium rotate: false - xy: 1807, 765 + xy: 1347, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-1-small +block-dacite-boulder-small rotate: false - xy: 1280, 535 + xy: 1087, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-1-tiny +block-dacite-boulder-tiny rotate: false - xy: 1324, 476 + xy: 2030, 865 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-1-xlarge +block-dacite-boulder-xlarge rotate: false xy: 1057, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-2-large +block-dacite-large rotate: false - xy: 743, 368 + xy: 680, 156 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-2-medium +block-dacite-medium rotate: false - xy: 1841, 765 + xy: 1381, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-2-small +block-dacite-small rotate: false - xy: 1280, 509 + xy: 1087, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-2-tiny +block-dacite-tiny rotate: false - xy: 1342, 476 + xy: 1373, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-2-xlarge +block-dacite-wall-large + rotate: false + xy: 594, 107 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dacite-wall-medium + rotate: false + xy: 1415, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-small + rotate: false + xy: 1113, 273 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dacite-wall-tiny + rotate: false + xy: 1697, 397 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dacite-wall-xlarge rotate: false xy: 1107, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-3-large - rotate: false - xy: 785, 368 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 1875, 765 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 1280, 483 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 1360, 476 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-3-xlarge +block-dacite-xlarge rotate: false xy: 1157, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-4-large +block-dark-metal-large rotate: false - xy: 827, 368 + xy: 593, 65 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-4-medium +block-dark-metal-medium rotate: false - xy: 1909, 765 + xy: 949, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-4-small +block-dark-metal-small rotate: false - xy: 1473, 676 + xy: 1113, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-4-tiny +block-dark-metal-tiny rotate: false - xy: 1378, 476 + xy: 1697, 379 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-4-xlarge +block-dark-metal-xlarge rotate: false xy: 1207, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-5-large +block-dark-panel-1-large rotate: false - xy: 743, 326 + xy: 638, 115 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-5-medium +block-dark-panel-1-medium rotate: false - xy: 1979, 899 + xy: 945, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-5-small +block-dark-panel-1-small rotate: false - xy: 1499, 676 + xy: 1139, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-5-tiny +block-dark-panel-1-tiny rotate: false - xy: 1303, 461 + xy: 1347, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-5-xlarge +block-dark-panel-1-xlarge rotate: false xy: 1257, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-6-large +block-dark-panel-2-large rotate: false - xy: 785, 326 + xy: 680, 114 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-6-medium +block-dark-panel-2-medium rotate: false - xy: 2013, 907 + xy: 945, 503 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-6-small +block-dark-panel-2-small rotate: false - xy: 1525, 671 + xy: 1139, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-6-tiny +block-dark-panel-2-tiny rotate: false - xy: 1303, 443 + xy: 1343, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-6-xlarge +block-dark-panel-2-xlarge rotate: false xy: 1307, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-large +block-dark-panel-3-large rotate: false - xy: 827, 326 + xy: 743, 324 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-darksand-medium +block-dark-panel-3-medium rotate: false - xy: 1947, 789 + xy: 945, 469 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-darksand-small +block-dark-panel-3-small rotate: false - xy: 1551, 671 + xy: 1165, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-darksand-tainted-water-large +block-dark-panel-3-tiny rotate: false - xy: 601, 242 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 1943, 755 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 1577, 671 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 1303, 425 + xy: 1343, 173 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-darksand-tainted-water-xlarge +block-dark-panel-3-xlarge rotate: false xy: 1357, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-tiny +block-dark-panel-4-large rotate: false - xy: 1303, 407 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 643, 240 + xy: 735, 282 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-darksand-water-medium +block-dark-panel-4-medium rotate: false - xy: 1987, 865 + xy: 945, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-darksand-water-small +block-dark-panel-4-small rotate: false - xy: 1603, 671 + xy: 1165, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-darksand-water-tiny +block-dark-panel-4-tiny rotate: false - xy: 1321, 458 + xy: 1343, 155 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-darksand-water-xlarge +block-dark-panel-4-xlarge rotate: false xy: 1407, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-xlarge +block-dark-panel-5-large + rotate: false + xy: 730, 240 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-5-medium + rotate: false + xy: 945, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-5-small + rotate: false + xy: 1191, 273 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-5-tiny + rotate: false + xy: 1343, 137 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-5-xlarge rotate: false xy: 1457, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-deepwater-large +block-dark-panel-6-large rotate: false - xy: 593, 200 + xy: 730, 198 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-deepwater-medium +block-dark-panel-6-medium rotate: false - xy: 1987, 831 + xy: 1901, 697 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-deepwater-small +block-dark-panel-6-small rotate: false - xy: 1629, 671 + xy: 1191, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-deepwater-tiny +block-dark-panel-6-tiny rotate: false - xy: 1339, 458 + xy: 1343, 119 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-deepwater-xlarge +block-dark-panel-6-xlarge rotate: false xy: 1507, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-differential-generator-large +block-darksand-large rotate: false - xy: 635, 198 + xy: 722, 156 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-differential-generator-medium +block-darksand-medium rotate: false - xy: 1225, 647 + xy: 1859, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-differential-generator-small +block-darksand-small rotate: false - xy: 1973, 729 + xy: 1217, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-differential-generator-tiny +block-darksand-tainted-water-large rotate: false - xy: 1321, 440 + xy: 722, 114 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-medium + rotate: false + xy: 1893, 663 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-small + rotate: false + xy: 1217, 247 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-tiny + rotate: false + xy: 1655, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-differential-generator-xlarge +block-darksand-tainted-water-xlarge rotate: false xy: 1557, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-diode-large +block-darksand-tiny rotate: false - xy: 593, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-diode-medium - rotate: false - xy: 1259, 655 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-diode-small - rotate: false - xy: 1984, 703 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-diode-tiny - rotate: false - xy: 1357, 458 + xy: 1652, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-diode-xlarge +block-darksand-water-large + rotate: false + xy: 785, 326 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-water-medium + rotate: false + xy: 1943, 715 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-water-small + rotate: false + xy: 1009, 221 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-water-tiny + rotate: false + xy: 1673, 324 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-xlarge rotate: false xy: 1607, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-disassembler-large - rotate: false - xy: 635, 156 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-disassembler-medium - rotate: false - xy: 1293, 655 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-disassembler-small - rotate: false - xy: 1984, 677 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-disassembler-tiny - rotate: false - xy: 1339, 440 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-disassembler-xlarge +block-darksand-xlarge rotate: false xy: 1657, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-distributor-large +block-deepwater-large rotate: false - xy: 693, 300 + xy: 827, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-distributor-medium +block-deepwater-medium rotate: false - xy: 1327, 660 + xy: 1935, 681 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-distributor-small +block-deepwater-small rotate: false - xy: 1984, 651 + xy: 1035, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-distributor-tiny +block-deepwater-tiny rotate: false - xy: 1321, 422 + xy: 1670, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-distributor-xlarge +block-deepwater-xlarge rotate: false xy: 1707, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-door-large +block-differential-generator-large rotate: false - xy: 685, 258 + xy: 577, 7 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-door-large-large +block-differential-generator-medium rotate: false - xy: 735, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 1361, 660 + xy: 1927, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-door-large-small +block-differential-generator-small rotate: false - xy: 1977, 763 + xy: 1061, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-door-large-tiny +block-differential-generator-tiny rotate: false - xy: 1375, 458 + xy: 1691, 327 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-door-large-xlarge +block-differential-generator-xlarge rotate: false xy: 1757, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-door-medium +block-diode-large rotate: false - xy: 1531, 743 + xy: 777, 282 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-diode-medium + rotate: false + xy: 1741, 624 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-door-small +block-diode-small rotate: false - xy: 1243, 349 + xy: 1087, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-door-tiny +block-diode-tiny rotate: false - xy: 1357, 440 + xy: 1511, 319 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-door-xlarge +block-diode-xlarge rotate: false xy: 1807, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dunerocks-large +block-dirt-large rotate: false - xy: 777, 284 + xy: 772, 240 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dunerocks-medium +block-dirt-medium rotate: false - xy: 1565, 731 + xy: 1707, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dunerocks-small +block-dirt-small rotate: false - xy: 1243, 323 + xy: 1113, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dunerocks-tiny +block-dirt-tiny rotate: false - xy: 1339, 422 + xy: 1529, 319 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dunerocks-xlarge +block-dirt-wall-large + rotate: false + xy: 772, 198 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dirt-wall-medium + rotate: false + xy: 1741, 590 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-small + rotate: false + xy: 1139, 221 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dirt-wall-tiny + rotate: false + xy: 1547, 319 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dirt-wall-xlarge rotate: false xy: 1857, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-duo-large - rotate: false - xy: 819, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 1599, 731 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 1243, 297 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 1321, 404 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-duo-xlarge +block-dirt-xlarge rotate: false xy: 1907, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-exponential-reconstructor-large +block-disassembler-large rotate: false - xy: 685, 216 + xy: 764, 156 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-exponential-reconstructor-medium +block-disassembler-medium rotate: false - xy: 1633, 731 + xy: 1993, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-exponential-reconstructor-small +block-disassembler-small rotate: false - xy: 1243, 271 + xy: 1165, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-exponential-reconstructor-tiny +block-disassembler-tiny rotate: false - xy: 1375, 440 + xy: 1511, 301 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-exponential-reconstructor-xlarge +block-disassembler-xlarge rotate: false xy: 1957, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-force-projector-large +block-distributor-large rotate: false - xy: 727, 242 + xy: 764, 114 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-force-projector-medium +block-distributor-medium rotate: false - xy: 1667, 731 + xy: 1989, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-force-projector-small +block-distributor-small rotate: false - xy: 1243, 245 + xy: 1191, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-force-projector-tiny +block-distributor-tiny rotate: false - xy: 1357, 422 + xy: 1529, 301 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-force-projector-xlarge +block-distributor-xlarge rotate: false xy: 345, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-fuse-large +block-door-large rotate: false - xy: 769, 242 + xy: 819, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-fuse-medium +block-door-large-large rotate: false - xy: 1701, 731 + xy: 869, 326 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-medium + rotate: false + xy: 1985, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-fuse-small +block-door-large-small rotate: false - xy: 1243, 219 + xy: 1217, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-fuse-tiny +block-door-large-tiny rotate: false - xy: 1339, 404 + xy: 1547, 301 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-fuse-xlarge +block-door-large-xlarge rotate: false xy: 395, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-graphite-press-large +block-door-medium rotate: false - xy: 811, 242 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 1735, 731 + xy: 1977, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-graphite-press-small +block-door-small rotate: false - xy: 1243, 193 + xy: 1005, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-graphite-press-tiny +block-door-tiny rotate: false - xy: 1324, 386 + xy: 1565, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-graphite-press-xlarge +block-door-xlarge rotate: false xy: 445, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-grass-large - rotate: false - xy: 677, 174 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-grass-medium - rotate: false - xy: 1769, 731 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-small - rotate: false - xy: 1243, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-grass-tiny - rotate: false - xy: 1375, 422 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-grass-xlarge - rotate: false - xy: 495, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ground-factory-large - rotate: false - xy: 727, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ground-factory-medium - rotate: false - xy: 1803, 731 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-small - rotate: false - xy: 1243, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ground-factory-tiny - rotate: false - xy: 1357, 404 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ground-factory-xlarge - rotate: false - xy: 545, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hail-large - rotate: false - xy: 769, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hail-medium - rotate: false - xy: 1837, 731 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-small - rotate: false - xy: 1269, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hail-tiny - rotate: false - xy: 1342, 386 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hail-xlarge - rotate: false - xy: 595, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-holostone-large - rotate: false - xy: 811, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-holostone-medium - rotate: false - xy: 1871, 731 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-small - rotate: false - xy: 1269, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-holostone-tiny - rotate: false - xy: 1375, 404 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-holostone-xlarge - rotate: false - xy: 645, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hotrock-large - rotate: false - xy: 677, 132 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hotrock-medium - rotate: false - xy: 1905, 731 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-small - rotate: false - xy: 1269, 300 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hotrock-tiny - rotate: false - xy: 1360, 386 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hotrock-xlarge - rotate: false - xy: 695, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hyper-processor-large - rotate: false - xy: 719, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hyper-processor-medium - rotate: false - xy: 1939, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hyper-processor-small - rotate: false - xy: 1269, 274 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hyper-processor-tiny - rotate: false - xy: 1378, 386 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hyper-processor-xlarge - rotate: false - xy: 101, 478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-large - rotate: false - xy: 761, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-medium - rotate: false - xy: 877, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-small - rotate: false - xy: 1269, 248 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-large - rotate: false - xy: 803, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 872, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 1269, 222 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 1347, 368 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-snow-xlarge - rotate: false - xy: 101, 428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-tiny - rotate: false - xy: 1347, 350 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-xlarge - rotate: false - xy: 101, 378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-icerocks-large - rotate: false - xy: 719, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-icerocks-medium - rotate: false - xy: 869, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-small - rotate: false - xy: 1269, 196 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-icerocks-tiny - rotate: false - xy: 1365, 368 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-icerocks-xlarge - rotate: false - xy: 101, 328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ignarock-large - rotate: false - xy: 761, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ignarock-medium - rotate: false - xy: 1405, 698 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-small - rotate: false - xy: 1269, 170 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ignarock-tiny - rotate: false - xy: 1347, 332 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ignarock-xlarge - rotate: false - xy: 101, 278 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-illuminator-large - rotate: false - xy: 803, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-illuminator-medium - rotate: false - xy: 919, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-illuminator-small - rotate: false - xy: 1269, 144 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-illuminator-tiny - rotate: false - xy: 1365, 350 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-illuminator-xlarge - rotate: false - xy: 101, 228 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-impact-reactor-large - rotate: false - xy: 543, 149 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-impact-reactor-medium - rotate: false - xy: 953, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-small - rotate: false - xy: 1269, 118 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-impact-reactor-tiny - rotate: false - xy: 1347, 314 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-impact-reactor-xlarge - rotate: false - xy: 101, 178 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-incinerator-large - rotate: false - xy: 535, 107 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-incinerator-medium - rotate: false - xy: 987, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-incinerator-small - rotate: false - xy: 1269, 92 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-incinerator-tiny - rotate: false - xy: 1365, 332 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-incinerator-xlarge - rotate: false - xy: 101, 128 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-inverted-sorter-large - rotate: false - xy: 535, 65 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 1021, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 1269, 66 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 1347, 296 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-inverted-sorter-xlarge - rotate: false - xy: 101, 78 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-source-large - rotate: false - xy: 527, 23 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 1055, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 1269, 40 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 1365, 314 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge - rotate: false - xy: 101, 28 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-void-large +block-dune-wall-large rotate: false xy: 861, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-item-void-medium +block-dune-wall-medium rotate: false - xy: 1089, 613 + xy: 1969, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-item-void-small +block-dune-wall-small rotate: false - xy: 1269, 14 + xy: 1005, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-item-void-tiny +block-dune-wall-tiny rotate: false - xy: 1347, 278 + xy: 1583, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-item-void-xlarge +block-dune-wall-xlarge rotate: false - xy: 231, 608 + xy: 495, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-junction-large +block-duo-large rotate: false - xy: 853, 242 + xy: 806, 156 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-junction-medium +block-duo-medium rotate: false - xy: 1123, 613 + xy: 1961, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-junction-small +block-duo-small rotate: false - xy: 1277, 456 + xy: 1031, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-junction-tiny +block-duo-tiny rotate: false - xy: 1365, 296 + xy: 1601, 298 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-junction-xlarge +block-duo-xlarge rotate: false - xy: 231, 558 + xy: 545, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-kiln-large +block-exponential-reconstructor-large rotate: false - xy: 853, 200 + xy: 806, 114 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-kiln-medium +block-exponential-reconstructor-medium rotate: false - xy: 1157, 613 + xy: 1775, 658 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-kiln-small +block-exponential-reconstructor-small rotate: false - xy: 1277, 430 + xy: 1031, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-kiln-tiny +block-exponential-reconstructor-tiny rotate: false - xy: 1347, 260 + xy: 1565, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-kiln-xlarge +block-exponential-reconstructor-xlarge rotate: false - xy: 745, 866 + xy: 595, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-lancer-large +block-force-projector-large rotate: false - xy: 845, 158 + xy: 903, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-lancer-medium +block-force-projector-medium rotate: false - xy: 1191, 613 + xy: 1775, 624 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-lancer-small +block-force-projector-small rotate: false - xy: 1277, 404 + xy: 1057, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-lancer-tiny +block-force-projector-tiny rotate: false - xy: 1365, 278 + xy: 1583, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-lancer-xlarge +block-force-projector-xlarge rotate: false - xy: 151, 508 + xy: 645, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-laser-drill-large - rotate: false - xy: 845, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-laser-drill-medium - rotate: false - xy: 1225, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-laser-drill-small - rotate: false - xy: 1298, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-laser-drill-tiny - rotate: false - xy: 1347, 242 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-laser-drill-xlarge - rotate: false - xy: 151, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-large - rotate: false - xy: 577, 107 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-large - rotate: false - xy: 577, 65 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 1259, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-large-small - rotate: false - xy: 1295, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-large-tiny - rotate: false - xy: 1365, 260 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-large-xlarge - rotate: false - xy: 201, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-medium - rotate: false - xy: 1293, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-small - rotate: false - xy: 1295, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-tiny - rotate: false - xy: 1347, 224 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-xlarge - rotate: false - xy: 151, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-junction-large - rotate: false - xy: 569, 23 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 1327, 626 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-junction-small - rotate: false - xy: 1295, 300 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-junction-tiny - rotate: false - xy: 1365, 242 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-junction-xlarge - rotate: false - xy: 201, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-router-large - rotate: false - xy: 619, 114 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-router-medium - rotate: false - xy: 1361, 626 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-small - rotate: false - xy: 1295, 274 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-router-tiny - rotate: false - xy: 1347, 206 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-router-xlarge - rotate: false - xy: 151, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-source-large - rotate: false - xy: 619, 72 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-source-medium - rotate: false - xy: 916, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-source-small - rotate: false - xy: 1295, 248 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-source-tiny - rotate: false - xy: 1365, 224 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-source-xlarge - rotate: false - xy: 201, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-tank-large - rotate: false - xy: 661, 90 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-tank-medium - rotate: false - xy: 950, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-small - rotate: false - xy: 1295, 222 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-tank-tiny - rotate: false - xy: 1347, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-tank-xlarge - rotate: false - xy: 151, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-void-large - rotate: false - xy: 661, 48 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-void-medium - rotate: false - xy: 984, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-void-small - rotate: false - xy: 1295, 196 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-void-tiny - rotate: false - xy: 1365, 206 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-void-xlarge - rotate: false - xy: 201, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-display-large - rotate: false - xy: 619, 30 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-display-medium - rotate: false - xy: 1018, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-display-small - rotate: false - xy: 1295, 170 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-display-tiny - rotate: false - xy: 1347, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-display-xlarge - rotate: false - xy: 151, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-processor-large - rotate: false - xy: 703, 74 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-processor-medium - rotate: false - xy: 1052, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-processor-small - rotate: false - xy: 1295, 144 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-processor-tiny - rotate: false - xy: 1365, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-processor-xlarge - rotate: false - xy: 201, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-magmarock-large - rotate: false - xy: 745, 74 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 1086, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 1295, 118 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 1347, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 151, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 787, 74 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 1120, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 1295, 92 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 1365, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 201, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 829, 74 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 1154, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 1295, 66 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 1347, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 151, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 703, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 1188, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 1295, 40 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 1365, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 201, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 745, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 1222, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 1295, 14 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 1347, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 151, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large - rotate: false - xy: 787, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-melter-medium - rotate: false - xy: 915, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-melter-small - rotate: false - xy: 1321, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-melter-tiny - rotate: false - xy: 1365, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-melter-xlarge - rotate: false - xy: 201, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-memory-cell-large - rotate: false - xy: 829, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-memory-cell-medium - rotate: false - xy: 949, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-memory-cell-small - rotate: false - xy: 1321, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-memory-cell-tiny - rotate: false - xy: 1347, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-memory-cell-xlarge - rotate: false - xy: 151, 58 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mend-projector-large - rotate: false - xy: 661, 6 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mend-projector-medium - rotate: false - xy: 983, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mend-projector-small - rotate: false - xy: 1321, 300 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mend-projector-tiny - rotate: false - xy: 1365, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mend-projector-xlarge - rotate: false - xy: 201, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mender-large - rotate: false - xy: 871, 74 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mender-medium - rotate: false - xy: 1017, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mender-small - rotate: false - xy: 1321, 274 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mender-tiny - rotate: false - xy: 1347, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mender-xlarge - rotate: false - xy: 201, 58 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-message-large - rotate: false - xy: 871, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-message-medium - rotate: false - xy: 1051, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-message-small - rotate: false - xy: 1321, 248 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-message-tiny - rotate: false - xy: 1365, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-message-xlarge - rotate: false - xy: 251, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-2-large - rotate: false - xy: 895, 242 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-2-medium - rotate: false - xy: 1085, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-2-small - rotate: false - xy: 1321, 222 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-2-tiny - rotate: false - xy: 1347, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-2-xlarge - rotate: false - xy: 251, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-3-large - rotate: false - xy: 895, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-3-medium - rotate: false - xy: 1119, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-3-small - rotate: false - xy: 1321, 196 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-3-tiny - rotate: false - xy: 1365, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-3-xlarge - rotate: false - xy: 251, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-5-large - rotate: false - xy: 887, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-5-medium - rotate: false - xy: 1153, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-5-small - rotate: false - xy: 1321, 170 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-5-tiny - rotate: false - xy: 1347, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-5-xlarge - rotate: false - xy: 251, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-large - rotate: false - xy: 887, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-medium - rotate: false - xy: 1187, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-small - rotate: false - xy: 1321, 144 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-tiny - rotate: false - xy: 1365, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-xlarge - rotate: false - xy: 251, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-large - rotate: false - xy: 913, 74 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-medium - rotate: false - xy: 1221, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-small - rotate: false - xy: 1321, 118 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-tiny - rotate: false - xy: 1347, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-xlarge - rotate: false - xy: 251, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-micro-processor-large - rotate: false - xy: 913, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-micro-processor-medium - rotate: false - xy: 911, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-micro-processor-small - rotate: false - xy: 1321, 92 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-micro-processor-tiny - rotate: false - xy: 1365, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-micro-processor-xlarge - rotate: false - xy: 251, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-moss-large - rotate: false - xy: 929, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-moss-medium - rotate: false - xy: 911, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-small - rotate: false - xy: 1321, 66 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-moss-tiny - rotate: false - xy: 1365, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-moss-xlarge - rotate: false - xy: 251, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multi-press-large - rotate: false - xy: 929, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multi-press-medium - rotate: false - xy: 945, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multi-press-small - rotate: false - xy: 1321, 40 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multi-press-tiny - rotate: false - xy: 1383, 368 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multi-press-xlarge - rotate: false - xy: 251, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-large - rotate: false - xy: 955, 74 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-medium - rotate: false - xy: 911, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-small - rotate: false - xy: 1321, 14 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-tiny - rotate: false - xy: 1383, 350 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-xlarge - rotate: false - xy: 251, 58 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-naval-factory-large - rotate: false - xy: 955, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-naval-factory-medium - rotate: false - xy: 979, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-naval-factory-small - rotate: false - xy: 1770, 667 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-naval-factory-tiny - rotate: false - xy: 1383, 332 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-naval-factory-xlarge - rotate: false - xy: 151, 8 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-oil-extractor-large +block-foreshadow-large rotate: false xy: 821, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-oil-extractor-medium +block-foreshadow-medium rotate: false - xy: 945, 477 + xy: 1775, 590 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-oil-extractor-small +block-foreshadow-small rotate: false - xy: 1796, 667 + xy: 1057, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-oil-extractor-tiny +block-foreshadow-tiny rotate: false - xy: 1383, 314 + xy: 1601, 280 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-oil-extractor-xlarge +block-foreshadow-xlarge rotate: false - xy: 201, 8 + xy: 695, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-coal-large +block-fuse-large rotate: false xy: 863, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-coal-medium +block-fuse-medium rotate: false - xy: 1013, 511 + xy: 1809, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-coal-small +block-fuse-small rotate: false - xy: 1822, 653 + xy: 1083, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-coal-tiny +block-fuse-tiny rotate: false - xy: 1383, 296 + xy: 1619, 293 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-coal-xlarge +block-fuse-xlarge rotate: false - xy: 251, 8 + xy: 101, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-copper-large +block-graphite-press-large rotate: false xy: 905, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-copper-medium +block-graphite-press-medium rotate: false - xy: 979, 477 + xy: 1809, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-copper-small +block-graphite-press-small rotate: false - xy: 1848, 653 + xy: 1083, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-copper-tiny +block-graphite-press-tiny rotate: false - xy: 1383, 278 + xy: 1619, 275 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-copper-xlarge +block-graphite-press-xlarge rotate: false - xy: 281, 619 + xy: 101, 428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-lead-large +block-grass-large rotate: false xy: 947, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-lead-medium +block-grass-medium rotate: false - xy: 945, 443 + xy: 1809, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-lead-small +block-grass-small rotate: false - xy: 1874, 653 + xy: 1109, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-lead-tiny +block-grass-tiny rotate: false - xy: 1383, 260 + xy: 1361, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-lead-xlarge +block-grass-xlarge rotate: false - xy: 281, 569 + xy: 101, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-scrap-large +block-ground-factory-large rotate: false xy: 989, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-scrap-medium +block-ground-factory-medium rotate: false - xy: 1047, 511 + xy: 1843, 641 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-scrap-small +block-ground-factory-small rotate: false - xy: 1900, 653 + xy: 1109, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-scrap-tiny +block-ground-factory-tiny rotate: false - xy: 1383, 242 + xy: 1361, 173 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-scrap-xlarge +block-ground-factory-xlarge rotate: false - xy: 301, 519 + xy: 101, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-thorium-large +block-hail-large rotate: false xy: 1031, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-thorium-medium +block-hail-medium rotate: false - xy: 1013, 477 + xy: 1843, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-thorium-small +block-hail-small rotate: false - xy: 1926, 643 + xy: 1135, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-thorium-tiny +block-hail-tiny rotate: false - xy: 1383, 224 + xy: 1361, 155 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-thorium-xlarge +block-hail-xlarge rotate: false - xy: 301, 469 + xy: 101, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-titanium-large +block-hotrock-large rotate: false xy: 1073, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-titanium-medium +block-hotrock-medium rotate: false - xy: 979, 443 + xy: 1843, 573 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-titanium-small +block-hotrock-small rotate: false - xy: 1952, 643 + xy: 1135, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-titanium-tiny +block-hotrock-tiny rotate: false - xy: 1383, 206 + xy: 1361, 137 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-titanium-xlarge +block-hotrock-xlarge rotate: false - xy: 301, 419 + xy: 101, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-dome-large +block-hyper-processor-large rotate: false xy: 1115, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-dome-medium +block-hyper-processor-medium rotate: false - xy: 1081, 511 + xy: 1877, 629 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-dome-small +block-hyper-processor-small rotate: false - xy: 1395, 668 + xy: 1161, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-dome-tiny +block-hyper-processor-tiny rotate: false - xy: 1383, 188 + xy: 1361, 119 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-dome-xlarge +block-hyper-processor-xlarge rotate: false - xy: 301, 369 + xy: 101, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-projector-large +block-ice-large rotate: false xy: 1157, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-projector-medium +block-ice-medium rotate: false - xy: 1047, 477 + xy: 1877, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-projector-small +block-ice-small rotate: false - xy: 1395, 642 + xy: 1161, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-projector-tiny - rotate: false - xy: 1383, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-projector-xlarge - rotate: false - xy: 301, 319 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overflow-gate-large +block-ice-snow-large rotate: false xy: 1199, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overflow-gate-medium +block-ice-snow-medium rotate: false - xy: 1013, 443 + xy: 1877, 561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overflow-gate-small +block-ice-snow-small rotate: false - xy: 1395, 616 + xy: 1187, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overflow-gate-tiny +block-ice-snow-tiny rotate: false - xy: 1383, 152 + xy: 1366, 101 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overflow-gate-xlarge +block-ice-snow-xlarge rotate: false - xy: 301, 269 + xy: 101, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-parallax-large +block-ice-tiny + rotate: false + xy: 1379, 199 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-wall-large rotate: false xy: 1241, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-parallax-medium +block-ice-wall-medium rotate: false - xy: 1115, 511 + xy: 1911, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-parallax-small +block-ice-wall-small rotate: false - xy: 1421, 672 + xy: 1187, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-parallax-tiny +block-ice-wall-tiny rotate: false - xy: 1383, 134 + xy: 1379, 181 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-parallax-xlarge +block-ice-wall-xlarge rotate: false - xy: 301, 219 + xy: 101, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-conveyor-large +block-ice-xlarge + rotate: false + xy: 101, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-illuminator-large rotate: false xy: 1283, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-conveyor-medium +block-illuminator-medium rotate: false - xy: 1081, 477 + xy: 1911, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-conveyor-small +block-illuminator-small rotate: false - xy: 1447, 672 + xy: 1213, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-conveyor-tiny +block-illuminator-tiny rotate: false - xy: 1383, 116 + xy: 1379, 163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-conveyor-xlarge +block-illuminator-xlarge rotate: false - xy: 301, 169 + xy: 231, 608 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-router-large +block-impact-reactor-large rotate: false xy: 1325, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-router-medium +block-impact-reactor-medium rotate: false - xy: 1047, 443 + xy: 1945, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-router-small +block-impact-reactor-small rotate: false - xy: 1421, 646 + xy: 1213, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-router-tiny +block-impact-reactor-tiny rotate: false - xy: 1383, 98 + xy: 1379, 145 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-router-xlarge +block-impact-reactor-xlarge rotate: false - xy: 301, 119 + xy: 231, 558 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pebbles-large +block-incinerator-large rotate: false xy: 1367, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pebbles-medium +block-incinerator-medium rotate: false - xy: 1149, 511 + xy: 1945, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pebbles-small +block-incinerator-small rotate: false - xy: 1421, 620 + xy: 1005, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pebbles-tiny +block-incinerator-tiny rotate: false - xy: 1383, 80 + xy: 1379, 127 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pebbles-xlarge +block-incinerator-xlarge rotate: false - xy: 301, 69 + xy: 745, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conduit-large +block-inverted-sorter-large rotate: false xy: 1409, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conduit-medium +block-inverted-sorter-medium rotate: false - xy: 1115, 477 + xy: 1911, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conduit-small +block-inverted-sorter-small rotate: false - xy: 1447, 646 + xy: 1031, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conduit-tiny +block-inverted-sorter-tiny rotate: false - xy: 1383, 62 + xy: 1384, 109 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conduit-xlarge +block-inverted-sorter-xlarge rotate: false - xy: 301, 19 + xy: 151, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conveyor-large +block-item-source-large rotate: false xy: 1451, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conveyor-medium +block-item-source-medium rotate: false - xy: 1081, 443 + xy: 1945, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conveyor-small +block-item-source-small rotate: false - xy: 1473, 650 + xy: 1057, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conveyor-tiny +block-item-source-tiny rotate: false - xy: 1383, 44 + xy: 1384, 91 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conveyor-xlarge +block-item-source-xlarge rotate: false - xy: 795, 878 + xy: 151, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-large +block-item-void-large rotate: false xy: 1493, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-wall-large-large +block-item-void-medium + rotate: false + xy: 1979, 611 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-void-small + rotate: false + xy: 1083, 143 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-item-void-tiny + rotate: false + xy: 1373, 73 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-item-void-xlarge + rotate: false + xy: 201, 508 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-junction-large rotate: false xy: 1535, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-wall-large-medium +block-junction-medium rotate: false - xy: 1183, 511 + xy: 1979, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-wall-large-small +block-junction-small rotate: false - xy: 1499, 650 + xy: 1109, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-wall-large-tiny +block-junction-tiny rotate: false - xy: 1383, 26 + xy: 1391, 73 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-wall-large-xlarge +block-junction-xlarge rotate: false - xy: 309, 816 + xy: 151, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-medium - rotate: false - xy: 1149, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 1447, 620 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1347, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 309, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large +block-kiln-large rotate: false xy: 1577, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-weaver-medium +block-kiln-medium rotate: false - xy: 1115, 443 + xy: 1979, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-weaver-small +block-kiln-small rotate: false - xy: 1473, 624 + xy: 1135, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-weaver-tiny +block-kiln-tiny rotate: false - xy: 1365, 8 + xy: 1383, 55 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-weaver-xlarge +block-kiln-xlarge rotate: false - xy: 359, 816 + xy: 201, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pine-large +block-lancer-large rotate: false xy: 1619, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pine-medium +block-lancer-medium rotate: false - xy: 1217, 511 + xy: 1995, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pine-small +block-lancer-small rotate: false - xy: 1499, 624 + xy: 1161, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pine-tiny +block-lancer-tiny rotate: false - xy: 1383, 8 + xy: 1383, 37 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pine-xlarge +block-lancer-xlarge rotate: false - xy: 309, 716 + xy: 151, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-compressor-large +block-large-logic-display-large rotate: false xy: 1661, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-compressor-medium +block-large-logic-display-medium rotate: false - xy: 1183, 477 + xy: 2003, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-compressor-small +block-large-logic-display-small rotate: false - xy: 1525, 645 + xy: 1187, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-compressor-tiny +block-large-logic-display-tiny rotate: false - xy: 1870, 461 + xy: 1383, 19 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-compressor-xlarge +block-large-logic-display-xlarge rotate: false - xy: 359, 766 + xy: 201, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-conveyor-large +block-laser-drill-large rotate: false xy: 1703, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-conveyor-medium +block-laser-drill-medium rotate: false - xy: 1149, 443 + xy: 2011, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-conveyor-small +block-laser-drill-small rotate: false - xy: 1551, 645 + xy: 1213, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-conveyor-tiny +block-laser-drill-tiny rotate: false - xy: 1888, 461 + xy: 1383, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-conveyor-xlarge +block-laser-drill-xlarge rotate: false - xy: 409, 816 + xy: 151, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-large +block-launch-pad-large rotate: false xy: 1745, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-wall-large-large +block-launch-pad-large-large rotate: false xy: 1787, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-wall-large-medium +block-launch-pad-large-medium rotate: false - xy: 1217, 477 + xy: 2013, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-large-small +block-launch-pad-large-small rotate: false - xy: 1577, 645 + xy: 979, 126 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-large-tiny +block-launch-pad-large-tiny rotate: false - xy: 1999, 743 + xy: 1401, 55 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-large-xlarge +block-launch-pad-large-xlarge rotate: false - xy: 359, 716 + xy: 201, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-medium +block-launch-pad-medium rotate: false - xy: 1183, 443 + xy: 2013, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-small +block-launch-pad-small rotate: false - xy: 1603, 645 + xy: 976, 100 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-tiny +block-launch-pad-tiny rotate: false - xy: 2017, 741 + xy: 1401, 37 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-xlarge +block-launch-pad-xlarge rotate: false - xy: 409, 766 + xy: 151, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plated-conduit-large +block-liquid-junction-large rotate: false xy: 1829, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plated-conduit-medium +block-liquid-junction-medium rotate: false - xy: 1217, 443 + xy: 2013, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plated-conduit-small +block-liquid-junction-small rotate: false - xy: 1629, 645 + xy: 1005, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plated-conduit-tiny +block-liquid-junction-tiny rotate: false - xy: 1398, 548 + xy: 1401, 19 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plated-conduit-xlarge +block-liquid-junction-xlarge rotate: false - xy: 459, 816 + xy: 201, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pneumatic-drill-large +block-liquid-router-large rotate: false xy: 1871, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pneumatic-drill-medium +block-liquid-router-medium rotate: false - xy: 911, 409 + xy: 1536, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pneumatic-drill-small +block-liquid-router-small rotate: false - xy: 1525, 619 + xy: 1031, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pneumatic-drill-tiny +block-liquid-router-tiny rotate: false - xy: 1396, 530 + xy: 1401, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pneumatic-drill-xlarge +block-liquid-router-xlarge rotate: false - xy: 409, 716 + xy: 151, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-large +block-liquid-source-large rotate: false xy: 1913, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-node-large-large +block-liquid-source-medium + rotate: false + xy: 1571, 613 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-source-small + rotate: false + xy: 1057, 117 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-source-tiny + rotate: false + xy: 1703, 561 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-source-xlarge + rotate: false + xy: 201, 258 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-tank-large rotate: false xy: 1955, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-node-large-medium +block-liquid-tank-medium rotate: false - xy: 945, 409 + xy: 1605, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-large-small +block-liquid-tank-small rotate: false - xy: 1551, 619 + xy: 1083, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-large-tiny +block-liquid-tank-tiny rotate: false - xy: 1396, 512 + xy: 1721, 563 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-large-xlarge +block-liquid-tank-xlarge rotate: false - xy: 459, 766 + xy: 151, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-medium - rotate: false - xy: 979, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 1577, 619 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 1396, 494 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 509, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large +block-liquid-void-large rotate: false xy: 845, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-source-medium +block-liquid-void-medium rotate: false - xy: 1013, 409 + xy: 1639, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-source-small +block-liquid-void-small rotate: false - xy: 1603, 619 + xy: 1109, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-source-tiny +block-liquid-void-tiny rotate: false - xy: 1396, 476 + xy: 1688, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-source-xlarge +block-liquid-void-xlarge rotate: false - xy: 459, 716 + xy: 201, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-void-large +block-logic-display-large rotate: false xy: 887, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-void-medium +block-logic-display-medium rotate: false - xy: 1047, 409 + xy: 1673, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-void-small +block-logic-display-small rotate: false - xy: 1629, 619 + xy: 1135, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-void-tiny +block-logic-display-tiny rotate: false - xy: 1393, 458 + xy: 1637, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-void-xlarge +block-logic-display-xlarge rotate: false - xy: 509, 766 + xy: 151, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulse-conduit-large +block-logic-processor-large rotate: false xy: 929, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulse-conduit-medium +block-logic-processor-medium rotate: false - xy: 1081, 409 + xy: 1707, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulse-conduit-small +block-logic-processor-small rotate: false - xy: 1655, 665 + xy: 1161, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulse-conduit-tiny +block-logic-processor-tiny rotate: false - xy: 1393, 440 + xy: 1655, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulse-conduit-xlarge +block-logic-processor-xlarge rotate: false - xy: 559, 816 + xy: 201, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulverizer-large +block-magmarock-large rotate: false xy: 971, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulverizer-medium +block-magmarock-medium rotate: false - xy: 1115, 409 + xy: 1741, 556 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulverizer-small +block-magmarock-small rotate: false - xy: 1681, 665 + xy: 1187, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulverizer-tiny +block-magmarock-tiny rotate: false - xy: 1393, 422 + xy: 1673, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulverizer-xlarge +block-magmarock-xlarge rotate: false - xy: 509, 716 + xy: 151, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pyratite-mixer-large +block-mass-driver-large rotate: false xy: 1013, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pyratite-mixer-medium +block-mass-driver-medium rotate: false - xy: 1149, 409 + xy: 1775, 556 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pyratite-mixer-small +block-mass-driver-small rotate: false - xy: 1655, 639 + xy: 1213, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pyratite-mixer-tiny +block-mass-driver-tiny rotate: false - xy: 1393, 404 + xy: 1691, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pyratite-mixer-xlarge +block-mass-driver-xlarge rotate: false - xy: 559, 766 + xy: 201, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-repair-point-large +block-mechanical-drill-large rotate: false xy: 1055, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-repair-point-medium +block-mechanical-drill-medium rotate: false - xy: 1183, 409 + xy: 1809, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-repair-point-small +block-mechanical-drill-small rotate: false - xy: 1707, 665 + xy: 1002, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-repair-point-tiny +block-mechanical-drill-tiny rotate: false - xy: 1396, 386 + xy: 1637, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-repair-point-xlarge +block-mechanical-drill-xlarge rotate: false - xy: 609, 816 + xy: 201, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-resupply-point-large +block-mechanical-pump-large rotate: false xy: 1097, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-resupply-point-medium +block-mechanical-pump-medium rotate: false - xy: 1217, 409 + xy: 1843, 539 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-resupply-point-small +block-mechanical-pump-small rotate: false - xy: 1681, 639 + xy: 1028, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-resupply-point-tiny +block-mechanical-pump-tiny rotate: false - xy: 1416, 550 + xy: 1655, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-resupply-point-xlarge +block-mechanical-pump-xlarge rotate: false - xy: 559, 716 + xy: 251, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ripple-large +block-meltdown-large rotate: false xy: 1139, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ripple-medium +block-meltdown-medium rotate: false - xy: 906, 375 + xy: 1877, 527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ripple-small +block-meltdown-small rotate: false - xy: 1733, 665 + xy: 1054, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ripple-tiny +block-meltdown-tiny rotate: false - xy: 1434, 550 + xy: 1673, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ripple-xlarge +block-meltdown-xlarge rotate: false - xy: 609, 766 + xy: 251, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rock-large +block-melter-large rotate: false xy: 1181, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rock-medium +block-melter-medium rotate: false - xy: 940, 375 + xy: 1911, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rock-small +block-melter-small rotate: false - xy: 1707, 639 + xy: 1080, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rock-tiny +block-melter-tiny rotate: false - xy: 1452, 550 + xy: 1691, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rock-xlarge +block-melter-xlarge rotate: false - xy: 659, 816 + xy: 251, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rocks-large +block-memory-bank-large rotate: false xy: 1223, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rocks-medium +block-memory-bank-medium rotate: false - xy: 974, 375 + xy: 1945, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rocks-small +block-memory-bank-small rotate: false - xy: 1733, 639 + xy: 1106, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rocks-tiny +block-memory-bank-tiny rotate: false - xy: 1401, 368 + xy: 1721, 545 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rocks-xlarge +block-memory-bank-xlarge rotate: false - xy: 609, 716 + xy: 251, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rotary-pump-large +block-memory-cell-large rotate: false xy: 1265, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rotary-pump-medium +block-memory-cell-medium rotate: false - xy: 1008, 375 + xy: 1979, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rotary-pump-small +block-memory-cell-small rotate: false - xy: 1655, 613 + xy: 1132, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rotary-pump-tiny +block-memory-cell-tiny rotate: false - xy: 1401, 350 + xy: 1739, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rotary-pump-xlarge +block-memory-cell-xlarge rotate: false - xy: 659, 766 + xy: 251, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-router-large +block-mend-projector-large rotate: false xy: 1307, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-router-medium +block-mend-projector-medium rotate: false - xy: 1042, 375 + xy: 2013, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-router-small +block-mend-projector-small rotate: false - xy: 1681, 613 + xy: 1158, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-router-tiny +block-mend-projector-tiny rotate: false - xy: 1401, 332 + xy: 1757, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-router-xlarge +block-mend-projector-xlarge rotate: false - xy: 709, 816 + xy: 251, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rtg-generator-large +block-mender-large rotate: false xy: 1349, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rtg-generator-medium +block-mender-medium rotate: false - xy: 1076, 375 + xy: 1449, 576 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rtg-generator-small +block-mender-small rotate: false - xy: 1707, 613 + xy: 1184, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rtg-generator-tiny +block-mender-tiny rotate: false - xy: 1401, 314 + xy: 1775, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rtg-generator-xlarge +block-mender-xlarge rotate: false - xy: 659, 716 + xy: 251, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salt-large +block-message-large rotate: false xy: 1391, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salt-medium +block-message-medium rotate: false - xy: 1110, 375 + xy: 1570, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salt-small +block-message-small rotate: false - xy: 1733, 613 + xy: 1210, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salt-tiny +block-message-tiny rotate: false - xy: 1401, 296 + xy: 1705, 527 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salt-xlarge +block-message-xlarge rotate: false - xy: 709, 766 + xy: 251, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-saltrocks-large +block-metal-floor-2-large rotate: false xy: 1433, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-saltrocks-medium +block-metal-floor-2-medium rotate: false - xy: 1144, 375 + xy: 1604, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-saltrocks-small +block-metal-floor-2-small rotate: false - xy: 1759, 641 + xy: 1009, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-saltrocks-tiny +block-metal-floor-2-tiny rotate: false - xy: 1401, 278 + xy: 1705, 509 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-saltrocks-xlarge +block-metal-floor-2-xlarge rotate: false - xy: 709, 716 + xy: 251, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salvo-large +block-metal-floor-3-large rotate: false xy: 1475, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salvo-medium +block-metal-floor-3-medium rotate: false - xy: 1178, 375 + xy: 1638, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salvo-small +block-metal-floor-3-small rotate: false - xy: 1785, 641 + xy: 1035, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salvo-tiny +block-metal-floor-3-tiny rotate: false - xy: 1401, 260 + xy: 1704, 491 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salvo-xlarge +block-metal-floor-3-xlarge rotate: false - xy: 759, 816 + xy: 251, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-boulder-large +block-metal-floor-5-large rotate: false xy: 1517, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-boulder-medium +block-metal-floor-5-medium rotate: false - xy: 1212, 375 + xy: 1672, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-boulder-small +block-metal-floor-5-small rotate: false - xy: 1759, 615 + xy: 1061, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-boulder-tiny +block-metal-floor-5-tiny rotate: false - xy: 1401, 242 + xy: 1704, 473 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-boulder-xlarge +block-metal-floor-5-xlarge rotate: false - xy: 759, 766 + xy: 151, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-large +block-metal-floor-damaged-large rotate: false xy: 1559, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-medium +block-metal-floor-damaged-medium rotate: false - xy: 903, 341 + xy: 636, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-small +block-metal-floor-damaged-small rotate: false - xy: 1785, 615 + xy: 1087, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-tiny +block-metal-floor-damaged-tiny rotate: false - xy: 1401, 224 + xy: 1704, 455 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-large +block-metal-floor-damaged-xlarge + rotate: false + xy: 201, 8 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-large rotate: false xy: 1601, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-water-medium +block-metal-floor-medium rotate: false - xy: 937, 341 + xy: 670, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-water-small +block-metal-floor-small rotate: false - xy: 1811, 627 + xy: 1113, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-water-tiny +block-metal-floor-tiny rotate: false - xy: 1401, 206 + xy: 1704, 437 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-xlarge +block-metal-floor-xlarge rotate: false - xy: 759, 716 + xy: 251, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-xlarge - rotate: false - xy: 809, 828 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sandrocks-large +block-micro-processor-large rotate: false xy: 1643, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sandrocks-medium +block-micro-processor-medium rotate: false - xy: 971, 341 + xy: 704, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sandrocks-small +block-micro-processor-small rotate: false - xy: 1837, 627 + xy: 1139, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sandrocks-tiny +block-micro-processor-tiny rotate: false - xy: 1401, 188 + xy: 1704, 419 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sandrocks-xlarge +block-micro-processor-xlarge rotate: false - xy: 809, 778 + xy: 281, 619 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scatter-large +block-moss-large rotate: false xy: 1685, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scatter-medium +block-moss-medium rotate: false - xy: 1005, 341 + xy: 738, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scatter-small +block-moss-small rotate: false - xy: 1863, 627 + xy: 1165, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scatter-tiny +block-moss-tiny rotate: false - xy: 1401, 170 + xy: 1715, 401 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scatter-xlarge +block-moss-xlarge rotate: false - xy: 809, 728 + xy: 281, 569 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scorch-large +block-mud-large rotate: false xy: 1727, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scorch-medium +block-mud-medium rotate: false - xy: 1039, 341 + xy: 772, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scorch-small +block-mud-small rotate: false - xy: 1889, 627 + xy: 1191, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scorch-tiny +block-mud-tiny rotate: false - xy: 1401, 152 + xy: 1715, 383 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scorch-xlarge +block-mud-xlarge rotate: false - xy: 809, 678 + xy: 301, 519 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-large +block-multi-press-large rotate: false xy: 1769, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-medium +block-multi-press-medium rotate: false - xy: 1073, 341 + xy: 806, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-small +block-multi-press-small rotate: false - xy: 1811, 601 + xy: 1217, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-tiny +block-multi-press-tiny rotate: false - xy: 1401, 134 + xy: 1715, 365 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-xlarge +block-multi-press-xlarge rotate: false - xy: 331, 666 + xy: 301, 469 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-huge-large +block-multiplicative-reconstructor-large rotate: false xy: 1811, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-huge-medium +block-multiplicative-reconstructor-medium rotate: false - xy: 1107, 341 + xy: 635, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-huge-small +block-multiplicative-reconstructor-small rotate: false - xy: 1837, 601 + xy: 1447, 341 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-huge-tiny +block-multiplicative-reconstructor-tiny rotate: false - xy: 1401, 116 + xy: 1723, 520 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-huge-xlarge +block-multiplicative-reconstructor-xlarge rotate: false - xy: 331, 616 + xy: 301, 419 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-large +block-naval-factory-large rotate: false xy: 1853, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-large-large +block-naval-factory-medium + rotate: false + xy: 669, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-naval-factory-small + rotate: false + xy: 1236, 91 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-naval-factory-tiny + rotate: false + xy: 1741, 520 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-naval-factory-xlarge + rotate: false + xy: 301, 369 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-oil-extractor-large rotate: false xy: 1895, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-large-medium +block-oil-extractor-medium rotate: false - xy: 1141, 341 + xy: 703, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-large-small +block-oil-extractor-small rotate: false - xy: 1863, 601 + xy: 1243, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-large-tiny +block-oil-extractor-tiny rotate: false - xy: 1401, 98 + xy: 1759, 520 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-large-xlarge +block-oil-extractor-xlarge rotate: false - xy: 381, 666 + xy: 301, 319 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-medium - rotate: false - xy: 1175, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 1889, 601 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 1401, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 381, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-segment-large +block-ore-coal-large rotate: false xy: 1937, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-segment-medium +block-ore-coal-medium rotate: false - xy: 1209, 341 + xy: 737, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-segment-small +block-ore-coal-small rotate: false - xy: 1915, 617 + xy: 1523, 545 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-segment-tiny +block-ore-coal-tiny rotate: false - xy: 1401, 62 + xy: 1777, 520 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-segment-xlarge +block-ore-coal-xlarge rotate: false - xy: 431, 666 + xy: 301, 269 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-separator-large +block-ore-copper-large rotate: false xy: 859, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-separator-medium +block-ore-copper-medium rotate: false - xy: 903, 307 + xy: 771, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-separator-small +block-ore-copper-small rotate: false - xy: 1941, 617 + xy: 1523, 519 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-separator-tiny +block-ore-copper-tiny rotate: false - xy: 1401, 44 + xy: 1723, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-separator-xlarge +block-ore-copper-xlarge rotate: false - xy: 431, 616 + xy: 301, 219 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-boulder-large +block-ore-lead-large rotate: false xy: 859, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-boulder-medium +block-ore-lead-medium rotate: false - xy: 937, 307 + xy: 805, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-boulder-small +block-ore-lead-small rotate: false - xy: 1915, 591 + xy: 1522, 493 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-boulder-tiny +block-ore-lead-tiny rotate: false - xy: 1401, 26 + xy: 1741, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-boulder-xlarge +block-ore-lead-xlarge rotate: false - xy: 481, 666 + xy: 301, 169 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-large +block-ore-scrap-large rotate: false xy: 901, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-medium +block-ore-scrap-medium rotate: false - xy: 971, 307 + xy: 619, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-small +block-ore-scrap-small rotate: false - xy: 1941, 591 + xy: 1522, 467 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-tiny +block-ore-scrap-tiny rotate: false - xy: 1401, 8 + xy: 1759, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-xlarge +block-ore-scrap-xlarge rotate: false - xy: 481, 616 + xy: 301, 119 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shalerocks-large +block-ore-thorium-large rotate: false xy: 859, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shalerocks-medium +block-ore-thorium-medium rotate: false - xy: 1005, 307 + xy: 653, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shalerocks-small +block-ore-thorium-small rotate: false - xy: 1967, 617 + xy: 1522, 441 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shalerocks-tiny +block-ore-thorium-tiny rotate: false - xy: 1411, 458 + xy: 1777, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shalerocks-xlarge +block-ore-thorium-xlarge rotate: false - xy: 531, 666 + xy: 301, 69 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shock-mine-large +block-ore-titanium-large rotate: false xy: 943, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shock-mine-medium +block-ore-titanium-medium rotate: false - xy: 1039, 307 + xy: 687, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shock-mine-small +block-ore-titanium-small rotate: false - xy: 1967, 591 + xy: 1522, 415 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shock-mine-tiny +block-ore-titanium-tiny rotate: false - xy: 1411, 440 + xy: 1722, 484 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shock-mine-xlarge +block-ore-titanium-xlarge rotate: false - xy: 531, 616 + xy: 301, 19 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shrubs-large +block-overdrive-dome-large rotate: false xy: 901, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shrubs-medium +block-overdrive-dome-medium rotate: false - xy: 1073, 307 + xy: 721, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shrubs-small +block-overdrive-dome-small rotate: false - xy: 1993, 625 + xy: 1515, 389 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shrubs-tiny +block-overdrive-dome-tiny rotate: false - xy: 1411, 422 + xy: 1722, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shrubs-xlarge +block-overdrive-dome-xlarge rotate: false - xy: 581, 666 + xy: 795, 878 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-crucible-large +block-overdrive-projector-large rotate: false xy: 859, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-crucible-medium +block-overdrive-projector-medium rotate: false - xy: 1107, 307 + xy: 755, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-crucible-small +block-overdrive-projector-small rotate: false - xy: 1993, 599 + xy: 1489, 373 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-crucible-tiny +block-overdrive-projector-tiny rotate: false - xy: 1411, 404 + xy: 1740, 484 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-crucible-xlarge +block-overdrive-projector-xlarge rotate: false - xy: 581, 616 + xy: 309, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-smelter-large +block-overflow-gate-large rotate: false xy: 985, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-smelter-medium +block-overflow-gate-medium rotate: false - xy: 1141, 307 + xy: 789, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-smelter-small +block-overflow-gate-small rotate: false - xy: 1993, 573 + xy: 1515, 363 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-smelter-tiny +block-overflow-gate-tiny rotate: false - xy: 1414, 386 + xy: 1722, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-smelter-xlarge +block-overflow-gate-xlarge rotate: false - xy: 631, 666 + xy: 309, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-slag-large +block-parallax-large rotate: false xy: 943, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-slag-medium +block-parallax-medium rotate: false - xy: 1175, 307 + xy: 823, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-slag-small +block-parallax-small rotate: false - xy: 1421, 594 + xy: 1241, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-slag-tiny +block-parallax-tiny rotate: false - xy: 1419, 368 + xy: 1740, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-slag-xlarge +block-parallax-xlarge rotate: false - xy: 631, 616 + xy: 359, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-large +block-payload-conveyor-large rotate: false xy: 901, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snow-medium +block-payload-conveyor-medium rotate: false - xy: 1209, 307 + xy: 839, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snow-pine-large +block-payload-conveyor-small + rotate: false + xy: 1247, 325 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-payload-conveyor-tiny + rotate: false + xy: 1758, 484 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-payload-conveyor-xlarge + rotate: false + xy: 309, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-payload-router-large rotate: false xy: 859, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snow-pine-medium +block-payload-router-medium rotate: false - xy: 937, 273 + xy: 840, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snow-pine-small +block-payload-router-small rotate: false - xy: 1447, 594 + xy: 1243, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-pine-tiny +block-payload-router-tiny rotate: false - xy: 1419, 350 + xy: 1722, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-pine-xlarge +block-payload-router-xlarge rotate: false - xy: 681, 666 + xy: 359, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-small - rotate: false - xy: 1473, 598 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 1419, 332 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 681, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrock-large +block-pebbles-large rotate: false xy: 1027, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snowrock-medium +block-pebbles-medium rotate: false - xy: 971, 273 + xy: 857, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snowrock-small +block-pebbles-small rotate: false - xy: 1499, 598 + xy: 1243, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrock-tiny +block-pebbles-tiny rotate: false - xy: 1419, 314 + xy: 1740, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrock-xlarge +block-pebbles-xlarge rotate: false - xy: 731, 666 + xy: 409, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snowrocks-large +block-phase-conduit-large rotate: false xy: 985, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snowrocks-medium +block-phase-conduit-medium rotate: false - xy: 937, 239 + xy: 873, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snowrocks-small +block-phase-conduit-small rotate: false - xy: 1525, 593 + xy: 1243, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrocks-tiny +block-phase-conduit-tiny rotate: false - xy: 1419, 296 + xy: 1758, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrocks-xlarge +block-phase-conduit-xlarge rotate: false - xy: 731, 616 + xy: 359, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-large +block-phase-conveyor-large rotate: false xy: 943, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-solar-panel-large-large +block-phase-conveyor-medium + rotate: false + xy: 891, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conveyor-small + rotate: false + xy: 1239, 195 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conveyor-tiny + rotate: false + xy: 1776, 484 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conveyor-xlarge + rotate: false + xy: 409, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-large rotate: false xy: 901, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-solar-panel-large-medium - rotate: false - xy: 971, 239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 1551, 593 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 1419, 278 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 781, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 1005, 273 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 1577, 593 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 1419, 260 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 831, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large +block-phase-wall-large-large rotate: false xy: 1069, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sorter-medium +block-phase-wall-large-medium rotate: false - xy: 937, 205 + xy: 814, 248 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sorter-small +block-phase-wall-large-small rotate: false - xy: 1603, 593 + xy: 1239, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sorter-tiny +block-phase-wall-large-tiny rotate: false - xy: 1419, 242 + xy: 1740, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sorter-xlarge +block-phase-wall-large-xlarge rotate: false - xy: 781, 578 + xy: 459, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spawn-large +block-phase-wall-medium + rotate: false + xy: 814, 214 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-small + rotate: false + xy: 1239, 143 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-tiny + rotate: false + xy: 1758, 448 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-xlarge + rotate: false + xy: 409, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-weaver-large rotate: false xy: 1027, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spawn-medium +block-phase-weaver-medium rotate: false - xy: 971, 205 + xy: 848, 250 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spawn-small +block-phase-weaver-small rotate: false - xy: 1629, 593 + xy: 1239, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spawn-tiny +block-phase-weaver-tiny rotate: false - xy: 1419, 224 + xy: 1776, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spawn-xlarge +block-phase-weaver-xlarge rotate: false - xy: 831, 578 + xy: 459, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spectre-large +block-pine-large rotate: false xy: 985, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spectre-medium +block-pine-medium rotate: false - xy: 1005, 239 + xy: 848, 216 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spectre-small +block-pine-small rotate: false - xy: 1655, 587 + xy: 1273, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spectre-tiny +block-pine-tiny rotate: false - xy: 1419, 206 + xy: 1758, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spectre-xlarge +block-pine-xlarge rotate: false - xy: 351, 566 + xy: 509, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-cluster-large +block-plastanium-compressor-large rotate: false xy: 943, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-cluster-medium +block-plastanium-compressor-medium rotate: false - xy: 1039, 273 + xy: 882, 250 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-cluster-small +block-plastanium-compressor-small rotate: false - xy: 1681, 587 + xy: 1267, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-cluster-tiny +block-plastanium-compressor-tiny rotate: false - xy: 1419, 188 + xy: 1776, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-cluster-xlarge +block-plastanium-compressor-xlarge rotate: false - xy: 351, 516 + xy: 459, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-moss-large +block-plastanium-conveyor-large rotate: false xy: 901, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-moss-medium +block-plastanium-conveyor-medium rotate: false - xy: 1005, 205 + xy: 882, 216 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-moss-small +block-plastanium-conveyor-small rotate: false - xy: 1707, 587 + xy: 1269, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-moss-tiny +block-plastanium-conveyor-tiny rotate: false - xy: 1419, 170 + xy: 1776, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-moss-xlarge +block-plastanium-conveyor-xlarge rotate: false - xy: 401, 566 + xy: 509, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-pine-large +block-plastanium-wall-large rotate: false xy: 1111, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-pine-medium - rotate: false - xy: 1039, 239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-pine-small - rotate: false - xy: 1733, 587 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-pine-tiny - rotate: false - xy: 1419, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-pine-xlarge - rotate: false - xy: 351, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-press-large +block-plastanium-wall-large-large rotate: false xy: 1069, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-press-medium +block-plastanium-wall-large-medium rotate: false - xy: 1073, 273 + xy: 916, 250 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-press-small +block-plastanium-wall-large-small rotate: false - xy: 1759, 589 + xy: 1269, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-press-tiny +block-plastanium-wall-large-tiny rotate: false - xy: 1419, 134 + xy: 1733, 412 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-press-xlarge +block-plastanium-wall-large-xlarge rotate: false - xy: 401, 516 + xy: 559, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sporerocks-large +block-plastanium-wall-medium + rotate: false + xy: 916, 216 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-small + rotate: false + xy: 1269, 221 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-wall-tiny + rotate: false + xy: 1733, 394 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-wall-xlarge + rotate: false + xy: 509, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plated-conduit-large rotate: false xy: 1027, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sporerocks-medium +block-plated-conduit-medium rotate: false - xy: 1039, 205 + xy: 848, 182 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sporerocks-small +block-plated-conduit-small rotate: false - xy: 1785, 589 + xy: 1265, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sporerocks-tiny +block-plated-conduit-tiny rotate: false - xy: 1419, 116 + xy: 1751, 412 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sporerocks-xlarge +block-plated-conduit-xlarge rotate: false - xy: 451, 566 + xy: 559, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-stone-large +block-pneumatic-drill-large rotate: false xy: 985, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-stone-medium +block-pneumatic-drill-medium rotate: false - xy: 1073, 239 + xy: 848, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-stone-small +block-pneumatic-drill-small rotate: false - xy: 1811, 575 + xy: 1265, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-stone-tiny +block-pneumatic-drill-tiny rotate: false - xy: 1419, 98 + xy: 1733, 376 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-stone-xlarge +block-pneumatic-drill-xlarge rotate: false - xy: 351, 416 + xy: 609, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-tower-large +block-power-node-large rotate: false xy: 943, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-tower-medium - rotate: false - xy: 1107, 273 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 1837, 575 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 1419, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 401, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large +block-power-node-large-large rotate: false xy: 1153, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-large +block-power-node-large-medium + rotate: false + xy: 848, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-large-small + rotate: false + xy: 1265, 143 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-large-tiny + rotate: false + xy: 1751, 394 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-large-xlarge + rotate: false + xy: 559, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-medium + rotate: false + xy: 874, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-small + rotate: false + xy: 1265, 117 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-tiny + rotate: false + xy: 1769, 412 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-xlarge + rotate: false + xy: 609, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-source-large rotate: false xy: 1111, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-medium +block-power-source-medium rotate: false - xy: 1073, 205 + xy: 882, 182 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-large-small +block-power-source-small rotate: false - xy: 1863, 575 + xy: 1262, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-large-tiny +block-power-source-tiny rotate: false - xy: 1419, 62 + xy: 1751, 376 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-large-xlarge +block-power-source-xlarge rotate: false - xy: 451, 516 + xy: 659, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-medium - rotate: false - xy: 1107, 239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 1889, 575 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 1419, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 501, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large +block-power-void-large rotate: false xy: 1069, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-swarmer-medium +block-power-void-medium rotate: false - xy: 1141, 273 + xy: 916, 182 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-swarmer-small +block-power-void-small rotate: false - xy: 1915, 565 + xy: 1299, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-swarmer-tiny +block-power-void-tiny rotate: false - xy: 1419, 26 + xy: 1769, 394 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-swarmer-xlarge +block-power-void-xlarge rotate: false - xy: 351, 366 + xy: 609, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-switch-large +block-pulse-conduit-large rotate: false xy: 1027, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-switch-medium +block-pulse-conduit-medium rotate: false - xy: 1107, 205 + xy: 882, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-switch-small +block-pulse-conduit-small rotate: false - xy: 1941, 565 + xy: 1293, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-switch-tiny +block-pulse-conduit-tiny rotate: false - xy: 1419, 8 + xy: 1769, 376 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-switch-xlarge +block-pulse-conduit-xlarge rotate: false - xy: 401, 416 + xy: 659, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tainted-water-large +block-pulverizer-large rotate: false xy: 985, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tainted-water-medium +block-pulverizer-medium rotate: false - xy: 1141, 239 + xy: 882, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tainted-water-small +block-pulverizer-small rotate: false - xy: 1967, 565 + xy: 1295, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tainted-water-tiny +block-pulverizer-tiny rotate: false - xy: 1899, 547 + xy: 1733, 358 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tainted-water-xlarge +block-pulverizer-xlarge rotate: false - xy: 451, 466 + xy: 709, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tar-large +block-pyratite-mixer-large rotate: false xy: 1195, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tar-medium +block-pyratite-mixer-medium rotate: false - xy: 1175, 273 + xy: 916, 148 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tar-small +block-pyratite-mixer-small rotate: false - xy: 1405, 568 + xy: 1295, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tar-tiny +block-pyratite-mixer-tiny rotate: false - xy: 1899, 529 + xy: 1751, 358 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tar-xlarge +block-pyratite-mixer-xlarge rotate: false - xy: 501, 516 + xy: 659, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tendrils-large +block-repair-point-large rotate: false xy: 1153, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tendrils-medium +block-repair-point-medium rotate: false - xy: 1141, 205 + xy: 916, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tendrils-small +block-repair-point-small rotate: false - xy: 1431, 568 + xy: 1295, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tendrils-tiny +block-repair-point-tiny rotate: false - xy: 1917, 547 + xy: 1769, 358 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tendrils-xlarge +block-repair-point-xlarge rotate: false - xy: 551, 566 + xy: 709, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tetrative-reconstructor-large +block-resupply-point-large rotate: false xy: 1111, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tetrative-reconstructor-medium +block-resupply-point-medium rotate: false - xy: 1175, 239 + xy: 908, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tetrative-reconstructor-small +block-resupply-point-small rotate: false - xy: 1457, 568 + xy: 1291, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tetrative-reconstructor-tiny +block-resupply-point-tiny rotate: false - xy: 1899, 511 + xy: 1787, 412 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tetrative-reconstructor-xlarge +block-resupply-point-xlarge rotate: false - xy: 351, 316 + xy: 709, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-generator-large +block-ripple-large rotate: false xy: 1069, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-generator-medium +block-ripple-medium rotate: false - xy: 1209, 273 + xy: 907, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-generator-small +block-ripple-small rotate: false - xy: 1483, 572 + xy: 1291, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-generator-tiny +block-ripple-tiny rotate: false - xy: 1917, 529 + xy: 1787, 394 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-generator-xlarge +block-ripple-xlarge rotate: false - xy: 401, 366 + xy: 759, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-pump-large +block-rotary-pump-large rotate: false xy: 1027, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-pump-medium +block-rotary-pump-medium rotate: false - xy: 1175, 205 + xy: 925, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-pump-small +block-rotary-pump-small rotate: false - xy: 1993, 547 + xy: 1291, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-pump-tiny +block-rotary-pump-tiny rotate: false - xy: 1935, 547 + xy: 1787, 376 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-pump-xlarge +block-rotary-pump-xlarge rotate: false - xy: 451, 416 + xy: 759, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-reactor-large +block-router-large rotate: false xy: 1237, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-reactor-medium +block-router-medium rotate: false - xy: 1209, 239 + xy: 941, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-reactor-small +block-router-small rotate: false - xy: 1509, 567 + xy: 1291, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-reactor-tiny +block-router-tiny rotate: false - xy: 1917, 511 + xy: 1787, 358 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-reactor-xlarge +block-router-xlarge rotate: false - xy: 501, 466 + xy: 759, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-large +block-rtg-generator-large rotate: false xy: 1195, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-large +block-rtg-generator-medium + rotate: false + xy: 942, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rtg-generator-small + rotate: false + xy: 1288, 91 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rtg-generator-tiny + rotate: false + xy: 1794, 484 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rtg-generator-xlarge + rotate: false + xy: 809, 828 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salt-large rotate: false xy: 1153, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-medium +block-salt-medium rotate: false - xy: 1209, 205 + xy: 959, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-large-small +block-salt-small rotate: false - xy: 1535, 567 + xy: 1269, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-large-tiny +block-salt-tiny rotate: false - xy: 1935, 529 + xy: 1794, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-large-xlarge - rotate: false - xy: 551, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-medium - rotate: false - xy: 971, 171 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 1561, 567 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-tiny - rotate: false - xy: 1953, 547 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-xlarge - rotate: false - xy: 601, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thruster-large +block-salt-wall-large rotate: false xy: 1111, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thruster-medium +block-salt-wall-medium rotate: false - xy: 971, 137 + xy: 975, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thruster-small +block-salt-wall-small rotate: false - xy: 1587, 567 + xy: 1325, 331 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thruster-tiny +block-salt-wall-tiny rotate: false - xy: 1935, 511 + xy: 1794, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thruster-xlarge +block-salt-wall-xlarge rotate: false - xy: 351, 266 + xy: 809, 778 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-conveyor-large +block-salt-xlarge + rotate: false + xy: 809, 728 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salvo-large rotate: false xy: 1069, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-conveyor-medium +block-salvo-medium rotate: false - xy: 1005, 171 + xy: 993, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-conveyor-small +block-salvo-small rotate: false - xy: 1613, 567 + xy: 1351, 331 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-conveyor-tiny +block-salvo-tiny rotate: false - xy: 1953, 529 + xy: 1794, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-conveyor-xlarge +block-salvo-xlarge rotate: false - xy: 401, 316 + xy: 809, 678 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-large +block-sand-boulder-large rotate: false xy: 1279, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-wall-large-large +block-sand-boulder-medium + rotate: false + xy: 1533, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-boulder-small + rotate: false + xy: 1295, 65 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-boulder-tiny + rotate: false + xy: 1805, 412 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-boulder-xlarge + rotate: false + xy: 331, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-large rotate: false xy: 1237, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-wall-large-medium +block-sand-medium rotate: false - xy: 1005, 137 + xy: 1483, 563 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-large-small +block-sand-small rotate: false - xy: 1483, 546 + xy: 1377, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-large-tiny +block-sand-tiny rotate: false - xy: 1971, 547 + xy: 1805, 394 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-large-xlarge - rotate: false - xy: 451, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-medium - rotate: false - xy: 1039, 171 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-small - rotate: false - xy: 1509, 541 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-tiny - rotate: false - xy: 1953, 511 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-xlarge - rotate: false - xy: 501, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-turbine-generator-large +block-sand-wall-large rotate: false xy: 1195, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-turbine-generator-medium +block-sand-wall-medium rotate: false - xy: 1039, 137 + xy: 1567, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-turbine-generator-small +block-sand-wall-small rotate: false - xy: 1535, 541 + xy: 1314, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-turbine-generator-tiny +block-sand-wall-tiny rotate: false - xy: 1971, 529 + xy: 1805, 376 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-turbine-generator-xlarge +block-sand-wall-xlarge rotate: false - xy: 551, 466 + xy: 331, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-underflow-gate-large +block-sand-water-large rotate: false xy: 1153, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-underflow-gate-medium +block-sand-water-medium rotate: false - xy: 1073, 171 + xy: 1601, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-underflow-gate-small +block-sand-water-small rotate: false - xy: 1561, 541 + xy: 1321, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-underflow-gate-tiny +block-sand-water-tiny rotate: false - xy: 1971, 511 + xy: 1805, 358 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-underflow-gate-xlarge +block-sand-water-xlarge rotate: false - xy: 601, 516 + xy: 381, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-unloader-large +block-sand-xlarge + rotate: false + xy: 381, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scatter-large rotate: false xy: 1111, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-unloader-medium +block-scatter-medium rotate: false - xy: 1073, 137 + xy: 1635, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-unloader-small +block-scatter-small rotate: false - xy: 1587, 541 + xy: 1549, 519 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-unloader-tiny +block-scatter-tiny rotate: false - xy: 1989, 529 + xy: 1391, 287 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-unloader-xlarge +block-scatter-xlarge rotate: false - xy: 651, 566 + xy: 431, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-vault-large +block-scorch-large rotate: false xy: 1321, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-vault-medium +block-scorch-medium rotate: false - xy: 1107, 171 + xy: 1669, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-vault-small +block-scorch-small rotate: false - xy: 1613, 541 + xy: 1548, 493 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-vault-tiny +block-scorch-tiny rotate: false - xy: 1989, 511 + xy: 1391, 269 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-vault-xlarge +block-scorch-xlarge rotate: false - xy: 351, 216 + xy: 431, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-extractor-large +block-scrap-wall-gigantic-large rotate: false xy: 1279, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-extractor-medium +block-scrap-wall-gigantic-medium rotate: false - xy: 1107, 137 + xy: 979, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-extractor-small +block-scrap-wall-gigantic-small rotate: false - xy: 1639, 561 + xy: 1575, 519 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-extractor-tiny +block-scrap-wall-gigantic-tiny rotate: false - xy: 2007, 529 + xy: 1391, 251 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-extractor-xlarge +block-scrap-wall-gigantic-xlarge rotate: false - xy: 401, 266 + xy: 481, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-large +block-scrap-wall-huge-large rotate: false xy: 1237, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-medium +block-scrap-wall-huge-medium rotate: false - xy: 1141, 171 + xy: 979, 503 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-small +block-scrap-wall-huge-small rotate: false - xy: 1665, 561 + xy: 1548, 467 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-tiny +block-scrap-wall-huge-tiny rotate: false - xy: 2007, 511 + xy: 1391, 233 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-xlarge +block-scrap-wall-huge-xlarge rotate: false - xy: 451, 316 + xy: 481, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wave-large +block-scrap-wall-large rotate: false xy: 1195, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-wave-medium - rotate: false - xy: 1141, 137 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wave-small - rotate: false - xy: 1691, 561 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wave-tiny - rotate: false - xy: 1906, 493 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wave-xlarge - rotate: false - xy: 501, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-dead-large +block-scrap-wall-large-large rotate: false xy: 1153, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-dead-medium +block-scrap-wall-large-medium rotate: false - xy: 1175, 171 + xy: 979, 469 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-dead-small +block-scrap-wall-large-small rotate: false - xy: 1717, 561 + xy: 1574, 493 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-dead-tiny +block-scrap-wall-large-tiny rotate: false - xy: 1906, 475 + xy: 1409, 292 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-dead-xlarge +block-scrap-wall-large-xlarge rotate: false - xy: 551, 416 + xy: 531, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-large +block-scrap-wall-medium + rotate: false + xy: 979, 435 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-small + rotate: false + xy: 1601, 519 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-tiny + rotate: false + xy: 1409, 274 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-xlarge + rotate: false + xy: 531, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-segment-large rotate: false xy: 1363, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-medium +block-segment-medium rotate: false - xy: 1175, 137 + xy: 979, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-small +block-segment-small rotate: false - xy: 1639, 535 + xy: 1548, 441 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-tiny +block-segment-tiny rotate: false - xy: 1924, 493 + xy: 1409, 256 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-xlarge +block-segment-xlarge + rotate: false + xy: 581, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-separator-large + rotate: false + xy: 1321, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-separator-medium + rotate: false + xy: 1013, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-separator-small + rotate: false + xy: 1574, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-separator-tiny + rotate: false + xy: 1409, 238 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-separator-xlarge + rotate: false + xy: 581, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-boulder-large + rotate: false + xy: 1279, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-boulder-medium + rotate: false + xy: 1047, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-boulder-small + rotate: false + xy: 1600, 493 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-boulder-tiny + rotate: false + xy: 1427, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-boulder-xlarge + rotate: false + xy: 631, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-large + rotate: false + xy: 1237, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-medium + rotate: false + xy: 1013, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-small + rotate: false + xy: 1627, 519 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-tiny + rotate: false + xy: 1445, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-wall-large + rotate: false + xy: 1195, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-wall-medium + rotate: false + xy: 1081, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-wall-small + rotate: false + xy: 1548, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-wall-tiny + rotate: false + xy: 1427, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-wall-xlarge + rotate: false + xy: 631, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-xlarge + rotate: false + xy: 681, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shock-mine-large + rotate: false + xy: 1405, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shock-mine-medium + rotate: false + xy: 1013, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shock-mine-small + rotate: false + xy: 1541, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shock-mine-tiny + rotate: false + xy: 1463, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shock-mine-xlarge + rotate: false + xy: 681, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shrubs-large + rotate: false + xy: 1363, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shrubs-medium + rotate: false + xy: 1047, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-small + rotate: false + xy: 1574, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shrubs-tiny + rotate: false + xy: 1427, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shrubs-xlarge + rotate: false + xy: 731, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-silicon-crucible-large + rotate: false + xy: 1321, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-silicon-crucible-medium + rotate: false + xy: 1115, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-crucible-small + rotate: false + xy: 1600, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-silicon-crucible-tiny + rotate: false + xy: 1445, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-silicon-crucible-xlarge + rotate: false + xy: 731, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-silicon-smelter-large + rotate: false + xy: 1279, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-silicon-smelter-medium + rotate: false + xy: 1013, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-smelter-small + rotate: false + xy: 1626, 493 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-silicon-smelter-tiny + rotate: false + xy: 1481, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-silicon-smelter-xlarge + rotate: false + xy: 781, 628 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-slag-large + rotate: false + xy: 1237, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-slag-medium + rotate: false + xy: 1047, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-slag-small + rotate: false + xy: 1653, 519 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-slag-tiny + rotate: false + xy: 1445, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-slag-xlarge + rotate: false + xy: 831, 628 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-boulder-large + rotate: false + xy: 1447, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-boulder-medium + rotate: false + xy: 1081, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-boulder-small + rotate: false + xy: 1541, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-boulder-tiny + rotate: false + xy: 1463, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-boulder-xlarge + rotate: false + xy: 781, 578 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-large + rotate: false + xy: 1405, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-medium + rotate: false + xy: 1149, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-large + rotate: false + xy: 1363, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-pine-medium + rotate: false + xy: 1013, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-small + rotate: false + xy: 1574, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-pine-tiny + rotate: false + xy: 1463, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-pine-xlarge + rotate: false + xy: 831, 578 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-small + rotate: false + xy: 1567, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-tiny + rotate: false + xy: 1481, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-wall-large + rotate: false + xy: 1321, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-wall-medium + rotate: false + xy: 1047, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-small + rotate: false + xy: 1600, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-wall-tiny + rotate: false + xy: 1481, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-wall-xlarge + rotate: false + xy: 351, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-xlarge + rotate: false + xy: 351, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-large + rotate: false + xy: 1279, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-large + rotate: false + xy: 1489, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-medium + rotate: false + xy: 1081, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-large-small + rotate: false + xy: 1626, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-large-tiny + rotate: false + xy: 1427, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-large-xlarge + rotate: false + xy: 401, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-medium + rotate: false + xy: 1115, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-small + rotate: false + xy: 1652, 493 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-tiny + rotate: false + xy: 1445, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-xlarge + rotate: false + xy: 351, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sorter-large + rotate: false + xy: 1447, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sorter-medium + rotate: false + xy: 1183, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sorter-small + rotate: false + xy: 1567, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sorter-tiny + rotate: false + xy: 1463, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sorter-xlarge + rotate: false + xy: 401, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-space-large + rotate: false + xy: 1405, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-space-medium + rotate: false + xy: 1047, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-space-small + rotate: false + xy: 1600, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-space-tiny + rotate: false + xy: 1481, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-space-xlarge + rotate: false + xy: 451, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spawn-large + rotate: false + xy: 1363, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spawn-medium + rotate: false + xy: 1081, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spawn-small + rotate: false + xy: 1593, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spawn-tiny + rotate: false + xy: 1409, 220 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spawn-xlarge + rotate: false + xy: 351, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spectre-large + rotate: false + xy: 1321, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spectre-medium + rotate: false + xy: 1115, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-small + rotate: false + xy: 1626, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spectre-tiny + rotate: false + xy: 1427, 215 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spectre-xlarge + rotate: false + xy: 401, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-cluster-large + rotate: false + xy: 1531, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-cluster-medium + rotate: false + xy: 1149, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-small + rotate: false + xy: 1652, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-cluster-tiny + rotate: false + xy: 1445, 215 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-cluster-xlarge + rotate: false + xy: 451, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-moss-large + rotate: false + xy: 1489, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-medium + rotate: false + xy: 1217, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-moss-small + rotate: false + xy: 1593, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-moss-tiny + rotate: false + xy: 1463, 215 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-moss-xlarge + rotate: false + xy: 501, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-pine-large + rotate: false + xy: 1447, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-pine-medium + rotate: false + xy: 1081, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-pine-small + rotate: false + xy: 1626, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-pine-tiny + rotate: false + xy: 1481, 215 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-pine-xlarge + rotate: false + xy: 351, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-press-large + rotate: false + xy: 1405, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-press-medium + rotate: false + xy: 1115, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-small + rotate: false + xy: 1619, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-press-tiny + rotate: false + xy: 1499, 283 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-press-xlarge + rotate: false + xy: 401, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-wall-large + rotate: false + xy: 1363, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-wall-medium + rotate: false + xy: 1149, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-wall-small + rotate: false + xy: 1652, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-wall-tiny + rotate: false + xy: 1517, 283 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-wall-xlarge + rotate: false + xy: 451, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-steam-generator-large + rotate: false + xy: 1573, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-steam-generator-medium + rotate: false + xy: 1183, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-steam-generator-small + rotate: false + xy: 1619, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-steam-generator-tiny + rotate: false + xy: 1499, 265 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-steam-generator-xlarge + rotate: false + xy: 501, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-stone-large + rotate: false + xy: 1531, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-medium + rotate: false + xy: 1251, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-small + rotate: false + xy: 1652, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-tiny + rotate: false + xy: 1535, 283 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-wall-large + rotate: false + xy: 1489, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-wall-medium + rotate: false + xy: 1115, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-small + rotate: false + xy: 1645, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-wall-tiny + rotate: false + xy: 1499, 247 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-wall-xlarge + rotate: false + xy: 551, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-stone-xlarge + rotate: false + xy: 351, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-tower-large + rotate: false + xy: 1447, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-tower-medium + rotate: false + xy: 1149, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-tower-small + rotate: false + xy: 1645, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-tower-tiny + rotate: false + xy: 1517, 265 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-tower-xlarge + rotate: false + xy: 401, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-large + rotate: false + xy: 1405, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-large + rotate: false + xy: 1615, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 1183, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-large-small + rotate: false + xy: 1679, 519 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-large-tiny + rotate: false + xy: 1499, 229 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-large-xlarge + rotate: false + xy: 451, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-medium + rotate: false + xy: 1217, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-small + rotate: false + xy: 1678, 493 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-tiny + rotate: false + xy: 1517, 247 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-xlarge + rotate: false + xy: 501, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-swarmer-large + rotate: false + xy: 1573, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-swarmer-medium + rotate: false + xy: 1285, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-small + rotate: false + xy: 1678, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-swarmer-tiny + rotate: false + xy: 1535, 265 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-swarmer-xlarge + rotate: false + xy: 551, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-switch-large + rotate: false + xy: 1531, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-switch-medium + rotate: false + xy: 1149, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-switch-small + rotate: false + xy: 1678, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-switch-tiny + rotate: false + xy: 1517, 229 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-switch-xlarge + rotate: false + xy: 601, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tainted-water-large + rotate: false + xy: 1489, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tainted-water-medium + rotate: false + xy: 1183, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tainted-water-small + rotate: false + xy: 1678, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tainted-water-tiny + rotate: false + xy: 1535, 247 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tainted-water-xlarge + rotate: false + xy: 351, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tar-large + rotate: false + xy: 1447, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tar-medium + rotate: false + xy: 1217, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tar-small + rotate: false + xy: 1671, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tar-tiny + rotate: false + xy: 1535, 229 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tar-xlarge + rotate: false + xy: 401, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tendrils-large + rotate: false + xy: 1657, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tendrils-medium + rotate: false + xy: 1251, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tendrils-small + rotate: false + xy: 1671, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tendrils-tiny + rotate: false + xy: 1499, 211 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tendrils-xlarge + rotate: false + xy: 451, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-large + rotate: false + xy: 1615, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-medium + rotate: false + xy: 1319, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-small + rotate: false + xy: 1473, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-tiny + rotate: false + xy: 1517, 211 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-xlarge + rotate: false + xy: 501, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-generator-large + rotate: false + xy: 1573, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-generator-medium + rotate: false + xy: 1183, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-generator-small + rotate: false + xy: 1319, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-generator-tiny + rotate: false + xy: 1535, 211 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-generator-xlarge + rotate: false + xy: 551, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-pump-large + rotate: false + xy: 1531, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-pump-medium + rotate: false + xy: 1217, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-pump-small + rotate: false + xy: 1321, 273 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-pump-tiny + rotate: false + xy: 1553, 271 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-pump-xlarge + rotate: false + xy: 601, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-reactor-large + rotate: false + xy: 1489, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-reactor-medium + rotate: false + xy: 1251, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-reactor-small + rotate: false + xy: 1321, 247 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-reactor-tiny + rotate: false + xy: 1571, 271 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-reactor-xlarge + rotate: false + xy: 651, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-large + rotate: false + xy: 1699, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-large + rotate: false + xy: 1657, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 1285, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-large-small + rotate: false + xy: 1321, 221 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-large-tiny + rotate: false + xy: 1553, 253 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-large-xlarge + rotate: false + xy: 351, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-medium + rotate: false + xy: 1353, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-small + rotate: false + xy: 1317, 195 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-tiny + rotate: false + xy: 1553, 235 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-xlarge + rotate: false + xy: 401, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thruster-large + rotate: false + xy: 1615, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thruster-medium + rotate: false + xy: 1217, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thruster-small + rotate: false + xy: 1317, 169 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thruster-tiny + rotate: false + xy: 1571, 253 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thruster-xlarge + rotate: false + xy: 451, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-conveyor-large + rotate: false + xy: 1573, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-conveyor-medium + rotate: false + xy: 1251, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-small + rotate: false + xy: 1317, 143 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-conveyor-tiny + rotate: false + xy: 1553, 217 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-conveyor-xlarge + rotate: false + xy: 501, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-large + rotate: false + xy: 1531, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-large + rotate: false + xy: 1741, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 1285, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-large-small + rotate: false + xy: 1317, 117 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-large-tiny + rotate: false + xy: 1571, 235 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-large-xlarge + rotate: false + xy: 551, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-medium + rotate: false + xy: 1319, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-small + rotate: false + xy: 1345, 305 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-tiny + rotate: false + xy: 1571, 217 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-xlarge rotate: false xy: 601, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +block-tsunami-large + rotate: false + xy: 1699, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tsunami-medium + rotate: false + xy: 1387, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tsunami-small + rotate: false + xy: 1347, 279 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tsunami-tiny + rotate: false + xy: 1589, 262 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tsunami-xlarge + rotate: false + xy: 651, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-underflow-gate-large + rotate: false + xy: 1657, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-underflow-gate-medium + rotate: false + xy: 1251, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-underflow-gate-small + rotate: false + xy: 1347, 253 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-underflow-gate-tiny + rotate: false + xy: 1589, 244 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-underflow-gate-xlarge + rotate: false + xy: 701, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-unloader-large + rotate: false + xy: 1615, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-unloader-medium + rotate: false + xy: 1285, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-unloader-small + rotate: false + xy: 1347, 227 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-unloader-tiny + rotate: false + xy: 1589, 226 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-unloader-xlarge + rotate: false + xy: 351, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-vault-large + rotate: false + xy: 1573, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-vault-medium + rotate: false + xy: 1319, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-small + rotate: false + xy: 1340, 91 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-vault-tiny + rotate: false + xy: 1589, 208 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-vault-xlarge + rotate: false + xy: 401, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-extractor-large + rotate: false + xy: 1783, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-extractor-medium + rotate: false + xy: 1353, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-small + rotate: false + xy: 1347, 65 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-extractor-tiny + rotate: false + xy: 1607, 257 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-extractor-xlarge + rotate: false + xy: 451, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-large + rotate: false + xy: 1741, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-medium + rotate: false + xy: 1285, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-small + rotate: false + xy: 1027, 39 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-tiny + rotate: false + xy: 1607, 239 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-xlarge + rotate: false + xy: 501, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wave-large + rotate: false + xy: 1699, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wave-medium + rotate: false + xy: 1319, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wave-small + rotate: false + xy: 1027, 13 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wave-tiny + rotate: false + xy: 1607, 221 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wave-xlarge + rotate: false + xy: 551, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-dead-large + rotate: false + xy: 1657, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-dead-medium + rotate: false + xy: 1353, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-dead-small + rotate: false + xy: 1053, 39 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-dead-tiny + rotate: false + xy: 1607, 203 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-dead-xlarge + rotate: false + xy: 601, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-large + rotate: false + xy: 1615, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-medium + rotate: false + xy: 1387, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-small + rotate: false + xy: 1053, 13 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-tiny + rotate: false + xy: 1553, 199 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-xlarge + rotate: false + xy: 651, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 button rotate: false - xy: 1763, 862 + xy: 1273, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17818,7 +21149,7 @@ button index: -1 button-disabled rotate: false - xy: 611, 1 + xy: 1007, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17826,7 +21157,7 @@ button-disabled index: -1 button-down rotate: false - xy: 1573, 862 + xy: 1951, 812 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17834,7 +21165,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 1321, 694 + xy: 1007, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17842,7 +21173,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 1447, 736 + xy: 1045, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17850,7 +21181,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 1531, 777 + xy: 1951, 783 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17858,7 +21189,15 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 1573, 833 + xy: 1045, 623 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-disabled + rotate: false + xy: 1045, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17866,7 +21205,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 1611, 862 + xy: 1083, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17874,7 +21213,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 1359, 694 + xy: 1083, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17882,7 +21221,7 @@ button-over index: -1 button-red rotate: false - xy: 1485, 736 + xy: 1121, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17890,7 +21229,7 @@ button-red index: -1 button-right rotate: false - xy: 1649, 833 + xy: 1159, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17898,7 +21237,7 @@ button-right index: -1 button-right-down rotate: false - xy: 1611, 833 + xy: 1121, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17906,7 +21245,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 1649, 862 + xy: 1159, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17914,7 +21253,7 @@ button-right-over index: -1 button-select rotate: false - xy: 1665, 535 + xy: 1079, 39 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -17922,7 +21261,7 @@ button-select index: -1 button-square rotate: false - xy: 1725, 862 + xy: 1235, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17930,7 +21269,7 @@ button-square index: -1 button-square-down rotate: false - xy: 1687, 862 + xy: 1197, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17938,7 +21277,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 1687, 833 + xy: 1197, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17946,7 +21285,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 1725, 833 + xy: 1235, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17954,49 +21293,49 @@ button-trans index: -1 check-disabled rotate: false - xy: 1209, 171 + xy: 1319, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1209, 137 + xy: 1353, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 997, 103 + xy: 1387, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 997, 69 + xy: 1353, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1031, 103 + xy: 1387, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 997, 35 + xy: 1387, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 795, 866 + xy: 1565, 325 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -18010,7 +21349,7 @@ crater index: -1 cursor rotate: false - xy: 1947, 827 + xy: 1319, 351 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -18024,7 +21363,7 @@ discord-banner index: -1 flat-down-base rotate: false - xy: 1763, 833 + xy: 1273, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18039,7 +21378,7 @@ info-banner index: -1 inventory rotate: false - xy: 1691, 519 + xy: 1105, 23 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -18047,147 +21386,147 @@ inventory index: -1 item-blast-compound-icon rotate: false - xy: 997, 1 + xy: 1013, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-icon rotate: false - xy: 1031, 69 + xy: 1047, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-icon rotate: false - xy: 1065, 103 + xy: 1081, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-icon rotate: false - xy: 1031, 35 + xy: 1115, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-icon rotate: false - xy: 1031, 1 + xy: 1149, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-icon rotate: false - xy: 1065, 69 + xy: 1183, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-icon rotate: false - xy: 1099, 103 + xy: 1217, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-icon rotate: false - xy: 1065, 35 + xy: 1251, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-icon rotate: false - xy: 1065, 1 + xy: 1285, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-icon rotate: false - xy: 1099, 69 + xy: 1319, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-icon rotate: false - xy: 1133, 103 + xy: 1353, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-icon rotate: false - xy: 1099, 35 + xy: 1387, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-icon rotate: false - xy: 1099, 1 + xy: 1421, 542 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-icon rotate: false - xy: 1133, 69 + xy: 1421, 508 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-icon rotate: false - xy: 1167, 103 + xy: 1421, 474 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-icon rotate: false - xy: 1133, 35 + xy: 1421, 440 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-icon rotate: false - xy: 1133, 1 + xy: 1421, 406 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-icon rotate: false - xy: 1167, 69 + xy: 1421, 372 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-icon rotate: false - xy: 1201, 103 + xy: 1455, 529 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-icon rotate: false - xy: 1167, 35 + xy: 1455, 495 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-node rotate: false - xy: 1167, 1 + xy: 1455, 461 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18208,7 +21547,7 @@ nomap index: -1 pane rotate: false - xy: 1801, 833 + xy: 1311, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18216,7 +21555,7 @@ pane index: -1 pane-2 rotate: false - xy: 1801, 862 + xy: 1311, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18224,7 +21563,7 @@ pane-2 index: -1 scroll rotate: false - xy: 1743, 550 + xy: 1079, 2 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -18232,7 +21571,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 1, 2 + xy: 43, 2 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -18240,70 +21579,70 @@ scroll-horizontal index: -1 scroll-knob-horizontal-black rotate: false - xy: 393, 6 + xy: 1, 2 size: 40, 24 orig: 40, 24 offset: 0, 0 index: -1 scroll-knob-vertical-black rotate: false - xy: 1717, 519 + xy: 1131, 23 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 2035, 717 + xy: 1697, 228 size: 12, 40 orig: 12, 40 offset: 0, 0 index: -1 selection rotate: false - xy: 1321, 476 + xy: 309, 866 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 743, 416 + xy: 1533, 621 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1677, 691 + xy: 945, 293 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1708, 691 + xy: 976, 293 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1739, 691 + xy: 2017, 901 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 1395, 592 + xy: 1681, 342 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 underline rotate: false - xy: 1915, 862 + xy: 1425, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18311,7 +21650,7 @@ underline index: -1 underline-2 rotate: false - xy: 1839, 862 + xy: 1349, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18319,7 +21658,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 1839, 833 + xy: 1349, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18327,7 +21666,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 1877, 862 + xy: 1387, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18335,7 +21674,7 @@ underline-red index: -1 underline-white rotate: false - xy: 1877, 833 + xy: 1387, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18343,42 +21682,42 @@ underline-white index: -1 unit-alpha-large rotate: false - xy: 1321, 807 + xy: 1825, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-alpha-medium rotate: false - xy: 1201, 69 + xy: 1455, 427 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-alpha-small rotate: false - xy: 1743, 524 + xy: 1157, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-alpha-tiny rotate: false - xy: 1924, 475 + xy: 1571, 199 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-alpha-xlarge rotate: false - xy: 651, 516 + xy: 701, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-antumbra-large rotate: false - xy: 881, 639 + xy: 1979, 891 size: 36, 40 orig: 36, 40 offset: 0, 0 @@ -18392,833 +21731,1008 @@ unit-antumbra-medium index: -1 unit-antumbra-small rotate: false - xy: 1847, 471 + xy: 511, 6 size: 21, 24 orig: 21, 24 offset: 0, 0 index: -1 unit-antumbra-tiny rotate: false - xy: 661, 138 + xy: 619, 47 size: 14, 16 orig: 14, 16 offset: 0, 0 index: -1 unit-antumbra-xlarge rotate: false - xy: 701, 426 + xy: 551, 183 size: 43, 48 orig: 43, 48 offset: 0, 0 index: -1 unit-arkyid-large rotate: false - xy: 1279, 765 + xy: 1783, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-arkyid-medium rotate: false - xy: 1201, 35 + xy: 1455, 393 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-arkyid-small rotate: false - xy: 1769, 563 + xy: 1183, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-arkyid-tiny rotate: false - xy: 1942, 493 + xy: 1589, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-arkyid-xlarge rotate: false - xy: 701, 566 + xy: 351, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-atrax-large rotate: false - xy: 703, 1 + xy: 1741, 776 size: 40, 29 orig: 40, 29 offset: 0, 0 index: -1 unit-atrax-medium rotate: false - xy: 869, 334 + xy: 80, 3 size: 32, 23 orig: 32, 23 offset: 0, 0 index: -1 unit-atrax-small rotate: false - xy: 971, 118 + xy: 976, 81 size: 24, 17 orig: 24, 17 offset: 0, 0 index: -1 unit-atrax-tiny rotate: false - xy: 1269, 1 + xy: 1421, 576 size: 16, 11 orig: 16, 11 offset: 0, 0 index: -1 unit-atrax-xlarge rotate: false - xy: 351, 180 + xy: 401, 180 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 unit-beta-large rotate: false - xy: 1237, 723 - size: 40, 40 - orig: 40, 40 + xy: 1699, 725 + size: 40, 38 + orig: 40, 38 offset: 0, 0 index: -1 unit-beta-medium rotate: false - xy: 1201, 1 - size: 32, 32 - orig: 32, 32 + xy: 877, 369 + size: 32, 30 + orig: 32, 30 offset: 0, 0 index: -1 unit-beta-small rotate: false - xy: 1769, 537 - size: 24, 24 - orig: 24, 24 + xy: 1209, 40 + size: 24, 23 + orig: 24, 23 offset: 0, 0 index: -1 unit-beta-tiny rotate: false - xy: 1942, 475 - size: 16, 16 - orig: 16, 16 + xy: 1607, 186 + size: 16, 15 + orig: 16, 15 offset: 0, 0 index: -1 unit-beta-xlarge rotate: false - xy: 401, 216 - size: 48, 48 - orig: 48, 48 + xy: 451, 218 + size: 48, 46 + orig: 48, 46 offset: 0, 0 index: -1 unit-bryde-large rotate: false - xy: 1195, 681 + xy: 1657, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-bryde-medium rotate: false - xy: 1987, 797 + xy: 911, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-bryde-small rotate: false - xy: 1769, 511 + xy: 1235, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-bryde-tiny rotate: false - xy: 1960, 493 + xy: 1625, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-bryde-xlarge - rotate: false - xy: 451, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-crawler-large - rotate: false - xy: 1405, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-crawler-medium - rotate: false - xy: 1439, 698 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-crawler-small - rotate: false - xy: 1743, 498 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-crawler-tiny - rotate: false - xy: 1960, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-crawler-xlarge - rotate: false - xy: 501, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-large - rotate: false - xy: 1363, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-dagger-medium - rotate: false - xy: 1473, 702 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-dagger-small - rotate: false - xy: 1769, 485 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-dagger-tiny - rotate: false - xy: 1978, 493 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-dagger-xlarge - rotate: false - xy: 551, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-eclipse-large - rotate: false - xy: 1321, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-eclipse-medium - rotate: false - xy: 1507, 702 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-eclipse-small - rotate: false - xy: 1795, 549 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-eclipse-tiny - rotate: false - xy: 1978, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-eclipse-xlarge - rotate: false - xy: 601, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-large - rotate: false - xy: 1279, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-flare-medium - rotate: false - xy: 1259, 587 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-flare-small - rotate: false - xy: 1821, 549 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-flare-tiny - rotate: false - xy: 1996, 493 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-flare-xlarge - rotate: false - xy: 651, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-large - rotate: false - xy: 1237, 689 - size: 40, 32 - orig: 40, 32 - offset: 0, 0 - index: -1 -unit-fortress-medium - rotate: false - xy: 38, 1 - size: 32, 25 - orig: 32, 25 - offset: 0, 0 - index: -1 -unit-fortress-small - rotate: false - xy: 1395, 595 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-fortress-tiny - rotate: false - xy: 435, 1 - size: 16, 12 - orig: 16, 12 - offset: 0, 0 - index: -1 -unit-fortress-xlarge - rotate: false - xy: 701, 526 - size: 48, 38 - orig: 48, 38 - offset: 0, 0 - index: -1 -unit-gamma-large - rotate: false - xy: 1447, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-gamma-medium - rotate: false - xy: 1293, 587 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-gamma-small - rotate: false - xy: 1795, 523 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-gamma-tiny - rotate: false - xy: 1996, 475 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-gamma-xlarge - rotate: false - xy: 351, 130 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-horizon-large - rotate: false - xy: 1405, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-horizon-medium - rotate: false - xy: 1327, 592 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-horizon-small - rotate: false - xy: 1847, 549 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-horizon-tiny - rotate: false - xy: 1906, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-horizon-xlarge - rotate: false - xy: 401, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mace-large - rotate: false - xy: 1363, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mace-medium - rotate: false - xy: 1361, 592 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mace-small - rotate: false - xy: 1795, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mace-tiny - rotate: false - xy: 1924, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mace-xlarge - rotate: false - xy: 451, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mega-large - rotate: false - xy: 1321, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mega-medium - rotate: false - xy: 1235, 103 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mega-small - rotate: false - xy: 1821, 523 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mega-tiny - rotate: false - xy: 1942, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mega-xlarge rotate: false xy: 501, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -unit-minke-large +unit-corvus-large rotate: false - xy: 1489, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-minke-medium - rotate: false - xy: 1235, 69 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-minke-small - rotate: false - xy: 1873, 549 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-minke-tiny - rotate: false - xy: 1960, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-minke-xlarge - rotate: false - xy: 551, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-mono-large - rotate: false - xy: 1447, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-mono-medium - rotate: false - xy: 1235, 35 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-mono-small - rotate: false - xy: 1821, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-mono-tiny - rotate: false - xy: 1978, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-mono-xlarge - rotate: false - xy: 601, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-large - rotate: false - xy: 1405, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-nova-medium - rotate: false - xy: 1235, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-nova-small - rotate: false - xy: 1847, 523 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-nova-tiny - rotate: false - xy: 1996, 457 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-nova-xlarge - rotate: false - xy: 651, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-poly-large - rotate: false - xy: 1363, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-poly-medium - rotate: false - xy: 1541, 697 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-poly-small - rotate: false - xy: 1847, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-poly-tiny - rotate: false - xy: 2014, 493 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-poly-xlarge - rotate: false - xy: 701, 476 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-pulsar-large - rotate: false - xy: 1531, 856 - size: 40, 33 - orig: 40, 33 - offset: 0, 0 - index: -1 -unit-pulsar-medium - rotate: false - xy: 787, 4 - size: 32, 26 - orig: 32, 26 - offset: 0, 0 - index: -1 -unit-pulsar-small - rotate: false - xy: 903, 286 - size: 24, 19 - orig: 24, 19 - offset: 0, 0 - index: -1 -unit-pulsar-tiny - rotate: false - xy: 2014, 478 - size: 16, 13 - orig: 16, 13 - offset: 0, 0 - index: -1 -unit-pulsar-xlarge - rotate: false - xy: 351, 89 - size: 48, 39 - orig: 48, 39 - offset: 0, 0 - index: -1 -unit-quasar-large - rotate: false - xy: 1489, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quasar-medium - rotate: false - xy: 1575, 697 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-quasar-small - rotate: false - xy: 1873, 523 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quasar-tiny - rotate: false - xy: 2014, 460 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-quasar-xlarge - rotate: false - xy: 401, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-reign-large - rotate: false - xy: 745, 4 + xy: 1867, 863 size: 40, 26 orig: 40, 26 offset: 0, 0 index: -1 -unit-reign-medium +unit-corvus-medium rotate: false - xy: 519, 1 + xy: 1489, 507 size: 31, 20 orig: 31, 20 offset: 0, 0 index: -1 -unit-reign-small +unit-corvus-small rotate: false - xy: 552, 6 + xy: 1105, 6 size: 24, 15 orig: 24, 15 offset: 0, 0 index: -1 -unit-reign-tiny +unit-corvus-tiny rotate: false xy: 771, 916 size: 15, 10 orig: 15, 10 offset: 0, 0 index: -1 -unit-reign-xlarge +unit-corvus-xlarge rotate: false - xy: 451, 183 + xy: 551, 333 size: 48, 31 orig: 48, 31 offset: 0, 0 index: -1 -unit-risso-large +unit-crawler-large rotate: false - xy: 1447, 765 + xy: 1825, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -unit-risso-medium +unit-crawler-medium rotate: false - xy: 1609, 697 + xy: 945, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -unit-risso-small +unit-crawler-small rotate: false - xy: 1873, 497 + xy: 1261, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -unit-risso-tiny +unit-crawler-tiny rotate: false - xy: 2014, 442 + xy: 1625, 234 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -unit-risso-xlarge +unit-crawler-xlarge + rotate: false + xy: 601, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-dagger-large + rotate: false + xy: 1741, 734 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-dagger-medium + rotate: false + xy: 979, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-dagger-small + rotate: false + xy: 1287, 39 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-dagger-tiny + rotate: false + xy: 1643, 252 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-dagger-xlarge + rotate: false + xy: 651, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-eclipse-large + rotate: false + xy: 1783, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-eclipse-medium + rotate: false + xy: 911, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-eclipse-small + rotate: false + xy: 1313, 39 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-eclipse-tiny + rotate: false + xy: 1625, 216 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-eclipse-xlarge + rotate: false + xy: 701, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-flare-large + rotate: false + xy: 1699, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-flare-medium + rotate: false + xy: 945, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-flare-small + rotate: false + xy: 1339, 39 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-flare-tiny + rotate: false + xy: 1643, 234 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-flare-xlarge + rotate: false + xy: 351, 66 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-fortress-large + rotate: false + xy: 443, 1 + size: 40, 32 + orig: 40, 32 + offset: 0, 0 + index: -1 +unit-fortress-medium + rotate: false + xy: 114, 1 + size: 32, 25 + orig: 32, 25 + offset: 0, 0 + index: -1 +unit-fortress-small + rotate: false + xy: 1131, 2 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-fortress-tiny + rotate: false + xy: 1703, 547 + size: 16, 12 + orig: 16, 12 + offset: 0, 0 + index: -1 +unit-fortress-xlarge + rotate: false + xy: 401, 140 + size: 48, 38 + orig: 48, 38 + offset: 0, 0 + index: -1 +unit-gamma-large + rotate: false + xy: 1867, 821 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-gamma-medium + rotate: false + xy: 979, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-gamma-small + rotate: false + xy: 1157, 13 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-gamma-tiny + rotate: false + xy: 1661, 252 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-gamma-xlarge + rotate: false + xy: 451, 168 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-horizon-large + rotate: false + xy: 1909, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-horizon-medium + rotate: false + xy: 1013, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-horizon-small + rotate: false + xy: 1183, 13 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-horizon-tiny + rotate: false + xy: 1625, 198 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-horizon-xlarge rotate: false xy: 501, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-mace-large + rotate: false + xy: 1741, 692 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-mace-medium + rotate: false + xy: 1047, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-mace-small + rotate: false + xy: 1209, 14 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-mace-tiny + rotate: false + xy: 1643, 216 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-mace-xlarge + rotate: false + xy: 551, 283 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-mega-large + rotate: false + xy: 1783, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-mega-medium + rotate: false + xy: 1081, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-mega-small + rotate: false + xy: 1235, 13 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-mega-tiny + rotate: false + xy: 1661, 234 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-mega-xlarge + rotate: false + xy: 601, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-minke-large + rotate: false + xy: 1463, 610 + size: 34, 40 + orig: 34, 40 + offset: 0, 0 + index: -1 +unit-minke-medium + rotate: false + xy: 950, 141 + size: 27, 32 + orig: 27, 32 + offset: 0, 0 + index: -1 +unit-minke-small + rotate: false + xy: 309, 690 + size: 20, 24 + orig: 20, 24 + offset: 0, 0 + index: -1 +unit-minke-tiny + rotate: false + xy: 1793, 538 + size: 13, 16 + orig: 13, 16 + offset: 0, 0 + index: -1 +unit-minke-xlarge + rotate: false + xy: 551, 133 + size: 41, 48 + orig: 41, 48 + offset: 0, 0 + index: -1 +unit-mono-large + rotate: false + xy: 1825, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-mono-medium + rotate: false + xy: 1115, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-mono-small + rotate: false + xy: 1261, 13 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-mono-tiny + rotate: false + xy: 1679, 252 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-mono-xlarge + rotate: false + xy: 651, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-nova-large + rotate: false + xy: 1867, 779 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-nova-medium + rotate: false + xy: 1149, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-nova-small + rotate: false + xy: 1287, 13 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-nova-tiny + rotate: false + xy: 1643, 198 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-nova-xlarge + rotate: false + xy: 701, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-oct-large + rotate: false + xy: 1909, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-oct-medium + rotate: false + xy: 1183, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-oct-small + rotate: false + xy: 1313, 13 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-oct-tiny + rotate: false + xy: 1661, 216 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-oct-xlarge + rotate: false + xy: 401, 90 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-omura-large + rotate: false + xy: 950, 251 + size: 28, 40 + orig: 28, 40 + offset: 0, 0 + index: -1 +unit-omura-medium + rotate: false + xy: 983, 572 + size: 22, 32 + orig: 22, 32 + offset: 0, 0 + index: -1 +unit-omura-small + rotate: false + xy: 1679, 226 + size: 16, 24 + orig: 16, 24 + offset: 0, 0 + index: -1 +unit-omura-tiny + rotate: false + xy: 1389, 307 + size: 11, 16 + orig: 11, 16 + offset: 0, 0 + index: -1 +unit-omura-xlarge + rotate: false + xy: 1501, 631 + size: 33, 48 + orig: 33, 48 + offset: 0, 0 + index: -1 +unit-poly-large + rotate: false + xy: 1825, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-poly-medium + rotate: false + xy: 1217, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-poly-small + rotate: false + xy: 1339, 13 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-poly-tiny + rotate: false + xy: 1661, 198 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-poly-xlarge + rotate: false + xy: 451, 118 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-pulsar-large + rotate: false + xy: 1867, 743 + size: 40, 34 + orig: 40, 34 + offset: 0, 0 + index: -1 +unit-pulsar-medium + rotate: false + xy: 1251, 356 + size: 32, 27 + orig: 32, 27 + offset: 0, 0 + index: -1 +unit-pulsar-small + rotate: false + xy: 1499, 341 + size: 24, 20 + orig: 24, 20 + offset: 0, 0 + index: -1 +unit-pulsar-tiny + rotate: false + xy: 1697, 364 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-pulsar-xlarge + rotate: false + xy: 351, 24 + size: 48, 40 + orig: 48, 40 + offset: 0, 0 + index: -1 +unit-quad-large + rotate: false + xy: 1909, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-quad-medium + rotate: false + xy: 1489, 474 + size: 31, 31 + orig: 31, 31 + offset: 0, 0 + index: -1 +unit-quad-small + rotate: false + xy: 1525, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-quad-tiny + rotate: false + xy: 1643, 181 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +unit-quad-xlarge + rotate: false + xy: 501, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-quasar-large + rotate: false + xy: 881, 639 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-quasar-medium + rotate: false + xy: 1285, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-quasar-small + rotate: false + xy: 1551, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-quasar-tiny + rotate: false + xy: 1679, 208 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-quasar-xlarge + rotate: false + xy: 551, 233 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-reign-large + rotate: false + xy: 1783, 695 + size: 40, 26 + orig: 40, 26 + offset: 0, 0 + index: -1 +unit-reign-medium + rotate: false + xy: 1489, 452 + size: 31, 20 + orig: 31, 20 + offset: 0, 0 + index: -1 +unit-reign-small + rotate: false + xy: 1577, 346 + size: 24, 15 + orig: 24, 15 + offset: 0, 0 + index: -1 +unit-reign-tiny + rotate: false + xy: 1157, 1 + size: 15, 10 + orig: 15, 10 + offset: 0, 0 + index: -1 +unit-reign-xlarge + rotate: false + xy: 601, 283 + size: 48, 31 + orig: 48, 31 + offset: 0, 0 + index: -1 +unit-risso-large + rotate: false + xy: 1993, 849 + size: 35, 40 + orig: 35, 40 + offset: 0, 0 + index: -1 +unit-risso-medium + rotate: false + xy: 2019, 747 + size: 28, 32 + orig: 28, 32 + offset: 0, 0 + index: -1 +unit-risso-small + rotate: false + xy: 1629, 311 + size: 21, 24 + orig: 21, 24 + offset: 0, 0 + index: -1 +unit-risso-tiny + rotate: false + xy: 1517, 579 + size: 14, 16 + orig: 14, 16 + offset: 0, 0 + index: -1 +unit-risso-xlarge + rotate: false + xy: 601, 233 + size: 43, 48 + orig: 43, 48 + offset: 0, 0 + index: -1 unit-scepter-large rotate: false - xy: 1279, 689 + xy: 881, 605 size: 40, 32 orig: 40, 32 offset: 0, 0 index: -1 unit-scepter-medium rotate: false - xy: 821, 4 + xy: 1319, 357 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 unit-scepter-small rotate: false - xy: 578, 2 + xy: 1603, 342 size: 24, 19 orig: 24, 19 offset: 0, 0 index: -1 unit-scepter-tiny rotate: false - xy: 1255, 546 + xy: 1391, 218 size: 16, 13 orig: 16, 13 offset: 0, 0 index: -1 unit-scepter-xlarge rotate: false - xy: 551, 275 + xy: 651, 325 size: 48, 39 orig: 48, 39 offset: 0, 0 index: -1 +unit-sei-large + rotate: false + xy: 923, 639 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-sei-medium + rotate: false + xy: 1489, 529 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-sei-small + rotate: false + xy: 1629, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-sei-tiny + rotate: false + xy: 1699, 346 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-sei-xlarge + rotate: false + xy: 701, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 unit-spiroct-large rotate: false - xy: 1405, 732 + xy: 965, 648 size: 40, 31 orig: 40, 31 offset: 0, 0 index: -1 unit-spiroct-medium rotate: false - xy: 72, 1 + xy: 1489, 425 size: 31, 25 orig: 31, 25 offset: 0, 0 index: -1 unit-spiroct-small rotate: false - xy: 1795, 476 + xy: 1655, 342 size: 24, 19 orig: 24, 19 offset: 0, 0 index: -1 unit-spiroct-tiny rotate: false - xy: 453, 1 + xy: 2029, 647 size: 15, 12 orig: 15, 12 offset: 0, 0 index: -1 unit-spiroct-xlarge rotate: false - xy: 601, 326 + xy: 401, 50 size: 48, 38 orig: 48, 38 offset: 0, 0 index: -1 unit-toxopid-large rotate: false - xy: 881, 597 + xy: 1536, 639 size: 33, 40 orig: 33, 40 offset: 0, 0 @@ -19232,63 +22746,106 @@ unit-toxopid-medium index: -1 unit-toxopid-small rotate: false - xy: 309, 690 + xy: 2027, 823 size: 20, 24 orig: 20, 24 offset: 0, 0 index: -1 unit-toxopid-tiny rotate: false - xy: 1414, 512 + xy: 1717, 347 size: 13, 16 orig: 13, 16 offset: 0, 0 index: -1 unit-toxopid-xlarge rotate: false - xy: 1531, 806 + xy: 1951, 841 size: 40, 48 orig: 40, 48 offset: 0, 0 index: -1 +unit-vela-large + rotate: false + xy: 923, 605 + size: 40, 32 + orig: 40, 32 + offset: 0, 0 + index: -1 +unit-vela-medium + rotate: false + xy: 1353, 357 + size: 32, 26 + orig: 32, 26 + offset: 0, 0 + index: -1 +unit-vela-small + rotate: false + xy: 1577, 325 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-vela-tiny + rotate: false + xy: 814, 199 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-vela-xlarge + rotate: false + xy: 451, 77 + size: 48, 39 + orig: 48, 39 + offset: 0, 0 + index: -1 unit-zenith-large rotate: false - xy: 1489, 765 + xy: 965, 606 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-zenith-medium rotate: false - xy: 1643, 697 + xy: 1387, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-zenith-small rotate: false - xy: 1821, 471 + xy: 1603, 316 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-zenith-tiny rotate: false - xy: 1414, 530 + xy: 1625, 180 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-zenith-xlarge rotate: false - xy: 651, 366 + xy: 501, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +wavepane + rotate: false + xy: 1425, 623 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 white-pane rotate: false - xy: 1915, 833 + xy: 1463, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19296,14 +22853,14 @@ white-pane index: -1 whiteui rotate: false - xy: 1246, 404 + xy: 821, 928 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 1251, 482 + xy: 980, 230 size: 27, 61 split: 4, 4, 2, 2 orig: 27, 61 diff --git a/core/assets/sprites/fallback/sprites.png b/core/assets/sprites/fallback/sprites.png index f899d82f7f..4f9c0dffcc 100644 Binary files a/core/assets/sprites/fallback/sprites.png and b/core/assets/sprites/fallback/sprites.png differ diff --git a/core/assets/sprites/fallback/sprites2.png b/core/assets/sprites/fallback/sprites2.png index 6d1c9053d5..aa17fbbe89 100644 Binary files a/core/assets/sprites/fallback/sprites2.png and b/core/assets/sprites/fallback/sprites2.png differ diff --git a/core/assets/sprites/fallback/sprites3.png b/core/assets/sprites/fallback/sprites3.png index 9e748767d0..05f78947ea 100644 Binary files a/core/assets/sprites/fallback/sprites3.png and b/core/assets/sprites/fallback/sprites3.png differ diff --git a/core/assets/sprites/fallback/sprites4.png b/core/assets/sprites/fallback/sprites4.png index fdedda69d5..45619c04fa 100644 Binary files a/core/assets/sprites/fallback/sprites4.png and b/core/assets/sprites/fallback/sprites4.png differ diff --git a/core/assets/sprites/fallback/sprites5.png b/core/assets/sprites/fallback/sprites5.png index ce24c31d04..e413db1a18 100644 Binary files a/core/assets/sprites/fallback/sprites5.png and b/core/assets/sprites/fallback/sprites5.png differ diff --git a/core/assets/sprites/fallback/sprites6.png b/core/assets/sprites/fallback/sprites6.png index 66224689f5..94069305e4 100644 Binary files a/core/assets/sprites/fallback/sprites6.png and b/core/assets/sprites/fallback/sprites6.png differ diff --git a/core/assets/sprites/fallback/sprites7.png b/core/assets/sprites/fallback/sprites7.png index 65b8b30c04..9e083fdec4 100644 Binary files a/core/assets/sprites/fallback/sprites7.png and b/core/assets/sprites/fallback/sprites7.png differ diff --git a/core/assets/sprites/fallback/sprites8.png b/core/assets/sprites/fallback/sprites8.png new file mode 100644 index 0000000000..4c47261514 Binary files /dev/null and b/core/assets/sprites/fallback/sprites8.png differ diff --git a/core/assets/sprites/space.png b/core/assets/sprites/space.png new file mode 100644 index 0000000000..188e9e40ae Binary files /dev/null and b/core/assets/sprites/space.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index d7ac9ec386..75be83066e 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -4,6603 +4,7548 @@ size: 4096,4096 format: rgba8888 filter: nearest,nearest repeat: none -core-silo - rotate: false - xy: 1379, 2661 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 launch-pad rotate: false - xy: 681, 1995 + xy: 1951, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large rotate: false - xy: 445, 1189 + xy: 1703, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 launch-pad-light rotate: false - xy: 779, 1997 + xy: 2245, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launchpod rotate: false - xy: 607, 725 + xy: 2013, 1618 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 force-projector rotate: false - xy: 779, 2387 + xy: 2918, 2757 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector-top rotate: false - xy: 583, 2191 + xy: 1657, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 607, 461 + xy: 2029, 760 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 673, 413 + xy: 2091, 1156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender rotate: false - xy: 1117, 907 + xy: 3323, 2187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-top rotate: false - xy: 1083, 839 + xy: 2439, 812 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-dome rotate: false - xy: 673, 1407 + xy: 2245, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-top rotate: false - xy: 673, 1309 + xy: 2343, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 739, 413 + xy: 2095, 1090 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 607, 395 + xy: 2095, 1024 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 1109, 669 + xy: 3585, 2319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-loader rotate: false - xy: 3271, 3321 + xy: 1899, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader rotate: false - xy: 1985, 2967 + xy: 1644, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 1023, 1485 + xy: 2361, 1746 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 1023, 1451 + xy: 2361, 1576 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 989, 1417 + xy: 2361, 1542 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 955, 1383 + xy: 2279, 718 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 1091, 1485 + xy: 2279, 684 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-0 rotate: false - xy: 3343, 3773 + xy: 1981, 1518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-full rotate: false - xy: 3343, 3773 + xy: 1981, 1518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-1 rotate: false - xy: 3823, 3198 + xy: 1053, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-2 rotate: false - xy: 855, 415 + xy: 2319, 1160 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-3 rotate: false - xy: 1149, 2484 + xy: 2277, 1076 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-0 rotate: false - xy: 897, 461 + xy: 1113, 2285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-1 rotate: false - xy: 855, 381 + xy: 4005, 3587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-2 rotate: false - xy: 855, 347 + xy: 1087, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-3 rotate: false - xy: 855, 313 + xy: 2319, 1126 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-0 rotate: false - xy: 855, 279 + xy: 2277, 1042 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-1 rotate: false - xy: 855, 245 + xy: 1113, 2251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-2 rotate: false - xy: 3857, 3198 + xy: 4039, 3587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-3 rotate: false - xy: 3891, 3209 + xy: 1121, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-0 rotate: false - xy: 3925, 3209 + xy: 2277, 1008 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-1 rotate: false - xy: 3871, 3164 + xy: 1155, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-2 rotate: false - xy: 3871, 3130 + xy: 2277, 974 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-3 rotate: false - xy: 3871, 3096 + xy: 1189, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-0 rotate: false - xy: 3871, 3062 + xy: 2277, 940 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-1 rotate: false - xy: 3871, 3028 + xy: 2277, 906 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-2 rotate: false - xy: 3871, 2994 + xy: 1654, 3015 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-3 rotate: false - xy: 3871, 2960 + xy: 3559, 2622 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 989, 1315 + xy: 2347, 642 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 955, 1281 + xy: 2313, 608 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1091, 1383 + xy: 2347, 608 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1057, 1349 + xy: 2313, 574 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1023, 1315 + xy: 2347, 574 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 989, 1281 + xy: 2313, 540 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 955, 1247 + xy: 2347, 540 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 1091, 1349 + xy: 2313, 506 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 1057, 1315 + xy: 2347, 506 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1023, 1281 + xy: 2313, 472 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 989, 1247 + xy: 2347, 472 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 955, 1213 + xy: 2313, 438 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1091, 1315 + xy: 2347, 438 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1057, 1281 + xy: 2317, 404 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1023, 1247 + xy: 2351, 404 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 989, 1213 + xy: 2381, 710 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1091, 1281 + xy: 2381, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1057, 1247 + xy: 2381, 642 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1023, 1213 + xy: 2381, 608 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor rotate: false - xy: 1079, 771 + xy: 3347, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-0 rotate: false - xy: 1113, 771 + xy: 3347, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-1 rotate: false - xy: 939, 737 + xy: 3381, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-2 rotate: false - xy: 939, 703 + xy: 3381, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-edge rotate: false - xy: 973, 737 + xy: 3415, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-stack rotate: false - xy: 939, 669 + xy: 3415, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1159, 1431 + xy: 2511, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1193, 1465 + xy: 2395, 2075 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1159, 1397 + xy: 2395, 2041 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1193, 1431 + xy: 2429, 2075 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1159, 1363 + xy: 2395, 2007 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1193, 1397 + xy: 2463, 2075 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1159, 1329 + xy: 2429, 2041 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1193, 1363 + xy: 2395, 1973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1159, 1295 + xy: 2497, 2075 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1193, 1329 + xy: 2463, 2041 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1159, 1261 + xy: 2429, 2007 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1193, 1295 + xy: 2395, 1939 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1159, 1227 + xy: 2497, 2041 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1193, 1261 + xy: 2463, 2007 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1159, 1193 + xy: 2429, 1973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1193, 1227 + xy: 2395, 1905 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1193, 1193 + xy: 2497, 2007 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1227, 1533 + xy: 2463, 1973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1227, 1499 + xy: 2429, 1939 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cross rotate: false - xy: 951, 1111 + xy: 3085, 2227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor rotate: false - xy: 739, 941 + xy: 2845, 2331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 inverted-sorter rotate: false - xy: 985, 1077 + xy: 3245, 2357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 1117, 975 + xy: 3211, 2283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 779, 1801 + xy: 2343, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 947, 805 + xy: 2449, 710 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 payload-conveyor rotate: false - xy: 673, 1211 + xy: 2441, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-edge rotate: false - xy: 877, 2297 + xy: 2539, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-top rotate: false - xy: 877, 2199 + xy: 2637, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-top rotate: false - xy: 877, 2199 + xy: 2637, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router rotate: false - xy: 877, 2101 + xy: 2637, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-edge rotate: false - xy: 877, 2003 + xy: 2637, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-over rotate: false - xy: 877, 1905 + xy: 2735, 2647 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 1117, 805 + xy: 2449, 540 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 943, 771 + xy: 2449, 506 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 977, 771 + xy: 2449, 472 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1011, 771 + xy: 2449, 438 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 935, 499 + xy: 3493, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 1003, 499 + xy: 3527, 2253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 underflow-gate rotate: false - xy: 1227, 1397 + xy: 2463, 1939 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 453, 2359 + xy: 1805, 1148 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 453, 2229 + xy: 3263, 3099 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 453, 2099 + xy: 3393, 3099 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 453, 1969 + xy: 1899, 1018 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 drill-top rotate: false - xy: 739, 875 + xy: 2911, 2265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-liquid +steam-generator-liquid rotate: false - xy: 739, 875 + xy: 2911, 2265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 583, 1995 + xy: 1657, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 681, 2093 + xy: 1951, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 779, 2095 + xy: 2049, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 583, 1897 + xy: 2147, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 607, 527 + xy: 2029, 1024 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 673, 479 + xy: 2029, 958 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 739, 479 + xy: 2029, 892 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 779, 1703 + xy: 2539, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 681, 1603 + xy: 1951, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 779, 1605 + xy: 2049, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 673, 1505 + xy: 2147, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 607, 197 + xy: 2147, 430 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 519, 131 + xy: 2647, 2245 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 585, 131 + xy: 2713, 2249 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 2087, 2489 + xy: 2145, 1958 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 2055, 2423 + xy: 2145, 1892 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 2055, 2357 + xy: 2145, 1826 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 2055, 2291 + xy: 2145, 1760 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 3905, 3039 + xy: 2353, 1152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 4062, 3569 + xy: 2379, 914 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 917, 1119 + xy: 1524, 2635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 1023, 1383 + xy: 2279, 446 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 877, 1807 + xy: 2735, 2549 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 989, 1451 + xy: 2361, 1712 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 955, 1417 + xy: 2361, 1678 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 955, 1417 + xy: 2361, 1678 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 1091, 1519 + xy: 2361, 1644 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 1057, 1485 + xy: 2361, 1610 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 989, 1383 + xy: 2279, 582 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 955, 1349 + xy: 2279, 548 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 1091, 1451 + xy: 2279, 514 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 1057, 1417 + xy: 2279, 480 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 1057, 1417 + xy: 2279, 480 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 1057, 1417 + xy: 2279, 480 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 989, 1349 + xy: 2313, 710 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 955, 1315 + xy: 2347, 710 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 1091, 1417 + xy: 2313, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 1057, 1383 + xy: 2347, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 1057, 1383 + xy: 2347, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1023, 1349 + xy: 2313, 642 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 981, 941 + xy: 3313, 2289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate rotate: false - xy: 1015, 941 + xy: 3153, 2199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate-top rotate: false - xy: 947, 839 + xy: 3187, 2249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 981, 873 + xy: 3187, 2215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1015, 907 + xy: 3221, 2249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1049, 941 + xy: 3221, 2215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 583, 1799 + xy: 2049, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 681, 1897 + xy: 2147, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 779, 1899 + xy: 2343, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 1083, 907 + xy: 3187, 2181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-liquid rotate: false - xy: 1117, 941 + xy: 3221, 2181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-liquid rotate: false - xy: 1117, 941 + xy: 3221, 2181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-liquid rotate: false - xy: 1117, 941 + xy: 3221, 2181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 981, 805 + xy: 2449, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 1015, 805 + xy: 2449, 642 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1049, 805 + xy: 2449, 608 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1083, 805 + xy: 2449, 574 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-cap rotate: false - xy: 1007, 737 + xy: 3449, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-0 rotate: false - xy: 939, 635 + xy: 3483, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-1 rotate: false - xy: 973, 669 + xy: 3483, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-2 rotate: false - xy: 1007, 703 + xy: 3357, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-3 rotate: false - xy: 1041, 737 + xy: 3357, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-4 rotate: false - xy: 939, 601 + xy: 3391, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1075, 737 + xy: 3391, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 939, 567 + xy: 3425, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 973, 601 + xy: 3459, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1007, 635 + xy: 3425, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 783, 149 + xy: 2079, 1882 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 1073, 1889 + xy: 3127, 2671 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hyper-processor rotate: false - xy: 681, 2191 + xy: 1853, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +large-logic-display + rotate: false + xy: 1307, 1646 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 logic-display rotate: false - xy: 583, 1701 + xy: 2245, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor rotate: false - xy: 673, 677 + xy: 2013, 1552 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +memory-bank + rotate: false + xy: 2029, 826 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 memory-cell rotate: false - xy: 1083, 873 + xy: 3289, 2187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 1117, 873 + xy: 2439, 778 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor rotate: false - xy: 1117, 839 + xy: 2439, 744 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch rotate: false - xy: 1193, 1533 + xy: 2409, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch-on rotate: false - xy: 1159, 1465 + xy: 2443, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery rotate: false - xy: 3905, 3175 + xy: 3593, 2622 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large rotate: false - xy: 433, 623 + xy: 1935, 1224 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-large-top rotate: false - xy: 433, 525 + xy: 3231, 2989 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-top rotate: false - xy: 3905, 3141 + xy: 2291, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 1057, 1451 + xy: 2279, 650 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 1023, 1417 + xy: 2279, 616 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator rotate: false - xy: 1695, 2337 + xy: 2330, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 1793, 2369 + xy: 2526, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 1891, 2369 + xy: 2428, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode rotate: false - xy: 985, 1145 + xy: 3085, 2193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode-arrow rotate: false - xy: 985, 1111 + xy: 3119, 2267 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator rotate: false - xy: 1087, 1145 + xy: 3279, 2391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-top rotate: false - xy: 1087, 1111 + xy: 3313, 2391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor rotate: false - xy: 3141, 3319 + xy: 3913, 3079 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-bottom rotate: false - xy: 2213, 3182 + xy: 1817, 1908 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-light rotate: false - xy: 2343, 3182 + xy: 1817, 1778 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-0 rotate: false - xy: 2473, 3182 + xy: 1817, 1648 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-1 rotate: false - xy: 453, 1579 + xy: 1817, 1518 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-2 rotate: false - xy: 445, 1449 + xy: 2143, 238 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-3 rotate: false - xy: 445, 1319 + xy: 2143, 108 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 power-node rotate: false - xy: 973, 635 + xy: 3357, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 607, 65 + xy: 2779, 2249 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source rotate: false - xy: 1007, 669 + xy: 3391, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 1041, 703 + xy: 3425, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 805, 83 + xy: 2079, 1816 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 973, 567 + xy: 3357, 2167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 1007, 533 + xy: 3527, 2287 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 975, 1791 + xy: 3029, 2671 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +steam-generator + rotate: false + xy: 2213, 562 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-cap + rotate: false + xy: 2213, 496 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-top + rotate: false + xy: 2213, 430 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine0 + rotate: false + xy: 2037, 2222 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine1 + rotate: false + xy: 2103, 2222 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 surge-tower rotate: false - xy: 2063, 2687 + xy: 2027, 2156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 1955, 2555 + xy: 2159, 2156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 975, 1693 + xy: 3029, 2573 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 1073, 1791 + xy: 3029, 2475 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-top rotate: false - xy: 1073, 1693 + xy: 3127, 2573 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -turbine-generator - rotate: false - xy: 2021, 2489 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-cap - rotate: false - xy: 1989, 2423 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-top - rotate: false - xy: 1989, 2357 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine0 - rotate: false - xy: 1989, 2291 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine1 - rotate: false - xy: 2087, 2621 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 alloy-smelter rotate: false - xy: 433, 819 + xy: 1919, 1420 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 433, 721 + xy: 1935, 1322 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 3315, 3123 + xy: 1825, 2043 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-forge rotate: false - xy: 1857, 2467 + xy: 3281, 2695 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 coal-centrifuge rotate: false - xy: 1539, 1981 + xy: 3874, 2651 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cryofluidmixer-bottom +cryofluid-mixer-bottom rotate: false - xy: 739, 1073 + xy: 3029, 2409 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cryofluidmixer-liquid +cryofluid-mixer-liquid rotate: false - xy: 607, 1055 + xy: 3095, 2409 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cryofluidmixer-top +cryofluid-mixer-top rotate: false - xy: 673, 1007 + xy: 3373, 2371 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 739, 1007 + xy: 3439, 2371 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 607, 989 + xy: 2833, 2397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 673, 941 + xy: 2899, 2397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 disassembler rotate: false - xy: 1793, 2271 + xy: 2526, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-liquid rotate: false - xy: 1891, 2271 + xy: 2624, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-spinner rotate: false - xy: 1793, 2889 + xy: 2624, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 673, 809 + xy: 2013, 1948 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 incinerator rotate: false - xy: 951, 1077 + xy: 3211, 2351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 1125, 1315 + xy: 2415, 472 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 1117, 1009 + xy: 3313, 2323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln rotate: false - xy: 739, 809 + xy: 2013, 1882 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 607, 791 + xy: 2013, 1816 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 607, 791 + xy: 2013, 1816 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 1049, 907 + xy: 3289, 2255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-void rotate: false - xy: 1083, 941 + xy: 3289, 2221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 1049, 839 + xy: 3255, 2187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press rotate: false - xy: 583, 1603 + xy: 2539, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 607, 329 + xy: 2095, 826 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 673, 281 + xy: 2095, 760 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 739, 281 + xy: 2147, 694 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 607, 263 + xy: 2147, 628 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 673, 215 + xy: 2147, 562 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 1041, 669 + xy: 3459, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 1075, 703 + xy: 3459, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 717, 149 + xy: 2911, 2199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 1865, 2757 + xy: 2099, 1222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 1865, 2691 + xy: 2157, 1156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-spinner rotate: false - xy: 1941, 2819 + xy: 2161, 1090 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-crucible rotate: false - xy: 975, 1889 + xy: 2931, 2561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-crucible-top rotate: false - xy: 1073, 1987 + xy: 2931, 2463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 2007, 2819 + xy: 2161, 1024 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 2073, 2819 + xy: 2161, 958 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 1931, 2753 + xy: 2161, 892 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 1997, 2753 + xy: 2161, 826 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 2063, 2753 + xy: 2161, 760 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 1931, 2687 + xy: 2213, 694 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 1997, 2687 + xy: 2213, 628 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -rock1 +boulder1 rotate: false - xy: 2287, 2393 + xy: 1604, 2999 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -rock2 +boulder2 rotate: false - xy: 2287, 2343 + xy: 3796, 2610 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder1 + rotate: false + xy: 2221, 2086 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder2 + rotate: false + xy: 2211, 2036 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-boulder1 rotate: false - xy: 1007, 601 + xy: 3391, 2167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-boulder2 rotate: false - xy: 1041, 635 + xy: 3425, 2167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder1 rotate: false - xy: 1041, 601 + xy: 3551, 2321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder2 rotate: false - xy: 1075, 635 + xy: 3585, 2353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -snowrock1 +snow-boulder1 rotate: false - xy: 877, 1561 + xy: 2315, 1286 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock2 +snow-boulder2 rotate: false - xy: 871, 1511 + xy: 2357, 1486 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-cluster1 rotate: false - xy: 855, 491 + xy: 1641, 6 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster2 rotate: false - xy: 897, 533 + xy: 2277, 1152 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster3 rotate: false - xy: 855, 449 + xy: 2277, 1110 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 white-tree rotate: false - xy: 1, 2459 + xy: 1, 1523 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead rotate: false - xy: 1322, 3775 + xy: 2173, 3775 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead-shadow rotate: false - xy: 1, 3747 + xy: 403, 2943 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 white-tree-shadow rotate: false - xy: 1, 3747 + xy: 403, 2943 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 container rotate: false - xy: 1605, 2115 + xy: 4022, 2709 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team + rotate: false + xy: 4006, 2643 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation rotate: false - xy: 1207, 2551 + xy: 2017, 628 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation-team rotate: false - xy: 1337, 2531 + xy: 2017, 498 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus rotate: false - xy: 3309, 3611 + xy: 1401, 460 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus-team rotate: false - xy: 3471, 3611 + xy: 1397, 298 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard rotate: false - xy: 2083, 2967 + xy: 1840, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team rotate: false - xy: 1107, 2379 + xy: 1742, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 unloader rotate: false - xy: 1227, 1363 + xy: 2429, 1905 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 1227, 1329 + xy: 2395, 1837 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault rotate: false - xy: 1073, 1595 + xy: 3323, 2511 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault-team + rotate: false + xy: 3421, 2511 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 805, 215 + xy: 2820, 2855 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 3905, 3107 + xy: 2291, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 1407, 2113 + xy: 1895, 2212 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-3 rotate: false - xy: 433, 427 + xy: 3329, 3001 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-4 rotate: false - xy: 453, 1839 + xy: 1899, 888 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +foreshadow-heat + rotate: false + xy: 3783, 3079 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 863, 869 + xy: 781, 1 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 739, 743 + xy: 2013, 1684 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 2733, 3191 + xy: 1963, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 877, 1611 + xy: 2833, 2659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 805, 17 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-left - rotate: false - xy: 1407, 1849 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-right - rotate: false - xy: 1473, 1849 + xy: 2079, 1684 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-heat rotate: false - xy: 1109, 703 + xy: 3493, 2167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +tsunami-liquid + rotate: false + xy: 3225, 2597 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +tsunami-top + rotate: false + xy: 3225, 2499 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 wave-liquid rotate: false - xy: 2121, 2357 + xy: 2145, 1628 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +wave-top + rotate: false + xy: 2145, 1562 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 additive-reconstructor rotate: false - xy: 1009, 2379 + xy: 2873, 3103 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 additive-reconstructor-top rotate: false - xy: 433, 1015 + xy: 1559, 2571 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory rotate: false - xy: 433, 917 + xy: 1559, 2473 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 command-center rotate: false - xy: 1539, 1915 + xy: 3961, 2775 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-team + rotate: false + xy: 3956, 2709 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 exponential-reconstructor rotate: false - xy: 807, 3097 + xy: 1127, 3211 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 exponential-reconstructor-top rotate: false - xy: 1033, 3323 + xy: 2531, 3307 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-in-3 rotate: false - xy: 583, 2387 + xy: 2722, 2843 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-in-5 rotate: false - xy: 2879, 3451 + xy: 1563, 608 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-in-7 rotate: false - xy: 807, 2871 + xy: 831, 899 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-in-9 rotate: false - xy: 2804, 3807 + xy: 3655, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 factory-out-3 rotate: false - xy: 681, 2387 + xy: 2722, 2745 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-out-5 rotate: false - xy: 3041, 3451 + xy: 1563, 446 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-out-7 rotate: false - xy: 1033, 3097 + xy: 831, 673 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-out-9 rotate: false - xy: 1, 719 + xy: 403, 2331 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 factory-top-3 rotate: false - xy: 583, 2289 + xy: 2820, 2757 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ground-factory rotate: false - xy: 583, 2093 + xy: 1755, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor rotate: false - xy: 2051, 3261 + xy: 1559, 284 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 multiplicative-reconstructor-top rotate: false - xy: 3203, 3449 + xy: 1559, 122 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory rotate: false - xy: 681, 1701 + xy: 2441, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rally-point rotate: false - xy: 673, 65 + xy: 2079, 2014 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 939, 533 + xy: 3493, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point rotate: false - xy: 739, 83 + xy: 2079, 1948 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tetrative-reconstructor rotate: false - xy: 3094, 3807 + xy: 323, 2041 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor-top rotate: false - xy: 1, 429 + xy: 323, 1751 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 1091, 1247 + xy: 2381, 574 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 1605, 2049 + xy: 2317, 2301 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door rotate: false - xy: 1019, 1145 + xy: 3119, 2233 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large rotate: false - xy: 607, 923 + xy: 2911, 2331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 673, 875 + xy: 2845, 2265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 1019, 1111 + xy: 3119, 2199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 1045, 771 + xy: 2453, 404 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 739, 347 + xy: 2095, 892 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-wall rotate: false - xy: 973, 703 + xy: 3449, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large rotate: false - xy: 739, 215 + xy: 2147, 496 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-gigantic rotate: false - xy: 3527, 3321 + xy: 2613, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge2 rotate: false - xy: 975, 1987 + xy: 2833, 2463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 1073, 2085 + xy: 2931, 2659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 1605, 1851 + xy: 2079, 1552 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 1639, 3017 + xy: 2083, 1486 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 1705, 3017 + xy: 2083, 1420 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 1771, 3017 + xy: 2099, 1354 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 973, 533 + xy: 3517, 2355 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 969, 499 + xy: 3517, 2321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1007, 567 + xy: 3551, 2355 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1007, 567 + xy: 3551, 2355 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 1159, 1499 + xy: 2375, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 1955, 2621 + xy: 2093, 2156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 1193, 1499 + xy: 2477, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 2021, 2555 + xy: 2155, 2090 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster rotate: false - xy: 3513, 3191 + xy: 2743, 2941 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 1227, 1465 + xy: 2395, 1871 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 1955, 2489 + xy: 2169, 2222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bullet rotate: false - xy: 1639, 3095 + xy: 4043, 3285 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 805, 807 + xy: 4043, 3231 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 999, 2645 + xy: 3517, 2303 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-end rotate: false - xy: 3787, 3314 + xy: 1440, 2754 size: 100, 199 orig: 100, 199 offset: 0, 0 index: -1 circle-mid rotate: false - xy: 4086, 3896 + xy: 605, 1550 size: 1, 199 orig: 1, 199 offset: 0, 0 index: -1 circle-shadow rotate: false - xy: 2330, 3604 + xy: 1356, 2422 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 error rotate: false - xy: 821, 1505 + xy: 2211, 1636 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +large-bomb + rotate: false + xy: 2189, 6 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +large-bomb-back + rotate: false + xy: 2873, 2855 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 laser rotate: false - xy: 1401, 1851 + xy: 567, 93 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 laser-end rotate: false - xy: 1261, 2023 + xy: 3299, 2425 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser rotate: false - xy: 601, 1137 + xy: 2973, 3293 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 1261, 1949 + xy: 3373, 2437 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 missile rotate: false - xy: 569, 223 + xy: 1683, 10 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 217, 133 + xy: 1113, 2319 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 parallax-laser rotate: false - xy: 3642, 3981 + xy: 2751, 3257 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 parallax-laser-end rotate: false - xy: 1261, 1875 + xy: 3447, 2437 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 particle rotate: false - xy: 897, 575 + xy: 1109, 2601 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 1201, 2578 + xy: 1501, 1088 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 shell rotate: false - xy: 1111, 2480 + xy: 3967, 3583 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 897, 495 + xy: 2683, 2941 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 transfer rotate: false - xy: 1695, 3483 + xy: 397, 2439 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 1227, 1431 + xy: 2497, 1973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white rotate: false - xy: 3773, 3191 + xy: 3652, 2791 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 +alpha-outline + rotate: false + xy: 3225, 2719 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 alpha-wreck0 rotate: false - xy: 805, 707 + xy: 3323, 2645 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck1 rotate: false - xy: 805, 657 + xy: 2590, 2251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck2 rotate: false - xy: 805, 607 + xy: 3035, 2245 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +antumbra-outline + rotate: false + xy: 935, 2357 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 antumbra-wreck0 rotate: false - xy: 1259, 3065 + xy: 895, 2115 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck1 rotate: false - xy: 1251, 2823 + xy: 895, 1873 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck2 rotate: false - xy: 1485, 3533 + xy: 895, 1631 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 arc rotate: false - xy: 3309, 3773 + xy: 1947, 1518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -arkyid-wreck0 - rotate: false - xy: 347, 1 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck1 - rotate: false - xy: 389, 131 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck2 - rotate: false - xy: 477, 1 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -atrax-wreck0 - rotate: false - xy: 1171, 2069 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck1 - rotate: false - xy: 1171, 2003 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck2 - rotate: false - xy: 1171, 1937 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -beta-wreck0 - rotate: false - xy: 805, 399 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 805, 349 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 805, 299 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-additive-reconstructor-full - rotate: false - xy: 2733, 3093 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-air-factory-full - rotate: false - xy: 2831, 3093 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-arc-full - rotate: false - xy: 3905, 3073 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-full - rotate: false - xy: 453, 1709 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-char-full - rotate: false - xy: 3905, 3005 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-full - rotate: false - xy: 3905, 2971 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 3939, 3175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 3939, 3141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 3939, 3141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-full - rotate: false - xy: 401, 273 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-nucleus-full - rotate: false - xy: 1889, 3281 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-core-shard-full - rotate: false - xy: 2929, 3093 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-craters-full - rotate: false - xy: 3939, 3107 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-full - rotate: false - xy: 1407, 2047 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cultivator-full - rotate: false - xy: 1473, 2113 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cyclone-full - rotate: false - xy: 1857, 2565 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-dark-metal-full - rotate: false - xy: 3939, 3073 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 3939, 3039 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dunerocks-full - rotate: false - xy: 3939, 3005 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 3939, 2971 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-full - rotate: false - xy: 323, 2489 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -block-fuse-full - rotate: false - xy: 575, 1481 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-grass-full - rotate: false - xy: 897, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-full - rotate: false - xy: 575, 1383 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-hail-full - rotate: false - xy: 889, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-full - rotate: false - xy: 889, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 889, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 889, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 889, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-full - rotate: false - xy: 889, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-full - rotate: false - xy: 3905, 2937 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-full - rotate: false - xy: 549, 2585 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-lancer-full - rotate: false - xy: 1407, 1981 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-laser-drill-full - rotate: false - xy: 575, 1285 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-liquid-router-full - rotate: false - xy: 3939, 2937 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-full - rotate: false - xy: 575, 1187 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-magmarock-full - rotate: false - xy: 4062, 3637 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-full - rotate: false - xy: 1889, 3183 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mechanical-drill-full - rotate: false - xy: 1473, 2047 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-meltdown-full - rotate: false - xy: 679, 2599 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-full - rotate: false - xy: 4062, 3603 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 4062, 3535 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-full - rotate: false - xy: 3900, 3509 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-naval-factory-full - rotate: false - xy: 1887, 3085 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-oil-extractor-full - rotate: false - xy: 1987, 3163 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-ore-coal-full - rotate: false - xy: 923, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 923, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 923, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 923, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 923, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 923, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-full - rotate: false - xy: 1407, 1915 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-payload-conveyor-full - rotate: false - xy: 2085, 3163 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-icon - rotate: false - xy: 2085, 3163 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-payload-router-full - rotate: false - xy: 1985, 3065 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon - rotate: false - xy: 1985, 3065 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-pebbles-full - rotate: false - xy: 921, 1527 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-full - rotate: false - xy: 1473, 1981 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-plated-conduit-full - rotate: false - xy: 921, 1493 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-full - rotate: false - xy: 1473, 1915 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pulse-conduit-full - rotate: false - xy: 921, 1459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 921, 1425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 921, 1391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-full - rotate: false - xy: 2083, 3065 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-rock-full - rotate: false - xy: 805, 249 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-full - rotate: false - xy: 921, 1357 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-full - rotate: false - xy: 921, 1323 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-full - rotate: false - xy: 607, 1121 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sand-boulder-full - rotate: false - xy: 921, 1289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 921, 1255 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-full - rotate: false - xy: 921, 1221 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-full - rotate: false - xy: 3381, 3093 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scorch-full - rotate: false - xy: 921, 1187 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 917, 1153 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 917, 1153 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-full - rotate: false - xy: 1887, 2987 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge1 - rotate: false - xy: 1887, 2987 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-scrap-wall-large-full - rotate: false - xy: 3447, 3093 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-segment-full - rotate: false - xy: 3315, 3057 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-shale-boulder-full - rotate: false - xy: 917, 1085 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 913, 1051 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-full - rotate: false - xy: 913, 1017 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 913, 983 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 955, 1519 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-full - rotate: false - xy: 519, 211 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-full - rotate: false - xy: 989, 1519 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-full - rotate: false - xy: 809, 2599 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-spore-cluster-full - rotate: false - xy: 863, 911 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 955, 1485 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-full - rotate: false - xy: 3381, 3027 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sporerocks-full - rotate: false - xy: 1023, 1519 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 989, 1485 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-full - rotate: false - xy: 3447, 3027 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 955, 1451 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-full - rotate: false - xy: 1, 2169 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -block-titanium-conveyor-full - rotate: false - xy: 1057, 1519 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 1057, 1519 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-full - rotate: false - xy: 3513, 2995 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-water-extractor-full - rotate: false - xy: 1539, 2113 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-wave-full - rotate: false - xy: 1539, 2047 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bryde-wreck0 - rotate: false - xy: 291, 687 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck1 - rotate: false - xy: 291, 545 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck2 - rotate: false - xy: 291, 403 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -core-foundation-team-crux - rotate: false - xy: 1467, 2531 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team-sharded - rotate: false - xy: 1597, 2533 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-team-crux - rotate: false - xy: 1477, 2987 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team-sharded - rotate: false - xy: 1469, 2825 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-team-crux - rotate: false - xy: 1205, 2453 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team-sharded - rotate: false - xy: 1205, 2355 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-1-0 - rotate: false - xy: 1057, 1213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-1 - rotate: false - xy: 1091, 1213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-2 - rotate: false - xy: 955, 1179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-3 - rotate: false - xy: 989, 1179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-4 - rotate: false - xy: 1023, 1179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-5 - rotate: false - xy: 1057, 1179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-6 - rotate: false - xy: 1091, 1179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-7 - rotate: false - xy: 951, 1145 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 1605, 1983 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-1 - rotate: false - xy: 1605, 1917 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-2 - rotate: false - xy: 1335, 1835 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-3 - rotate: false - xy: 3027, 3048 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-4 - rotate: false - xy: 3093, 3046 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-5 - rotate: false - xy: 3159, 3046 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-6 - rotate: false - xy: 3225, 3046 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-7 - rotate: false - xy: 673, 1073 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-3-0 - rotate: false - xy: 1303, 2433 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-1 - rotate: false - xy: 1401, 2433 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-2 - rotate: false - xy: 1499, 2433 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-3 - rotate: false - xy: 1597, 2435 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-4 - rotate: false - xy: 1695, 2435 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-5 - rotate: false - xy: 1303, 2335 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-6 - rotate: false - xy: 1401, 2335 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-7 - rotate: false - xy: 1499, 2335 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-4-0 - rotate: false - xy: 1727, 2533 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-1 - rotate: false - xy: 2231, 3312 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-2 - rotate: false - xy: 2361, 3312 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-3 - rotate: false - xy: 2491, 3312 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-4 - rotate: false - xy: 2621, 3321 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-5 - rotate: false - xy: 2751, 3321 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-6 - rotate: false - xy: 2881, 3321 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-7 - rotate: false - xy: 3011, 3321 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-5-0 - rotate: false - xy: 1541, 2663 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-1 - rotate: false - xy: 1631, 2825 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-2 - rotate: false - xy: 1703, 2663 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-3 - rotate: false - xy: 2069, 3423 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-4 - rotate: false - xy: 2231, 3442 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-5 - rotate: false - xy: 2393, 3442 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-6 - rotate: false - xy: 2555, 3451 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-7 - rotate: false - xy: 2717, 3451 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-6-0 - rotate: false - xy: 2533, 3613 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-1 - rotate: false - xy: 2727, 3613 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-2 - rotate: false - xy: 2921, 3613 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-3 - rotate: false - xy: 3115, 3613 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-4 - rotate: false - xy: 1703, 3471 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-5 - rotate: false - xy: 1695, 3277 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-6 - rotate: false - xy: 1693, 3083 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-7 - rotate: false - xy: 1013, 2661 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-7-0 - rotate: false - xy: 581, 3549 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-1 - rotate: false - xy: 807, 3549 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-2 - rotate: false - xy: 581, 3323 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-3 - rotate: false - xy: 1033, 3549 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-4 - rotate: false - xy: 581, 3097 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-5 - rotate: false - xy: 807, 3323 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-6 - rotate: false - xy: 1259, 3549 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-7 - rotate: false - xy: 581, 2871 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-8-0 - rotate: false - xy: 1, 171 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-1 - rotate: false - xy: 3384, 3773 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-2 - rotate: false - xy: 3656, 3839 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-3 - rotate: false - xy: 3642, 3581 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-4 - rotate: false - xy: 323, 3489 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-5 - rotate: false - xy: 323, 3231 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-6 - rotate: false - xy: 323, 2973 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-7 - rotate: false - xy: 323, 2715 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-9-0 - rotate: false - xy: 1644, 3807 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-1 - rotate: false - xy: 1, 1879 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-2 - rotate: false - xy: 1934, 3807 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-3 - rotate: false - xy: 1, 1589 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-4 - rotate: false - xy: 2224, 3807 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-5 - rotate: false - xy: 1, 1299 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-6 - rotate: false - xy: 2514, 3807 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-7 - rotate: false - xy: 1, 1009 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -crawler-wreck0 - rotate: false - xy: 2129, 2719 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck1 - rotate: false - xy: 771, 1553 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck2 - rotate: false - xy: 771, 1503 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -cyclone - rotate: false - xy: 1597, 2337 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dagger-wreck0 - rotate: false - xy: 771, 1303 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck1 - rotate: false - xy: 771, 1253 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 821, 1555 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -duo - rotate: false - xy: 1053, 1145 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -eclipse-wreck0 - rotate: false - xy: 1, 3103 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck1 - rotate: false - xy: 678, 3775 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck2 - rotate: false - xy: 1, 2781 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 821, 1239 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 817, 1189 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 817, 1139 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress-wreck0 - rotate: false - xy: 3889, 3345 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck1 - rotate: false - xy: 3773, 3232 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck2 - rotate: false - xy: 3991, 3427 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fuse - rotate: false - xy: 681, 2289 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -gamma-wreck0 - rotate: false - xy: 531, 1015 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 531, 957 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 531, 899 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -hail - rotate: false - xy: 1053, 1111 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -horizon-wreck0 - rotate: false - xy: 1423, 2179 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck1 - rotate: false - xy: 1497, 2179 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck2 - rotate: false - xy: 1261, 2097 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -item-blast-compound-large - rotate: false - xy: 975, 1553 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-medium - rotate: false - xy: 1053, 1077 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-blast-compound-small - rotate: false - xy: 259, 403 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-blast-compound-tiny - rotate: false - xy: 2051, 3425 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 1551, 1799 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 1017, 1553 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-medium - rotate: false - xy: 947, 1043 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-small - rotate: false - xy: 4062, 3509 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-coal-tiny - rotate: false - xy: 2213, 3405 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 2107, 2191 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 1059, 1553 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-medium - rotate: false - xy: 981, 1043 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-small - rotate: false - xy: 569, 197 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-copper-tiny - rotate: false - xy: 673, 197 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 2157, 2192 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 1101, 1553 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-medium - rotate: false - xy: 1015, 1043 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-small - rotate: false - xy: 2129, 2693 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-graphite-tiny - rotate: false - xy: 717, 131 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 2147, 2843 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 905, 911 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-medium - rotate: false - xy: 1049, 1043 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-small - rotate: false - xy: 1644, 3781 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-lead-tiny - rotate: false - xy: 1233, 2837 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 2197, 2843 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 905, 869 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-medium - rotate: false - xy: 1083, 1043 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-small - rotate: false - xy: 1207, 2829 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-metaglass-tiny - rotate: false - xy: 2213, 3387 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 2179, 2793 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 863, 827 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-medium - rotate: false - xy: 947, 975 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-small - rotate: false - xy: 323, 2463 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-phase-fabric-tiny - rotate: false - xy: 691, 197 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 2179, 2743 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 905, 827 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-medium - rotate: false - xy: 1015, 975 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-small - rotate: false - xy: 3527, 3585 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-plastanium-tiny - rotate: false - xy: 2213, 3369 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 2179, 2693 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 859, 785 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-medium - rotate: false - xy: 1083, 975 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-small - rotate: false - xy: 3271, 3423 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-pyratite-tiny - rotate: false - xy: 2213, 3351 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 2229, 2793 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 901, 785 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-medium - rotate: false - xy: 1125, 1485 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-small - rotate: false - xy: 651, 2559 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-sand-tiny - rotate: false - xy: 2213, 3333 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 2229, 2743 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 855, 743 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-medium - rotate: false - xy: 1125, 1417 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-small - rotate: false - xy: 877, 2459 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-scrap-tiny - rotate: false - xy: 2213, 3315 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 2229, 2693 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 855, 701 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-medium - rotate: false - xy: 1125, 1349 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-small - rotate: false - xy: 2183, 3235 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-silicon-tiny - rotate: false - xy: 583, 2485 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 2153, 2643 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 897, 743 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-medium - rotate: false - xy: 1125, 1247 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-small - rotate: false - xy: 1865, 2665 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-spore-pod-tiny - rotate: false - xy: 601, 2485 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 2153, 2593 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 855, 659 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-medium - rotate: false - xy: 1125, 1179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-small - rotate: false - xy: 575, 1161 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-surge-alloy-tiny - rotate: false - xy: 619, 2485 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 2203, 2643 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 897, 701 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-medium - rotate: false - xy: 1121, 1111 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-small - rotate: false - xy: 1639, 2991 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-thorium-tiny - rotate: false - xy: 637, 2485 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 2153, 2543 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 855, 617 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-medium - rotate: false - xy: 1117, 1043 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-small - rotate: false - xy: 394, 3749 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-titanium-tiny - rotate: false - xy: 1897, 3647 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-titanium-xlarge - rotate: false - xy: 2203, 2593 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 673, 743 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -liquid-cryofluid-large - rotate: false - xy: 897, 659 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-medium - rotate: false - xy: 947, 907 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-small - rotate: false - xy: 39, 3 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-cryofluid-tiny - rotate: false - xy: 2127, 3586 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 2203, 2475 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 855, 575 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-medium - rotate: false - xy: 981, 907 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-small - rotate: false - xy: 3959, 3217 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-oil-tiny - rotate: false - xy: 1337, 2663 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 2187, 2425 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 897, 617 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-medium - rotate: false - xy: 1015, 873 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-small - rotate: false - xy: 913, 957 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-slag-tiny - rotate: false - xy: 1987, 3263 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 2187, 2375 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 855, 533 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-medium - rotate: false - xy: 1049, 873 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-small - rotate: false - xy: 1227, 1303 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-water-tiny - rotate: false - xy: 1303, 2533 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 2253, 2643 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mace-wreck0 - rotate: false - xy: 607, 593 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck1 - rotate: false - xy: 673, 545 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck2 - rotate: false - xy: 739, 545 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver - rotate: false - xy: 681, 1799 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mega-wreck0 - rotate: false - xy: 3991, 3223 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck1 - rotate: false - xy: 907, 2497 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck2 - rotate: false - xy: 1009, 2559 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -meltdown - rotate: false - xy: 2603, 3182 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck0 - rotate: false - xy: 3123, 3189 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck1 - rotate: false - xy: 3253, 3189 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck2 - rotate: false - xy: 3383, 3289 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -mono-wreck0 - rotate: false - xy: 2253, 2443 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 2237, 2393 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 2237, 2343 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 531, 725 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 531, 667 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 531, 609 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -parallax - rotate: false - xy: 673, 347 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -poly-wreck0 - rotate: false - xy: 531, 435 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 531, 377 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 531, 319 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 3579, 3011 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 607, 15 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 667, 15 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -quasar-wreck0 - rotate: false - xy: 1349, 2253 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck1 - rotate: false - xy: 1431, 2253 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck2 - rotate: false - xy: 1513, 2253 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -reign-wreck0 - rotate: false - xy: 581, 2729 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -reign-wreck1 - rotate: false - xy: 1477, 3149 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -reign-wreck2 - rotate: false - xy: 797, 2729 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -repair-point - rotate: false - xy: 1109, 737 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ripple - rotate: false - xy: 877, 1709 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck0 - rotate: false - xy: 975, 2183 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck1 - rotate: false - xy: 975, 2085 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck2 - rotate: false - xy: 1073, 2183 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salvo - rotate: false - xy: 739, 17 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scatter - rotate: false - xy: 1539, 1849 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scepter-wreck0 - rotate: false - xy: 3914, 3813 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck1 - rotate: false - xy: 3900, 3671 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck2 - rotate: false - xy: 1207, 2681 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scorch - rotate: false - xy: 1075, 669 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -segment - rotate: false - xy: 1875, 2823 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 3657, 3321 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct-wreck0 - rotate: false - xy: 3123, 3112 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck1 - rotate: false - xy: 3219, 3112 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck2 - rotate: false - xy: 1171, 2278 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -splash-0 - rotate: false - xy: 1075, 601 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-1 - rotate: false - xy: 1109, 635 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-10 - rotate: false - xy: 1105, 499 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-11 - rotate: false - xy: 1159, 1533 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-2 - rotate: false - xy: 1041, 533 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-3 - rotate: false - xy: 1037, 499 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-4 - rotate: false - xy: 1075, 567 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-5 - rotate: false - xy: 1109, 601 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-6 - rotate: false - xy: 1075, 533 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-7 - rotate: false - xy: 1071, 499 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-8 - rotate: false - xy: 1109, 567 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-9 - rotate: false - xy: 1109, 533 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -swarmer - rotate: false - xy: 2021, 2621 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -toxopid-wreck0 - rotate: false - xy: 291, 2267 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck1 - rotate: false - xy: 291, 2075 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck2 - rotate: false - xy: 291, 1883 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -unit-alpha-full - rotate: false - xy: 871, 1403 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-antumbra-full - rotate: false - xy: 1477, 3291 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -unit-arkyid-full - rotate: false - xy: 3643, 3191 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-atrax-full - rotate: false - xy: 1171, 1871 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -unit-beta-full - rotate: false - xy: 871, 1353 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-bryde-full - rotate: false - xy: 259, 261 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -unit-crawler-full - rotate: false - xy: 871, 1303 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 871, 1253 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-eclipse-full - rotate: false - xy: 1000, 3775 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -unit-flare-full - rotate: false - xy: 871, 1203 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-full - rotate: false - xy: 1009, 2477 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -unit-gamma-full - rotate: false - xy: 805, 977 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-horizon-full - rotate: false - xy: 2147, 2893 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -unit-mace-full - rotate: false - xy: 2087, 2555 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-mega-full - rotate: false - xy: 907, 2395 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -unit-minke-full - rotate: false - xy: 3513, 3061 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-mono-full - rotate: false - xy: 867, 1153 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 805, 919 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-poly-full - rotate: false - xy: 805, 861 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 1989, 2241 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -unit-quasar-full - rotate: false - xy: 1267, 2171 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -unit-reign-full - rotate: false - xy: 1703, 3665 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -unit-risso-full - rotate: false - xy: 975, 1595 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -unit-scepter-full - rotate: false - xy: 1897, 3443 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -unit-spiroct-full - rotate: false - xy: 1171, 2201 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -unit-toxopid-full - rotate: false - xy: 291, 1691 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -unit-zenith-full - rotate: false - xy: 3643, 3077 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -wave - rotate: false - xy: 2121, 2423 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -zenith-wreck0 - rotate: false - xy: 3757, 2963 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck1 - rotate: false - xy: 679, 2485 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck2 - rotate: false - xy: 793, 2485 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -item-blast-compound - rotate: false - xy: 1019, 1077 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal - rotate: false - xy: 1087, 1077 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper - rotate: false - xy: 947, 1009 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite - rotate: false - xy: 981, 1009 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead - rotate: false - xy: 1015, 1009 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass - rotate: false - xy: 1049, 1009 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric - rotate: false - xy: 1083, 1009 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium - rotate: false - xy: 981, 975 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite - rotate: false - xy: 1049, 975 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand - rotate: false - xy: 1125, 1519 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap - rotate: false - xy: 1125, 1451 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon - rotate: false - xy: 1125, 1383 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod - rotate: false - xy: 1125, 1281 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy - rotate: false - xy: 1125, 1213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium - rotate: false - xy: 1121, 1145 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium - rotate: false - xy: 1121, 1077 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid - rotate: false - xy: 947, 941 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil - rotate: false - xy: 947, 873 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag - rotate: false - xy: 981, 839 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water - rotate: false - xy: 1015, 839 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blank - rotate: false - xy: 1111, 2477 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -circle - rotate: false - xy: 2127, 3604 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 -shape-3 - rotate: false - xy: 2121, 2292 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 1837, 3033 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 805, 757 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -antumbra - rotate: false - xy: 1259, 3307 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-cell - rotate: false - xy: 1033, 2855 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -arkyid - rotate: false - xy: 259, 131 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-cell - rotate: false - xy: 217, 1 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 arkyid-foot rotate: false - xy: 673, 1139 + xy: 3652, 2605 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-joint-base rotate: false - xy: 745, 1139 + xy: 3601, 2533 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-leg rotate: false - xy: 517, 1131 + xy: 1063, 3315 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 arkyid-leg-base rotate: false - xy: 3787, 3515 + xy: 1479, 3709 size: 104, 64 orig: 104, 64 offset: 0, 0 index: -1 -atrax +arkyid-outline rotate: false - xy: 1111, 2518 - size: 88, 64 - orig: 88, 64 + xy: 3263, 3229 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -atrax-base +arkyid-wreck0 rotate: false - xy: 939, 2663 - size: 64, 64 - orig: 64, 64 + xy: 3393, 3229 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -atrax-cell +arkyid-wreck1 rotate: false - xy: 1171, 2135 - size: 88, 64 - orig: 88, 64 + xy: 1397, 6 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-wreck2 + rotate: false + xy: 1805, 1278 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +artillery-mount-outline + rotate: false + xy: 3724, 2605 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +artillery-outline + rotate: false + xy: 4043, 3115 + size: 48, 56 + orig: 48, 56 offset: 0, 0 index: -1 atrax-foot rotate: false - xy: 771, 1211 + xy: 1585, 3733 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 atrax-joint rotate: false - xy: 1143, 1567 + xy: 1317, 3183 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 atrax-leg rotate: false - xy: 356, 3747 + xy: 1279, 3183 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 atrax-leg-base rotate: false - xy: 1, 1 + xy: 1817, 1408 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 -beta +atrax-outline rotate: false - xy: 805, 499 - size: 48, 48 - orig: 48, 48 + xy: 1935, 1158 + size: 88, 64 + orig: 88, 64 offset: 0, 0 index: -1 -beta-cell +atrax-wreck0 rotate: false - xy: 805, 449 - size: 48, 48 - orig: 48, 48 + xy: 3907, 3013 + size: 88, 64 + orig: 88, 64 offset: 0, 0 index: -1 -bryde +atrax-wreck1 rotate: false - xy: 291, 971 - size: 140, 140 - orig: 140, 140 + xy: 691, 27 + size: 88, 64 + orig: 88, 64 offset: 0, 0 index: -1 -bryde-cell +atrax-wreck2 rotate: false - xy: 291, 829 - size: 140, 140 - orig: 140, 140 + xy: 91, 7 + size: 88, 64 + orig: 88, 64 offset: 0, 0 index: -1 -crawler +beam-weapon-outline rotate: false - xy: 3579, 2961 - size: 48, 48 - orig: 48, 48 + xy: 3477, 2611 + size: 80, 80 + orig: 80, 80 offset: 0, 0 index: -1 -crawler-base +beta-outline rotate: false - xy: 2107, 2241 - size: 48, 48 - orig: 48, 48 + xy: 2683, 2979 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 -crawler-cell +beta-wreck0 rotate: false - xy: 2157, 2242 - size: 48, 48 - orig: 48, 48 + xy: 3016, 2799 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 -crawler-leg +beta-wreck1 rotate: false - xy: 2129, 2769 - size: 48, 48 - orig: 48, 48 + xy: 3161, 2419 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 -dagger +beta-wreck2 rotate: false - xy: 771, 1453 - size: 48, 48 - orig: 48, 48 + xy: 2965, 2407 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 -dagger-base +block-additive-reconstructor-full rotate: false - xy: 771, 1403 - size: 48, 48 - orig: 48, 48 + xy: 3281, 2891 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 -dagger-leg +block-air-factory-full rotate: false - xy: 771, 1353 - size: 48, 48 - orig: 48, 48 + xy: 3281, 2793 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 -eclipse +block-arc-full rotate: false - xy: 1, 3425 - size: 320, 320 - orig: 320, 320 + xy: 2291, 12 + size: 32, 32 + orig: 32, 32 offset: 0, 0 index: -1 -eclipse-cell +block-basalt-full rotate: false - xy: 356, 3775 - size: 320, 320 - orig: 320, 320 + xy: 2357, 1186 + size: 32, 32 + orig: 32, 32 offset: 0, 0 index: -1 -flare +block-blast-drill-full rotate: false - xy: 821, 1289 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress - rotate: false - xy: 549, 2503 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-base - rotate: false - xy: 607, 857 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -fortress-cell - rotate: false - xy: 3889, 3427 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-leg - rotate: false - xy: 1793, 2827 - size: 80, 60 - orig: 80, 60 - offset: 0, 0 - index: -1 -gamma - rotate: false - xy: 2049, 2233 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-cell - rotate: false - xy: 531, 1073 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -horizon - rotate: false - xy: 443, 1113 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-cell - rotate: false - xy: 1349, 2179 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -mace - rotate: false - xy: 739, 677 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-base - rotate: false - xy: 607, 659 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-cell - rotate: false - xy: 673, 611 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-leg - rotate: false - xy: 739, 611 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mega - rotate: false - xy: 3991, 3325 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-cell - rotate: false - xy: 3889, 3243 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -minke - rotate: false - xy: 2863, 3191 + xy: 1899, 758 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -minke-cell +block-boulder-full rotate: false - xy: 2993, 3191 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -mono - rotate: false - xy: 2253, 2493 + xy: 1001, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -mono-cell +block-char-full rotate: false - xy: 2187, 2325 - size: 48, 48 - orig: 48, 48 + xy: 2353, 1118 + size: 32, 32 + orig: 32, 32 offset: 0, 0 index: -1 -nova +block-command-center-full rotate: false - xy: 531, 841 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 2207, 2193 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-cell - rotate: false - xy: 531, 783 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-leg - rotate: false - xy: 2257, 2243 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -poly - rotate: false - xy: 531, 551 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-cell - rotate: false - xy: 531, 493 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -power-cell - rotate: false - xy: 531, 261 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar - rotate: false - xy: 1793, 2483 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-base - rotate: false - xy: 2257, 2193 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pulsar-cell - rotate: false - xy: 939, 2613 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-leg - rotate: false - xy: 651, 131 + xy: 1961, 2212 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -quasar +block-conduit-full rotate: false - xy: 1983, 2885 - size: 80, 80 - orig: 80, 80 + xy: 2391, 1186 + size: 32, 32 + orig: 32, 32 offset: 0, 0 index: -1 -quasar-base +block-container-full rotate: false - xy: 2065, 2885 - size: 80, 80 - orig: 80, 80 + xy: 1895, 2146 + size: 64, 64 + orig: 64, 64 offset: 0, 0 index: -1 -quasar-cell +block-conveyor-full rotate: false - xy: 1171, 1567 - size: 80, 80 - orig: 80, 80 + xy: 2387, 1152 + size: 32, 32 + orig: 32, 32 offset: 0, 0 index: -1 -quasar-leg +conveyor-0-0 rotate: false - xy: 1267, 2253 - size: 80, 80 - orig: 80, 80 + xy: 2387, 1152 + size: 32, 32 + orig: 32, 32 offset: 0, 0 index: -1 -reign +block-core-foundation-full rotate: false - xy: 1, 29 + xy: 1887, 628 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-core-nucleus-full + rotate: false + xy: 1423, 784 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-core-shard-full + rotate: false + xy: 3379, 2903 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-craters-full + rotate: false + xy: 2387, 1118 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cryofluid-mixer-full + rotate: false + xy: 1961, 2146 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cultivator-full + rotate: false + xy: 1891, 2080 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cyclone-full + rotate: false + xy: 3379, 2805 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-dacite-boulder-full + rotate: false + xy: 3035, 2195 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-full + rotate: false + xy: 2319, 1092 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-full + rotate: false + xy: 2311, 1058 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-metal-full + rotate: false + xy: 2311, 1024 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-full + rotate: false + xy: 2311, 990 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-full + rotate: false + xy: 2311, 956 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-full + rotate: false + xy: 2311, 922 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dune-wall-full + rotate: false + xy: 2353, 1084 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-full + rotate: false + xy: 2387, 1084 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-full + rotate: false + xy: 2837, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +block-foreshadow-full + rotate: false + xy: 1887, 498 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-fuse-full + rotate: false + xy: 3379, 2707 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-grass-full + rotate: false + xy: 2345, 1050 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ground-factory-full + rotate: false + xy: 3379, 2609 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-hail-full + rotate: false + xy: 2345, 1016 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-full + rotate: false + xy: 2379, 1050 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-full + rotate: false + xy: 2345, 982 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-full + rotate: false + xy: 2379, 1016 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-full + rotate: false + xy: 2345, 948 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-impact-reactor-full + rotate: false + xy: 1887, 368 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-lancer-full + rotate: false + xy: 1957, 2080 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-laser-drill-full + rotate: false + xy: 1703, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-liquid-router-full + rotate: false + xy: 2379, 982 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-tank-full + rotate: false + xy: 1801, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-magmarock-full + rotate: false + xy: 2379, 948 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-driver-full + rotate: false + xy: 1997, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-mechanical-drill-full + rotate: false + xy: 1947, 2014 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-meltdown-full + rotate: false + xy: 1883, 238 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-full + rotate: false + xy: 2345, 914 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-full + rotate: false + xy: 2311, 888 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mud-full + rotate: false + xy: 2277, 872 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-full + rotate: false + xy: 1401, 622 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-naval-factory-full + rotate: false + xy: 2095, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-oil-extractor-full + rotate: false + xy: 2193, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-ore-coal-full + rotate: false + xy: 2345, 880 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-copper-full + rotate: false + xy: 2379, 880 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-lead-full + rotate: false + xy: 2269, 838 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-scrap-full + rotate: false + xy: 2269, 804 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-thorium-full + rotate: false + xy: 2269, 770 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-titanium-full + rotate: false + xy: 2311, 854 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-parallax-full + rotate: false + xy: 1947, 1948 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-payload-conveyor-full + rotate: false + xy: 2291, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor-icon + rotate: false + xy: 2291, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-payload-router-full + rotate: false + xy: 2389, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-icon + rotate: false + xy: 2389, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-pebbles-full + rotate: false + xy: 2345, 846 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-weaver-full + rotate: false + xy: 1947, 1882 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-plated-conduit-full + rotate: false + xy: 2379, 846 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-full + rotate: false + xy: 1947, 1816 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-pulse-conduit-full + rotate: false + xy: 2303, 820 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-full + rotate: false + xy: 2303, 786 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-full + rotate: false + xy: 2337, 812 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ripple-full + rotate: false + xy: 2487, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-salt-wall-full + rotate: false + xy: 2371, 812 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-full + rotate: false + xy: 1947, 1750 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-sand-boulder-full + rotate: false + xy: 2337, 778 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-full + rotate: false + xy: 2371, 778 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-full + rotate: false + xy: 2303, 752 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-full + rotate: false + xy: 1947, 1684 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-scorch-full + rotate: false + xy: 2337, 744 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-full + rotate: false + xy: 2371, 744 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall1 + rotate: false + xy: 2371, 744 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-full + rotate: false + xy: 2585, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-huge1 + rotate: false + xy: 2585, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-scrap-wall-large-full + rotate: false + xy: 1947, 1618 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-segment-full + rotate: false + xy: 1947, 1552 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-shale-boulder-full + rotate: false + xy: 1638, 2965 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-full + rotate: false + xy: 2575, 2159 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-wall-full + rotate: false + xy: 2575, 2125 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-full + rotate: false + xy: 2361, 2052 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-boulder-full + rotate: false + xy: 1554, 2999 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-full + rotate: false + xy: 2361, 2018 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-full + rotate: false + xy: 2361, 1984 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-full + rotate: false + xy: 1883, 108 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-spore-cluster-full + rotate: false + xy: 1891, 2038 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-full + rotate: false + xy: 2361, 1950 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-full + rotate: false + xy: 3829, 2792 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-spore-wall-full + rotate: false + xy: 2361, 1916 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-steam-generator-full + rotate: false + xy: 3895, 2783 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-stone-full + rotate: false + xy: 2361, 1882 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-full + rotate: false + xy: 2361, 1848 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-full + rotate: false + xy: 3824, 2726 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-tendrils-full + rotate: false + xy: 2361, 1814 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-full + rotate: false + xy: 1, 1233 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +block-titanium-conveyor-full + rotate: false + xy: 2361, 1780 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-0 + rotate: false + xy: 2361, 1780 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tsunami-full + rotate: false + xy: 1644, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-vault-full + rotate: false + xy: 1742, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-water-extractor-full + rotate: false + xy: 3890, 2717 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-wave-full + rotate: false + xy: 3808, 2660 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +bryde-outline + rotate: false + xy: 1663, 1124 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck0 + rotate: false + xy: 1757, 982 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck1 + rotate: false + xy: 1757, 840 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck2 + rotate: false + xy: 2979, 3217 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +command-center-team-crux + rotate: false + xy: 3940, 2643 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-team-sharded + rotate: false + xy: 4027, 2775 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team-crux + rotate: false + xy: 2185, 2301 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team-sharded + rotate: false + xy: 2251, 2301 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +core-foundation-team-crux + rotate: false + xy: 2017, 368 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation-team-sharded + rotate: false + xy: 2013, 238 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-nucleus-team-crux + rotate: false + xy: 1397, 136 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team-sharded + rotate: false + xy: 1501, 2066 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-shard-team-crux + rotate: false + xy: 1938, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team-sharded + rotate: false + xy: 1840, 2741 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +corvus-foot + rotate: false + xy: 507, 1 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +corvus-joint + rotate: false + xy: 2147, 368 + size: 60, 60 + orig: 60, 60 + offset: 0, 0 + index: -1 +corvus-joint-base + rotate: false + xy: 3745, 2533 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +toxopid-joint-base + rotate: false + xy: 3745, 2533 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +corvus-leg + rotate: false + xy: 291, 1453 + size: 30, 68 + orig: 30, 68 + offset: 0, 0 + index: -1 +corvus-leg-base + rotate: false + xy: 573, 1283 + size: 30, 64 + orig: 30, 64 + offset: 0, 0 + index: -1 +corvus-outline + rotate: false + xy: 2757, 3201 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 -reign-base +corvus-wreck0 rotate: false - xy: 291, 1565 - size: 152, 124 - orig: 152, 124 + xy: 1016, 2927 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -reign-cell +corvus-wreck1 rotate: false - xy: 291, 1439 - size: 152, 124 - orig: 152, 124 + xy: 1016, 2785 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-wreck2 + rotate: false + xy: 983, 2643 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +cracks-1-0 + rotate: false + xy: 2381, 540 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-1 + rotate: false + xy: 2381, 506 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-2 + rotate: false + xy: 2381, 472 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-3 + rotate: false + xy: 2381, 438 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-4 + rotate: false + xy: 2385, 404 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-5 + rotate: false + xy: 3587, 2421 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-6 + rotate: false + xy: 3587, 2387 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-7 + rotate: false + xy: 3085, 2261 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-2-0 + rotate: false + xy: 2383, 2301 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-1 + rotate: false + xy: 2449, 2301 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-2 + rotate: false + xy: 2515, 2301 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-3 + rotate: false + xy: 2581, 2301 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-4 + rotate: false + xy: 2647, 2311 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-5 + rotate: false + xy: 3521, 2389 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-6 + rotate: false + xy: 2713, 2315 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-7 + rotate: false + xy: 2779, 2315 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-3-0 + rotate: false + xy: 2036, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-1 + rotate: false + xy: 1938, 2741 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-2 + rotate: false + xy: 2134, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-3 + rotate: false + xy: 2036, 2741 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-4 + rotate: false + xy: 2232, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-5 + rotate: false + xy: 2134, 2741 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-6 + rotate: false + xy: 2330, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-7 + rotate: false + xy: 2232, 2741 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-4-0 + rotate: false + xy: 2013, 108 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-1 + rotate: false + xy: 2973, 3087 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-2 + rotate: false + xy: 3103, 3087 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-3 + rotate: false + xy: 3523, 3209 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-4 + rotate: false + xy: 3653, 3209 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-5 + rotate: false + xy: 3783, 3209 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-6 + rotate: false + xy: 3913, 3209 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-7 + rotate: false + xy: 3523, 3079 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-5-0 + rotate: false + xy: 1501, 1904 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-1 + rotate: false + xy: 1501, 1742 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-2 + rotate: false + xy: 1501, 1580 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-3 + rotate: false + xy: 1501, 1418 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-4 + rotate: false + xy: 1501, 1256 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-5 + rotate: false + xy: 1501, 1094 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-6 + rotate: false + xy: 1595, 932 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-7 + rotate: false + xy: 1585, 770 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-6-0 + rotate: false + xy: 1153, 2228 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-1 + rotate: false + xy: 1347, 2228 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-2 + rotate: false + xy: 1113, 2034 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-3 + rotate: false + xy: 1113, 1840 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-4 + rotate: false + xy: 1307, 2034 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-5 + rotate: false + xy: 1113, 1646 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-6 + rotate: false + xy: 1307, 1840 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-7 + rotate: false + xy: 1113, 1452 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-7-0 + rotate: false + xy: 3063, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-1 + rotate: false + xy: 3289, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-2 + rotate: false + xy: 3515, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-3 + rotate: false + xy: 3741, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-4 + rotate: false + xy: 1627, 3307 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-5 + rotate: false + xy: 1853, 3307 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-6 + rotate: false + xy: 2079, 3307 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-7 + rotate: false + xy: 2305, 3307 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-8-0 + rotate: false + xy: 573, 867 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-1 + rotate: false + xy: 573, 609 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-2 + rotate: false + xy: 573, 351 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-3 + rotate: false + xy: 573, 93 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-4 + rotate: false + xy: 1127, 3437 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-5 + rotate: false + xy: 805, 3115 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-6 + rotate: false + xy: 758, 2857 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-7 + rotate: false + xy: 725, 2599 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-9-0 + rotate: false + xy: 2495, 3807 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-1 + rotate: false + xy: 1, 943 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-2 + rotate: false + xy: 2785, 3807 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-3 + rotate: false + xy: 1, 653 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-4 + rotate: false + xy: 3075, 3807 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-5 + rotate: false + xy: 1, 363 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-6 + rotate: false + xy: 3365, 3807 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-7 + rotate: false + xy: 1, 73 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +crawler-leg + rotate: false + xy: 2165, 1346 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-outline + rotate: false + xy: 2165, 1296 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck0 + rotate: false + xy: 2165, 1246 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck1 + rotate: false + xy: 2235, 2186 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck2 + rotate: false + xy: 2225, 2136 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +cyclone + rotate: false + xy: 2428, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dagger-leg + rotate: false + xy: 2211, 1886 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-outline + rotate: false + xy: 2211, 1836 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck0 + rotate: false + xy: 2211, 1786 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck1 + rotate: false + xy: 2211, 1736 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck2 + rotate: false + xy: 2211, 1686 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +duo + rotate: false + xy: 3211, 2385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +eclipse-outline + rotate: false + xy: 1, 2167 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eclipse-wreck0 + rotate: false + xy: 403, 2621 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eclipse-wreck1 + rotate: false + xy: 1529, 3775 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eclipse-wreck2 + rotate: false + xy: 1, 1845 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eruption-outline + rotate: false + xy: 2267, 372 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flamethrower-outline + rotate: false + xy: 2273, 206 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flare-outline + rotate: false + xy: 2211, 1528 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck0 + rotate: false + xy: 2207, 1478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck1 + rotate: false + xy: 2285, 2186 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck2 + rotate: false + xy: 2275, 2136 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +foreshadow + rotate: false + xy: 3653, 3079 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +fortress-leg + rotate: false + xy: 3829, 2940 + size: 80, 60 + orig: 80, 60 + offset: 0, 0 + index: -1 +fortress-outline + rotate: false + xy: 2649, 3225 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck0 + rotate: false + xy: 1440, 2672 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck1 + rotate: false + xy: 1985, 26 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck2 + rotate: false + xy: 2087, 26 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fuse + rotate: false + xy: 1657, 2545 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +gamma-outline + rotate: false + xy: 1817, 770 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck0 + rotate: false + xy: 2617, 2377 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck1 + rotate: false + xy: 1897, 2278 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck2 + rotate: false + xy: 1967, 2278 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +hail + rotate: false + xy: 3245, 2391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +heal-shotgun-weapon-outline + rotate: false + xy: 2820, 2889 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +heal-weapon-mount-outline + rotate: false + xy: 2261, 1986 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +heal-weapon-outline + rotate: false + xy: 2261, 1936 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +horizon-outline + rotate: false + xy: 323, 2341 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck0 + rotate: false + xy: 3993, 2841 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck1 + rotate: false + xy: 3734, 2682 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck2 + rotate: false + xy: 3225, 2425 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +item-blast-compound-large + rotate: false + xy: 2273, 1236 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-blast-compound-medium + rotate: false + xy: 3313, 2357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-blast-compound-small + rotate: false + xy: 693, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-blast-compound-tiny + rotate: false + xy: 3187, 2283 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-blast-compound-xlarge + rotate: false + xy: 2261, 1886 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-coal-large + rotate: false + xy: 758, 3251 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-coal-medium + rotate: false + xy: 2325, 88 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal-small + rotate: false + xy: 1601, 3441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-coal-tiny + rotate: false + xy: 1569, 3307 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-coal-xlarge + rotate: false + xy: 2261, 1836 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-copper-large + rotate: false + xy: 1016, 3073 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-copper-medium + rotate: false + xy: 2325, 20 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper-small + rotate: false + xy: 691, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-copper-tiny + rotate: false + xy: 1151, 2625 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-copper-xlarge + rotate: false + xy: 2261, 1786 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-graphite-large + rotate: false + xy: 983, 2601 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-graphite-medium + rotate: false + xy: 2413, 1050 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite-small + rotate: false + xy: 3347, 2399 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-graphite-tiny + rotate: false + xy: 1169, 2625 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-graphite-xlarge + rotate: false + xy: 2261, 1736 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-lead-large + rotate: false + xy: 1440, 2630 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-lead-medium + rotate: false + xy: 2413, 982 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead-small + rotate: false + xy: 719, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-lead-tiny + rotate: false + xy: 4079, 3061 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-lead-xlarge + rotate: false + xy: 2261, 1686 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-metaglass-large + rotate: false + xy: 1063, 3215 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-metaglass-medium + rotate: false + xy: 2413, 914 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass-small + rotate: false + xy: 1601, 3415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-metaglass-tiny + rotate: false + xy: 4079, 3043 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-metaglass-xlarge + rotate: false + xy: 2261, 1636 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-phase-fabric-large + rotate: false + xy: 1554, 2957 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-phase-fabric-medium + rotate: false + xy: 2413, 846 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric-small + rotate: false + xy: 717, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-phase-fabric-tiny + rotate: false + xy: 4079, 3025 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-phase-fabric-xlarge + rotate: false + xy: 2261, 1586 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-plastanium-large + rotate: false + xy: 2273, 114 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-plastanium-medium + rotate: false + xy: 2405, 778 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium-small + rotate: false + xy: 3347, 2373 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-plastanium-tiny + rotate: false + xy: 4079, 3007 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-plastanium-xlarge + rotate: false + xy: 2261, 1536 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-pyratite-large + rotate: false + xy: 2273, 1194 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-pyratite-medium + rotate: false + xy: 2415, 710 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite-small + rotate: false + xy: 745, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-pyratite-tiny + rotate: false + xy: 1187, 2625 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-pyratite-xlarge + rotate: false + xy: 2335, 2193 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-sand-large + rotate: false + xy: 2227, 850 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-sand-medium + rotate: false + xy: 2415, 642 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand-small + rotate: false + xy: 1601, 3389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-sand-tiny + rotate: false + xy: 4079, 2989 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-sand-xlarge + rotate: false + xy: 2385, 2193 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-scrap-large + rotate: false + xy: 758, 3209 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-scrap-medium + rotate: false + xy: 2415, 574 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap-small + rotate: false + xy: 743, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-scrap-tiny + rotate: false + xy: 2279, 752 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-scrap-xlarge + rotate: false + xy: 2435, 2193 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-silicon-large + rotate: false + xy: 1025, 2601 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-silicon-medium + rotate: false + xy: 2415, 506 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon-small + rotate: false + xy: 771, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-silicon-tiny + rotate: false + xy: 3151, 2351 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-silicon-xlarge + rotate: false + xy: 2485, 2193 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-spore-pod-large + rotate: false + xy: 1482, 2630 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-spore-pod-medium + rotate: false + xy: 2419, 404 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod-small + rotate: false + xy: 1601, 3363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-spore-pod-tiny + rotate: false + xy: 693, 2603 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-spore-pod-xlarge + rotate: false + xy: 2535, 2193 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-surge-alloy-large + rotate: false + xy: 1596, 2957 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-surge-alloy-medium + rotate: false + xy: 3177, 2335 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy-small + rotate: false + xy: 797, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-surge-alloy-tiny + rotate: false + xy: 2595, 3547 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-surge-alloy-xlarge + rotate: false + xy: 3161, 2369 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-thorium-large + rotate: false + xy: 2315, 1194 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-thorium-medium + rotate: false + xy: 3211, 2317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium-small + rotate: false + xy: 1601, 3337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-thorium-tiny + rotate: false + xy: 983, 2839 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-thorium-xlarge + rotate: false + xy: 2215, 1428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-titanium-large + rotate: false + xy: 2227, 808 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-titanium-medium + rotate: false + xy: 3279, 2323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium-small + rotate: false + xy: 823, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-titanium-tiny + rotate: false + xy: 1353, 3419 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-titanium-xlarge + rotate: false + xy: 2215, 1378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +lancer + rotate: false + xy: 2013, 1750 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +large-artillery-outline + rotate: false + xy: 2215, 1242 + size: 48, 66 + orig: 48, 66 + offset: 0, 0 + index: -1 +large-bullet-mount-outline + rotate: false + xy: 1969, 2348 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 +large-laser-mount-outline + rotate: false + xy: 1853, 2449 + size: 96, 192 + orig: 96, 192 + offset: 0, 0 + index: -1 +large-purple-mount-outline + rotate: false + xy: 2113, 2348 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 +large-weapon-outline + rotate: false + xy: 2257, 1478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-cryofluid-large + rotate: false + xy: 758, 3167 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-cryofluid-medium + rotate: false + xy: 3279, 2289 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid-small + rotate: false + xy: 849, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-cryofluid-tiny + rotate: false + xy: 1229, 876 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-cryofluid-xlarge + rotate: false + xy: 2265, 1428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-oil-large + rotate: false + xy: 1067, 2601 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-oil-medium + rotate: false + xy: 3153, 2233 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil-small + rotate: false + xy: 1601, 3311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-oil-tiny + rotate: false + xy: 1401, 786 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-oil-xlarge + rotate: false + xy: 2265, 1378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-slag-large + rotate: false + xy: 2227, 766 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-slag-medium + rotate: false + xy: 3255, 2221 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag-small + rotate: false + xy: 725, 2917 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-slag-tiny + rotate: false + xy: 1663, 1106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-slag-xlarge + rotate: false + xy: 2265, 1328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-water-large + rotate: false + xy: 758, 3125 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-water-medium + rotate: false + xy: 3323, 2221 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water-small + rotate: false + xy: 2495, 3781 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-water-tiny + rotate: false + xy: 3945, 3863 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-water-xlarge + rotate: false + xy: 2265, 1278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mace-leg + rotate: false + xy: 2033, 1354 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-outline + rotate: false + xy: 2033, 1288 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck0 + rotate: false + xy: 2033, 1222 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck1 + rotate: false + xy: 2025, 1156 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck2 + rotate: false + xy: 2029, 1090 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mass-driver + rotate: false + xy: 2441, 2643 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mega-outline + rotate: false + xy: 3179, 2871 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck0 + rotate: false + xy: 3077, 2769 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck1 + rotate: false + xy: 3179, 2769 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck2 + rotate: false + xy: 1542, 2853 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +meltdown + rotate: false + xy: 1833, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +minke-outline + rotate: false + xy: 3477, 2796 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck0 + rotate: false + xy: 3567, 2899 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck1 + rotate: false + xy: 3477, 2693 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck2 + rotate: false + xy: 3567, 2796 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +missiles-mount-outline + rotate: false + xy: 2311, 2036 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-outline + rotate: false + xy: 2311, 1886 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck0 + rotate: false + xy: 2311, 1836 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck1 + rotate: false + xy: 2311, 1786 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck2 + rotate: false + xy: 2311, 1736 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-purple-weapon-outline + rotate: false + xy: 2311, 1636 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-weapon-outline + rotate: false + xy: 2311, 1536 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-leg + rotate: false + xy: 2425, 2143 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-outline + rotate: false + xy: 1063, 3257 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck0 + rotate: false + xy: 2358, 2243 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck1 + rotate: false + xy: 2416, 2243 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck2 + rotate: false + xy: 2474, 2243 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +oct-outline + rotate: false + xy: 403, 3695 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck0 + rotate: false + xy: 1, 2891 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck1 + rotate: false + xy: 403, 3293 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck2 + rotate: false + xy: 805, 3695 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +omura-cannon-outline + rotate: false + xy: 1057, 894 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 +omura-outline + rotate: false + xy: 291, 545 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck0 + rotate: false + xy: 291, 143 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck1 + rotate: false + xy: 613, 1929 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck2 + rotate: false + xy: 613, 1527 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +parallax + rotate: false + xy: 2095, 958 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +poly-outline + rotate: false + xy: 1623, 3107 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck0 + rotate: false + xy: 2149, 1504 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck1 + rotate: false + xy: 2149, 1446 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck2 + rotate: false + xy: 1565, 3049 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar-leg + rotate: false + xy: 2845, 2199 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pulsar-outline + rotate: false + xy: 2037, 2288 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck0 + rotate: false + xy: 2107, 2288 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck1 + rotate: false + xy: 1801, 2235 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck2 + rotate: false + xy: 2687, 2387 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +quad-outline + rotate: false + xy: 831, 7 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck0 + rotate: false + xy: 2757, 3343 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck1 + rotate: false + xy: 2979, 3359 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck2 + rotate: false + xy: 3201, 3359 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quasar-leg + rotate: false + xy: 1307, 12 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-outline + rotate: false + xy: 3519, 2529 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck0 + rotate: false + xy: 3997, 2997 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck1 + rotate: false + xy: 3993, 2915 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck2 + rotate: false + xy: 3829, 2858 + size: 80, 80 + orig: 80, 80 offset: 0, 0 index: -1 reign-leg rotate: false - xy: 291, 1313 + xy: 1663, 1534 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 -risso +reign-outline rotate: false - xy: 975, 2281 + xy: 1353, 3183 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-weapon-outline + rotate: false + xy: 3657, 2759 + size: 83, 138 + orig: 83, 138 + offset: 0, 0 + index: -1 +reign-wreck0 + rotate: false + xy: 1569, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck1 + rotate: false + xy: 1785, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck2 + rotate: false + xy: 2001, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +repair-point + rotate: false + xy: 3493, 2269 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ripple + rotate: false + xy: 2735, 2451 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -risso-cell +risso-outline rotate: false - xy: 1073, 2281 - size: 96, 96 - orig: 96, 96 + xy: 2257, 2367 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 -scepter +risso-wreck0 rotate: false - xy: 3914, 3955 - size: 170, 140 - orig: 170, 140 + xy: 2329, 2367 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 -scepter-base +risso-wreck1 rotate: false - xy: 3383, 3159 - size: 128, 128 - orig: 128, 128 + xy: 2401, 2367 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 -scepter-cell +risso-wreck2 rotate: false - xy: 3527, 3451 - size: 128, 128 - orig: 128, 128 + xy: 2473, 2367 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +salvo + rotate: false + xy: 2079, 1750 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scatter + rotate: false + xy: 2079, 1618 + size: 64, 64 + orig: 64, 64 offset: 0, 0 index: -1 scepter-leg rotate: false - xy: 3657, 3451 + xy: 2483, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -spiroct +vela-leg rotate: false - xy: 1111, 2584 - size: 94, 75 - orig: 94, 75 + xy: 2483, 3035 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -spiroct-cell +scepter-outline rotate: false - xy: 3027, 3114 - size: 94, 75 - orig: 94, 75 + xy: 1251, 946 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-weapon-outline + rotate: false + xy: 2977, 2199 + size: 56, 102 + orig: 56, 102 + offset: 0, 0 + index: -1 +scepter-wreck0 + rotate: false + xy: 1057, 610 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck1 + rotate: false + xy: 1053, 468 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck2 + rotate: false + xy: 1053, 326 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scorch + rotate: false + xy: 3459, 2167 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +segment + rotate: false + xy: 2099, 1288 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sei-launcher-outline + rotate: false + xy: 3747, 2838 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +sei-outline + rotate: false + xy: 1627, 3533 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck0 + rotate: false + xy: 1869, 3533 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck1 + rotate: false + xy: 2111, 3533 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck2 + rotate: false + xy: 2353, 3533 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +small-basic-weapon-outline + rotate: false + xy: 2307, 1486 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-mount-weapon-outline + rotate: false + xy: 2315, 1386 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spectre + rotate: false + xy: 2743, 3071 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 spiroct-foot rotate: false - xy: 927, 1563 + xy: 1609, 2425 size: 46, 46 orig: 46, 46 offset: 0, 0 index: -1 spiroct-joint rotate: false - xy: 1041, 567 + xy: 3527, 2219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spiroct-leg rotate: false - xy: 1837, 2997 + xy: 3323, 2609 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 spiroct-leg-base rotate: false - xy: 3773, 3196 + xy: 4043, 3079 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 -toxopid +spiroct-outline rotate: false - xy: 3365, 3419 - size: 160, 190 - orig: 160, 190 + xy: 1801, 2295 + size: 94, 75 + orig: 94, 75 offset: 0, 0 index: -1 -toxopid-cannon +spiroct-weapon-outline rotate: false - xy: 1919, 3585 + xy: 2365, 1370 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +spiroct-wreck0 + rotate: false + xy: 3523, 3002 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck1 + rotate: false + xy: 3619, 3002 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck2 + rotate: false + xy: 3715, 3002 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +splash-0 + rotate: false + xy: 3527, 2185 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-1 + rotate: false + xy: 3527, 2151 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-10 + rotate: false + xy: 3595, 2183 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-11 + rotate: false + xy: 3595, 2149 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-2 + rotate: false + xy: 3561, 2285 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-3 + rotate: false + xy: 3561, 2251 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-4 + rotate: false + xy: 3561, 2217 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-5 + rotate: false + xy: 3561, 2183 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-6 + rotate: false + xy: 3561, 2149 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-7 + rotate: false + xy: 3595, 2285 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-8 + rotate: false + xy: 3595, 2251 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-9 + rotate: false + xy: 3595, 2217 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +swarmer + rotate: false + xy: 2089, 2090 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +toxopid-cannon-outline + rotate: false + xy: 1232, 2625 size: 206, 220 orig: 206, 220 offset: 0, 0 index: -1 -toxopid-cell - rotate: false - xy: 291, 1187 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 toxopid-foot rotate: false - xy: 1891, 2895 + xy: 599, 1 size: 90, 90 orig: 90, 90 offset: 0, 0 index: -1 -toxopid-joint-base - rotate: false - xy: 1335, 1901 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 toxopid-leg rotate: false - xy: 291, 1113 + xy: 3945, 4023 size: 150, 72 orig: 150, 72 offset: 0, 0 index: -1 toxopid-leg-base rotate: false - xy: 3384, 4031 + xy: 1207, 3709 size: 270, 64 orig: 270, 64 offset: 0, 0 index: -1 +toxopid-outline + rotate: false + xy: 1725, 386 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck0 + rotate: false + xy: 1721, 194 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck1 + rotate: false + xy: 1721, 2 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck2 + rotate: false + xy: 1541, 2230 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +tsunami + rotate: false + xy: 3127, 2475 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +unit-alpha-full + rotate: false + xy: 2365, 1320 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-antumbra-full + rotate: false + xy: 895, 1389 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +unit-arkyid-full + rotate: false + xy: 2873, 2957 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +unit-atrax-full + rotate: false + xy: 181, 7 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +unit-beta-full + rotate: false + xy: 3035, 2353 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +unit-bryde-full + rotate: false + xy: 3121, 3217 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +unit-corvus-full + rotate: false + xy: 2217, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +unit-crawler-full + rotate: false + xy: 2365, 1270 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-dagger-full + rotate: false + xy: 2315, 1236 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-eclipse-full + rotate: false + xy: 1851, 3775 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +unit-flare-full + rotate: false + xy: 2365, 1220 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-fortress-full + rotate: false + xy: 1542, 2771 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +unit-gamma-full + rotate: false + xy: 2757, 2381 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +unit-horizon-full + rotate: false + xy: 3521, 2455 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +unit-mace-full + rotate: false + xy: 2145, 2024 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-mega-full + rotate: false + xy: 1542, 2669 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +unit-minke-full + rotate: false + xy: 3657, 2899 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +unit-mono-full + rotate: false + xy: 2227, 1142 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-nova-full + rotate: false + xy: 3035, 2295 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-oct-full + rotate: false + xy: 1, 2489 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +unit-omura-full + rotate: false + xy: 605, 1125 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +unit-poly-full + rotate: false + xy: 3093, 2351 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-pulsar-full + rotate: false + xy: 1825, 2175 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +unit-quad-full + rotate: false + xy: 3423, 3359 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +unit-quasar-full + rotate: false + xy: 3742, 2756 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +unit-reign-full + rotate: false + xy: 2433, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +unit-risso-full + rotate: false + xy: 2545, 2367 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +unit-scepter-full + rotate: false + xy: 1053, 184 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +unit-sei-full + rotate: false + xy: 2595, 3565 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +unit-spiroct-full + rotate: false + xy: 3811, 3002 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +unit-toxopid-full + rotate: false + xy: 1663, 2038 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +unit-vela-full + rotate: false + xy: 1053, 42 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +unit-zenith-full + rotate: false + xy: 1279, 3069 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +vault-team-crux + rotate: false + xy: 1703, 2349 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault-team-sharded + rotate: false + xy: 1703, 2251 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vela-outline + rotate: false + xy: 1229, 520 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck0 + rotate: false + xy: 1225, 236 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck1 + rotate: false + xy: 1225, 94 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck2 + rotate: false + xy: 1423, 946 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +wave + rotate: false + xy: 2145, 1694 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +zenith-missiles-outline + rotate: false + xy: 2227, 892 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +zenith-outline + rotate: false + xy: 3003, 2973 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck0 + rotate: false + xy: 3117, 2973 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck1 + rotate: false + xy: 1527, 8 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck2 + rotate: false + xy: 1440, 2955 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +item-blast-compound + rotate: false + xy: 3279, 2357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal + rotate: false + xy: 2315, 122 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper + rotate: false + xy: 2325, 54 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite + rotate: false + xy: 2590, 2217 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead + rotate: false + xy: 2413, 1016 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass + rotate: false + xy: 2413, 948 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric + rotate: false + xy: 2413, 880 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium + rotate: false + xy: 2405, 812 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite + rotate: false + xy: 2405, 744 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand + rotate: false + xy: 2415, 676 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap + rotate: false + xy: 2415, 608 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon + rotate: false + xy: 2415, 540 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod + rotate: false + xy: 2415, 438 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy + rotate: false + xy: 3143, 2317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium + rotate: false + xy: 3177, 2301 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium + rotate: false + xy: 3245, 2323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid + rotate: false + xy: 3245, 2289 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil + rotate: false + xy: 3153, 2267 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag + rotate: false + xy: 3255, 2255 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water + rotate: false + xy: 3323, 2255 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +blank + rotate: false + xy: 3734, 2756 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +circle + rotate: false + xy: 1153, 2422 + size: 201, 201 + orig: 201, 201 + offset: 0, 0 + index: -1 +shape-3 + rotate: false + xy: 2235, 2236 + size: 63, 63 + orig: 63, 63 + offset: 0, 0 + index: -1 +alpha + rotate: false + xy: 781, 43 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-cell + rotate: false + xy: 1559, 2423 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +antumbra + rotate: false + xy: 3645, 3339 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +antumbra-cell + rotate: false + xy: 3863, 3339 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +arkyid + rotate: false + xy: 3967, 3751 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-cell + rotate: false + xy: 3967, 3621 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +atrax + rotate: false + xy: 1, 7 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-base + rotate: false + xy: 1825, 2109 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +atrax-cell + rotate: false + xy: 1001, 1181 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +beta + rotate: false + xy: 1507, 3127 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-cell + rotate: false + xy: 3093, 2301 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +bryde + rotate: false + xy: 1663, 1266 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-cell + rotate: false + xy: 3945, 3881 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +corvus + rotate: false + xy: 291, 1 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-base + rotate: false + xy: 1663, 1912 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +corvus-cell + rotate: false + xy: 887, 1247 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-weapon-heat + rotate: false + xy: 1063, 3069 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +crawler + rotate: false + xy: 3817, 2560 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-base + rotate: false + xy: 3817, 2510 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-cell + rotate: false + xy: 2165, 1396 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger + rotate: false + xy: 2211, 1986 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-base + rotate: false + xy: 2211, 1936 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +eclipse + rotate: false + xy: 805, 3373 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eclipse-cell + rotate: false + xy: 1207, 3775 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +flare + rotate: false + xy: 2273, 156 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +fortress + rotate: false + xy: 1883, 26 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-base + rotate: false + xy: 2013, 2014 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +fortress-cell + rotate: false + xy: 1817, 1436 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +gamma + rotate: false + xy: 1747, 770 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-cell + rotate: false + xy: 1507, 3069 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +horizon + rotate: false + xy: 323, 2415 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-cell + rotate: false + xy: 1641, 48 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +mace + rotate: false + xy: 2023, 2080 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-base + rotate: false + xy: 2017, 1486 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-cell + rotate: false + xy: 2017, 1420 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mega + rotate: false + xy: 2975, 2855 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-cell + rotate: false + xy: 3077, 2871 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +minke + rotate: false + xy: 3477, 2899 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-cell + rotate: false + xy: 2093, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +mono + rotate: false + xy: 2311, 1986 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-cell + rotate: false + xy: 2311, 1936 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova + rotate: false + xy: 2300, 2243 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-base + rotate: false + xy: 2375, 2143 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-cell + rotate: false + xy: 2209, 372 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +oct + rotate: false + xy: 1, 3695 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-cell + rotate: false + xy: 1, 3293 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +omura + rotate: false + xy: 323, 1349 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-cannon-heat + rotate: false + xy: 1113, 1173 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 +omura-cell + rotate: false + xy: 291, 947 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +poly + rotate: false + xy: 2532, 2243 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-cell + rotate: false + xy: 1565, 3107 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +power-cell + rotate: false + xy: 1623, 3049 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar + rotate: false + xy: 2649, 3165 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-base + rotate: false + xy: 2475, 2143 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +pulsar-cell + rotate: false + xy: 507, 93 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 +quad + rotate: false + xy: 831, 451 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-cell + rotate: false + xy: 831, 229 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quasar + rotate: false + xy: 3652, 2677 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-base + rotate: false + xy: 3911, 2931 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-cell + rotate: false + xy: 1225, 12 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +reign + rotate: false + xy: 1385, 3325 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-base + rotate: false + xy: 1663, 1786 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-cell + rotate: false + xy: 1663, 1660 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +risso + rotate: false + xy: 2185, 2367 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +risso-cell + rotate: false + xy: 2833, 2561 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scepter + rotate: false + xy: 1057, 752 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-base + rotate: false + xy: 2223, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +vela-base + rotate: false + xy: 2223, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-cell + rotate: false + xy: 2353, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +sei + rotate: false + xy: 693, 2357 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-cell + rotate: false + xy: 1385, 3467 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +spiroct + rotate: false + xy: 3427, 3022 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-cell + rotate: false + xy: 1801, 2372 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +toxopid + rotate: false + xy: 1725, 578 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-cannon + rotate: false + xy: 1232, 2847 + size: 206, 220 + orig: 206, 220 + offset: 0, 0 + index: -1 +toxopid-cell + rotate: false + xy: 1663, 1408 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 vanguard rotate: false - xy: 867, 1103 + xy: 2227, 1092 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vanguard-cell rotate: false - xy: 863, 1053 + xy: 2227, 1042 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +vela + rotate: false + xy: 1251, 804 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-cell + rotate: false + xy: 1229, 662 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-weapon-heat + rotate: false + xy: 1225, 378 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 artillery rotate: false - xy: 805, 549 + xy: 4043, 3173 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 artillery-mount rotate: false - xy: 1571, 2181 + xy: 3673, 2533 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 beam-weapon rotate: false - xy: 1171, 1649 + xy: 3747, 2920 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 eruption rotate: false - xy: 821, 1447 + xy: 2211, 1578 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun rotate: false - xy: 821, 1397 + xy: 2273, 322 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower rotate: false - xy: 821, 1339 + xy: 2273, 264 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-shotgun-weapon rotate: false - xy: 1401, 1799 - size: 48, 48 - orig: 48, 48 + xy: 1251, 1121 + size: 50, 50 + orig: 50, 50 offset: 0, 0 index: -1 heal-weapon rotate: false - xy: 1451, 1799 + xy: 2271, 2086 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 heal-weapon-mount rotate: false - xy: 1501, 1799 + xy: 2261, 2036 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 large-artillery rotate: false - xy: 2203, 2525 + xy: 2215, 1310 size: 48, 66 orig: 48, 66 offset: 0, 0 index: -1 large-bullet-mount rotate: false - xy: 1335, 2072 + xy: 1897, 2348 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount rotate: false - xy: 779, 2193 + xy: 1755, 2449 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 large-purple-mount rotate: false - xy: 1335, 1973 + xy: 2041, 2348 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-weapon rotate: false - xy: 2153, 2493 + xy: 2223, 1192 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles rotate: false - xy: 2253, 2593 + xy: 2325, 2136 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-mount rotate: false - xy: 2253, 2543 + xy: 2321, 2086 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-purple-weapon rotate: false - xy: 2237, 2293 + xy: 2311, 1686 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-weapon rotate: false - xy: 2207, 2243 + xy: 2311, 1586 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +omura-cannon + rotate: false + xy: 1307, 1367 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 +omura-cannon-heat + rotate: false + xy: 1307, 1088 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 reign-weapon rotate: false - xy: 1171, 1731 + xy: 3567, 2656 size: 83, 138 orig: 83, 138 offset: 0, 0 index: -1 scepter-weapon rotate: false - xy: 805, 1035 + xy: 2977, 2303 size: 56, 102 orig: 56, 102 offset: 0, 0 index: -1 +sei-launcher + rotate: false + xy: 3911, 2849 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 small-basic-weapon rotate: false - xy: 2287, 2293 + xy: 2525, 2143 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-mount-weapon rotate: false - xy: 2307, 2243 + xy: 2315, 1436 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-weapon rotate: false - xy: 2307, 2193 + xy: 2315, 1336 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spiroct-weapon rotate: false - xy: 871, 1453 + xy: 2365, 1428 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 weapon rotate: false - xy: 863, 1003 + xy: 2227, 992 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith-missiles rotate: false - xy: 863, 953 + xy: 2227, 942 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith rotate: false - xy: 3643, 2963 + xy: 1393, 3069 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-cell rotate: false - xy: 3757, 3077 + xy: 887, 1133 size: 112, 112 orig: 112, 112 offset: 0, 0 @@ -6897,1367 +7842,3320 @@ size: 4096,256 format: rgba8888 filter: nearest,nearest repeat: none +basalt-edge + rotate: false + xy: 1, 153 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +basalt1 + rotate: false + xy: 2739, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt2 + rotate: false + xy: 101, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt3 + rotate: false + xy: 2773, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 char1 rotate: false - xy: 2311, 213 + xy: 135, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char2 rotate: false - xy: 101, 17 + xy: 2807, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char3 rotate: false - xy: 2345, 213 + xy: 169, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliff rotate: false - xy: 135, 17 + xy: 2841, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cliffs1 +cliff0 rotate: false - xy: 2379, 213 - size: 32, 32 - orig: 32, 32 + xy: 1765, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask1 + rotate: false + xy: 1765, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask129 + rotate: false + xy: 1765, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask131 + rotate: false + xy: 1765, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask3 + rotate: false + xy: 1765, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff1 + rotate: false + xy: 1765, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask130 + rotate: false + xy: 1765, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask2 + rotate: false + xy: 1765, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff2 + rotate: false + xy: 1831, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask12 + rotate: false + xy: 1831, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask132 + rotate: false + xy: 1831, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask134 + rotate: false + xy: 1831, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask14 + rotate: false + xy: 1831, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask140 + rotate: false + xy: 1831, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask142 + rotate: false + xy: 1831, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask4 + rotate: false + xy: 1831, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask6 + rotate: false + xy: 1831, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff3 + rotate: false + xy: 1831, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff4 + rotate: false + xy: 1897, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff5 + rotate: false + xy: 1897, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff6 + rotate: false + xy: 1963, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliff7 + rotate: false + xy: 1963, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask0 + rotate: false + xy: 2029, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask128 + rotate: false + xy: 2029, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask10 + rotate: false + xy: 2161, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask138 + rotate: false + xy: 2161, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask112 + rotate: false + xy: 3151, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask120 + rotate: false + xy: 3151, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask113 + rotate: false + xy: 3217, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask115 + rotate: false + xy: 3217, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask121 + rotate: false + xy: 3217, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask123 + rotate: false + xy: 3217, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask114 + rotate: false + xy: 3217, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask122 + rotate: false + xy: 3217, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask116 + rotate: false + xy: 3283, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask118 + rotate: false + xy: 3283, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask117 + rotate: false + xy: 3283, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask119 + rotate: false + xy: 3283, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask124 + rotate: false + xy: 3349, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask126 + rotate: false + xy: 3349, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask125 + rotate: false + xy: 3349, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask127 + rotate: false + xy: 3349, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask16 + rotate: false + xy: 2161, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask144 + rotate: false + xy: 2161, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask152 + rotate: false + xy: 2161, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask176 + rotate: false + xy: 2161, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask184 + rotate: false + xy: 2161, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask24 + rotate: false + xy: 2161, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask48 + rotate: false + xy: 2161, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask56 + rotate: false + xy: 2161, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask17 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask145 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask147 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask153 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask155 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask177 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask179 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask185 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask187 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask19 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask25 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask27 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask49 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask51 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask57 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask59 + rotate: false + xy: 2227, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask18 + rotate: false + xy: 2227, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask146 + rotate: false + xy: 2227, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask154 + rotate: false + xy: 2227, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask178 + rotate: false + xy: 2227, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask186 + rotate: false + xy: 2227, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask26 + rotate: false + xy: 2227, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask50 + rotate: false + xy: 2227, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask58 + rotate: false + xy: 2227, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask192 + rotate: false + xy: 3415, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask224 + rotate: false + xy: 3415, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask193 + rotate: false + xy: 3415, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask195 + rotate: false + xy: 3415, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask225 + rotate: false + xy: 3415, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask227 + rotate: false + xy: 3415, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask194 + rotate: false + xy: 3481, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask226 + rotate: false + xy: 3481, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask196 + rotate: false + xy: 3481, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask198 + rotate: false + xy: 3481, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask204 + rotate: false + xy: 3481, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask206 + rotate: false + xy: 3481, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask228 + rotate: false + xy: 3481, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask230 + rotate: false + xy: 3481, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask236 + rotate: false + xy: 3481, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask238 + rotate: false + xy: 3481, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask197 + rotate: false + xy: 3547, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask199 + rotate: false + xy: 3547, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask205 + rotate: false + xy: 3547, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask207 + rotate: false + xy: 3547, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask229 + rotate: false + xy: 3547, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask231 + rotate: false + xy: 3547, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask237 + rotate: false + xy: 3547, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask239 + rotate: false + xy: 3547, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask20 + rotate: false + xy: 2293, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask148 + rotate: false + xy: 2293, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask150 + rotate: false + xy: 2293, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask180 + rotate: false + xy: 2293, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask182 + rotate: false + xy: 2293, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask22 + rotate: false + xy: 2293, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask52 + rotate: false + xy: 2293, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask54 + rotate: false + xy: 2293, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask200 + rotate: false + xy: 3547, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask232 + rotate: false + xy: 3547, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask201 + rotate: false + xy: 3613, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask203 + rotate: false + xy: 3613, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask233 + rotate: false + xy: 3613, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask235 + rotate: false + xy: 3613, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask202 + rotate: false + xy: 3613, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask234 + rotate: false + xy: 3613, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask208 + rotate: false + xy: 3679, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask216 + rotate: false + xy: 3679, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask209 + rotate: false + xy: 3679, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask211 + rotate: false + xy: 3679, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask217 + rotate: false + xy: 3679, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask219 + rotate: false + xy: 3679, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask21 + rotate: false + xy: 2293, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask149 + rotate: false + xy: 2293, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask151 + rotate: false + xy: 2293, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask181 + rotate: false + xy: 2293, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask183 + rotate: false + xy: 2293, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask23 + rotate: false + xy: 2293, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask53 + rotate: false + xy: 2293, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask55 + rotate: false + xy: 2293, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask210 + rotate: false + xy: 3745, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask218 + rotate: false + xy: 3745, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask212 + rotate: false + xy: 3745, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask214 + rotate: false + xy: 3745, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask213 + rotate: false + xy: 3811, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask215 + rotate: false + xy: 3811, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask220 + rotate: false + xy: 3811, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask222 + rotate: false + xy: 3811, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask221 + rotate: false + xy: 3877, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask223 + rotate: false + xy: 3877, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask240 + rotate: false + xy: 3877, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask248 + rotate: false + xy: 3877, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask241 + rotate: false + xy: 3943, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask243 + rotate: false + xy: 3943, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask249 + rotate: false + xy: 3943, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask251 + rotate: false + xy: 3943, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask242 + rotate: false + xy: 3943, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask250 + rotate: false + xy: 3943, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask244 + rotate: false + xy: 4009, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask246 + rotate: false + xy: 4009, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask245 + rotate: false + xy: 4009, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask247 + rotate: false + xy: 4009, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask252 + rotate: false + xy: 1765, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask254 + rotate: false + xy: 1765, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask253 + rotate: false + xy: 1831, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask255 + rotate: false + xy: 1831, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask28 + rotate: false + xy: 2359, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask156 + rotate: false + xy: 2359, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask158 + rotate: false + xy: 2359, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask188 + rotate: false + xy: 2359, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask190 + rotate: false + xy: 2359, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask30 + rotate: false + xy: 2359, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask60 + rotate: false + xy: 2359, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask62 + rotate: false + xy: 2359, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask29 + rotate: false + xy: 2359, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask157 + rotate: false + xy: 2359, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask159 + rotate: false + xy: 2359, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask189 + rotate: false + xy: 2359, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask191 + rotate: false + xy: 2359, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask31 + rotate: false + xy: 2359, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask61 + rotate: false + xy: 2359, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask63 + rotate: false + xy: 2359, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask32 + rotate: false + xy: 2425, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask160 + rotate: false + xy: 2425, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask33 + rotate: false + xy: 2425, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask161 + rotate: false + xy: 2425, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask163 + rotate: false + xy: 2425, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask35 + rotate: false + xy: 2425, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask34 + rotate: false + xy: 2491, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask162 + rotate: false + xy: 2491, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask36 + rotate: false + xy: 2491, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask164 + rotate: false + xy: 2491, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask166 + rotate: false + xy: 2491, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask172 + rotate: false + xy: 2491, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask174 + rotate: false + xy: 2491, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask38 + rotate: false + xy: 2491, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask44 + rotate: false + xy: 2491, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask46 + rotate: false + xy: 2491, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask37 + rotate: false + xy: 2557, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask165 + rotate: false + xy: 2557, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask167 + rotate: false + xy: 2557, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask173 + rotate: false + xy: 2557, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask175 + rotate: false + xy: 2557, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask39 + rotate: false + xy: 2557, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask45 + rotate: false + xy: 2557, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask47 + rotate: false + xy: 2557, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask40 + rotate: false + xy: 2557, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask168 + rotate: false + xy: 2557, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask41 + rotate: false + xy: 2623, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask169 + rotate: false + xy: 2623, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask171 + rotate: false + xy: 2623, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask43 + rotate: false + xy: 2623, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask42 + rotate: false + xy: 2623, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask170 + rotate: false + xy: 2623, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask5 + rotate: false + xy: 2029, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask13 + rotate: false + xy: 2029, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask133 + rotate: false + xy: 2029, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask135 + rotate: false + xy: 2029, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask141 + rotate: false + xy: 2029, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask143 + rotate: false + xy: 2029, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask15 + rotate: false + xy: 2029, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask7 + rotate: false + xy: 2029, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask64 + rotate: false + xy: 2689, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask96 + rotate: false + xy: 2689, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask65 + rotate: false + xy: 2689, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask67 + rotate: false + xy: 2689, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask97 + rotate: false + xy: 2689, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask99 + rotate: false + xy: 2689, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask66 + rotate: false + xy: 2755, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask98 + rotate: false + xy: 2755, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask68 + rotate: false + xy: 2755, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask100 + rotate: false + xy: 2755, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask102 + rotate: false + xy: 2755, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask108 + rotate: false + xy: 2755, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask110 + rotate: false + xy: 2755, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask70 + rotate: false + xy: 2755, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask76 + rotate: false + xy: 2755, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask78 + rotate: false + xy: 2755, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask69 + rotate: false + xy: 2821, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask101 + rotate: false + xy: 2821, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask103 + rotate: false + xy: 2821, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask109 + rotate: false + xy: 2821, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask111 + rotate: false + xy: 2821, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask71 + rotate: false + xy: 2821, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask77 + rotate: false + xy: 2821, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask79 + rotate: false + xy: 2821, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask72 + rotate: false + xy: 2821, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask104 + rotate: false + xy: 2821, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask73 + rotate: false + xy: 2887, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask105 + rotate: false + xy: 2887, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask107 + rotate: false + xy: 2887, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask75 + rotate: false + xy: 2887, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask74 + rotate: false + xy: 2887, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask106 + rotate: false + xy: 2887, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask8 + rotate: false + xy: 2095, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask136 + rotate: false + xy: 2095, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask80 + rotate: false + xy: 2953, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask88 + rotate: false + xy: 2953, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask81 + rotate: false + xy: 2953, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask83 + rotate: false + xy: 2953, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask89 + rotate: false + xy: 2953, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask91 + rotate: false + xy: 2953, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask82 + rotate: false + xy: 3019, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask90 + rotate: false + xy: 3019, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask84 + rotate: false + xy: 3019, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask86 + rotate: false + xy: 3019, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask85 + rotate: false + xy: 3085, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask87 + rotate: false + xy: 3085, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask9 + rotate: false + xy: 2095, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask11 + rotate: false + xy: 2095, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask137 + rotate: false + xy: 2095, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask139 + rotate: false + xy: 2095, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask92 + rotate: false + xy: 3085, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask94 + rotate: false + xy: 3085, 119 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask93 + rotate: false + xy: 3151, 185 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cliffmask95 + rotate: false + xy: 3151, 185 + size: 64, 64 + orig: 64, 64 offset: 0, 0 index: -1 coal1 rotate: false - xy: 169, 17 + xy: 203, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal2 rotate: false - xy: 2413, 213 + xy: 2875, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal3 rotate: false - xy: 203, 17 + xy: 237, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper1 rotate: false - xy: 2447, 213 + xy: 2909, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper2 rotate: false - xy: 237, 17 + xy: 271, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper3 rotate: false - xy: 2481, 213 + xy: 2943, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters1 rotate: false - xy: 271, 17 + xy: 305, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters2 rotate: false - xy: 2515, 213 + xy: 2977, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters3 rotate: false - xy: 305, 17 + xy: 339, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters4 rotate: false - xy: 2549, 213 + xy: 3011, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters5 rotate: false - xy: 339, 17 + xy: 373, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters6 rotate: false - xy: 2583, 213 + xy: 3045, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-edge + rotate: false + xy: 1, 55 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dacite-wall-large + rotate: false + xy: 1897, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dacite-wall1 + rotate: false + xy: 3113, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-wall2 + rotate: false + xy: 475, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite1 + rotate: false + xy: 407, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite2 + rotate: false + xy: 3079, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite3 + rotate: false + xy: 441, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal-large rotate: false - xy: 1569, 83 + xy: 1963, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dark-metal1 rotate: false - xy: 373, 17 + xy: 3147, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal2 rotate: false - xy: 2617, 213 + xy: 509, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1 rotate: false - xy: 407, 17 + xy: 3181, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-edge rotate: false - xy: 1, 149 + xy: 99, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-2 rotate: false - xy: 2651, 213 + xy: 543, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-edge rotate: false - xy: 1, 51 + xy: 99, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-3 rotate: false - xy: 441, 17 + xy: 3215, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-edge rotate: false - xy: 99, 149 + xy: 197, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-4 rotate: false - xy: 2685, 213 + xy: 577, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-edge rotate: false - xy: 99, 51 + xy: 197, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-5 rotate: false - xy: 475, 17 + xy: 3249, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-edge rotate: false - xy: 197, 149 + xy: 295, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-6 rotate: false - xy: 2719, 213 + xy: 611, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-edge rotate: false - xy: 197, 51 + xy: 295, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-edge rotate: false - xy: 295, 149 + xy: 393, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water rotate: false - xy: 2787, 213 + xy: 679, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-edge rotate: false - xy: 295, 51 + xy: 393, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water1 rotate: false - xy: 577, 17 + xy: 3351, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water2 rotate: false - xy: 2821, 213 + xy: 713, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water3 rotate: false - xy: 611, 17 + xy: 3385, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water rotate: false - xy: 2855, 213 + xy: 747, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-edge rotate: false - xy: 393, 149 + xy: 491, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-water1 rotate: false - xy: 645, 17 + xy: 3419, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water2 rotate: false - xy: 2889, 213 + xy: 781, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water3 rotate: false - xy: 679, 17 + xy: 3453, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand1 rotate: false - xy: 509, 17 + xy: 3283, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand2 rotate: false - xy: 2753, 213 + xy: 645, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand3 rotate: false - xy: 543, 17 + xy: 3317, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater rotate: false - xy: 2923, 213 + xy: 815, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-edge rotate: false - xy: 393, 51 + xy: 491, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dunerocks-large +dirt-edge rotate: false - xy: 1667, 181 + xy: 589, 153 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dirt-wall-large + rotate: false + xy: 2029, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dunerocks1 +dirt-wall1 rotate: false - xy: 713, 17 + xy: 883, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dunerocks2 +dirt-wall2 rotate: false - xy: 2957, 213 + xy: 3555, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt1 + rotate: false + xy: 3487, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt2 + rotate: false + xy: 849, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt3 + rotate: false + xy: 3521, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall-large + rotate: false + xy: 2095, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dune-wall1 + rotate: false + xy: 917, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall2 + rotate: false + xy: 3589, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge rotate: false - xy: 747, 17 + xy: 951, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge-stencil rotate: false - xy: 491, 149 + xy: 589, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 edgier rotate: false - xy: 2991, 213 + xy: 3623, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-edge rotate: false - xy: 491, 51 + xy: 687, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 grass1 rotate: false - xy: 781, 17 + xy: 985, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass2 rotate: false - xy: 3025, 213 + xy: 3657, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass3 rotate: false - xy: 815, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-edge - rotate: false - xy: 589, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -holostone1 - rotate: false - xy: 3059, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone2 - rotate: false - xy: 849, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone3 - rotate: false - xy: 3093, 213 + xy: 1019, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock1 rotate: false - xy: 883, 17 + xy: 3691, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock2 rotate: false - xy: 3127, 213 + xy: 1053, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock3 rotate: false - xy: 917, 17 + xy: 3725, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-edge rotate: false - xy: 589, 51 + xy: 687, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow-edge rotate: false - xy: 687, 149 + xy: 785, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow1 rotate: false - xy: 985, 17 + xy: 3793, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow2 rotate: false - xy: 3229, 213 + xy: 1155, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow3 rotate: false - xy: 1019, 17 + xy: 3827, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall-large + rotate: false + xy: 2161, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +ice-wall1 + rotate: false + xy: 1189, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall2 + rotate: false + xy: 3861, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice1 rotate: false - xy: 3161, 213 + xy: 1087, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice2 rotate: false - xy: 951, 17 + xy: 3759, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice3 rotate: false - xy: 3195, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks-large - rotate: false - xy: 1733, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -icerocks1 - rotate: false - xy: 3263, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks2 - rotate: false - xy: 1053, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-edge - rotate: false - xy: 687, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ignarock1 - rotate: false - xy: 3297, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock2 - rotate: false - xy: 1087, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock3 - rotate: false - xy: 3331, 213 + xy: 1121, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead1 rotate: false - xy: 1121, 17 + xy: 1223, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead2 rotate: false - xy: 3365, 213 + xy: 3895, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead3 rotate: false - xy: 1155, 17 + xy: 1257, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock1 rotate: false - xy: 3399, 213 + xy: 3929, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock2 rotate: false - xy: 1189, 17 + xy: 1291, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock3 rotate: false - xy: 3433, 213 + xy: 3963, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor rotate: false - xy: 1223, 17 + xy: 1325, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2 rotate: false - xy: 3467, 213 + xy: 3997, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-edge rotate: false - xy: 785, 149 + xy: 785, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-3 rotate: false - xy: 1257, 17 + xy: 1359, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-edge rotate: false - xy: 785, 51 + xy: 883, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-5 rotate: false - xy: 3501, 213 + xy: 4031, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-edge rotate: false - xy: 883, 149 + xy: 883, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged-edge rotate: false - xy: 883, 51 + xy: 981, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged1 rotate: false - xy: 1291, 17 + xy: 1393, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged2 rotate: false - xy: 3535, 213 + xy: 1427, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged3 rotate: false - xy: 1325, 17 + xy: 1461, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-edge rotate: false - xy: 981, 149 + xy: 981, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss-edge rotate: false - xy: 981, 51 + xy: 1079, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss1 rotate: false - xy: 3569, 213 + xy: 1495, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss2 rotate: false - xy: 1359, 17 + xy: 1529, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss3 rotate: false - xy: 3603, 213 + xy: 1563, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud-edge + rotate: false + xy: 1079, 55 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mud1 + rotate: false + xy: 1597, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud2 + rotate: false + xy: 1631, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud3 + rotate: false + xy: 1665, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal1 rotate: false - xy: 1393, 17 + xy: 1699, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal2 rotate: false - xy: 3637, 213 + xy: 2689, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal3 rotate: false - xy: 1427, 17 + xy: 2739, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper1 rotate: false - xy: 3671, 213 + xy: 2773, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper2 rotate: false - xy: 1461, 17 + xy: 2807, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper3 rotate: false - xy: 3705, 213 + xy: 2841, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead1 rotate: false - xy: 1495, 17 + xy: 2875, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead2 rotate: false - xy: 3739, 213 + xy: 2909, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead3 rotate: false - xy: 1529, 17 + xy: 2943, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap1 rotate: false - xy: 3773, 213 + xy: 2977, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap2 rotate: false - xy: 3807, 213 + xy: 3011, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap3 rotate: false - xy: 3841, 213 + xy: 3045, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium1 rotate: false - xy: 3875, 213 + xy: 3079, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium2 rotate: false - xy: 3909, 213 + xy: 3113, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium3 rotate: false - xy: 3943, 213 + xy: 3147, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium1 rotate: false - xy: 3977, 213 + xy: 3181, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium2 rotate: false - xy: 4011, 213 + xy: 3215, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium3 rotate: false - xy: 4045, 213 + xy: 3249, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles1 rotate: false - xy: 1569, 49 + xy: 3283, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles2 rotate: false - xy: 1635, 115 + xy: 3317, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles3 rotate: false - xy: 1603, 49 + xy: 3351, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pine rotate: false - xy: 1, 1 + xy: 1, 5 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -rocks-large - rotate: false - xy: 1799, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rocks1 - rotate: false - xy: 1563, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rocks2 - rotate: false - xy: 1597, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 salt rotate: false - xy: 2261, 163 + xy: 3385, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-edge rotate: false - xy: 1079, 149 + xy: 1177, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -saltrocks-large +salt-wall-large rotate: false - xy: 1865, 181 + xy: 2227, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks1 +salt-wall1 rotate: false - xy: 2311, 179 + xy: 3419, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -saltrocks2 +salt-wall2 rotate: false - xy: 2345, 179 + xy: 3453, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-edge rotate: false - xy: 1079, 51 + xy: 1177, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +sand-wall-large + rotate: false + xy: 2293, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sand-wall1 + rotate: false + xy: 3589, 51 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall2 + rotate: false + xy: 3623, 51 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 sand-water rotate: false - xy: 2481, 179 + xy: 3657, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-edge rotate: false - xy: 1177, 149 + xy: 1275, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-water1 rotate: false - xy: 2515, 179 + xy: 3691, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water2 rotate: false - xy: 2549, 179 + xy: 3725, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water3 rotate: false - xy: 2583, 179 + xy: 3759, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand1 rotate: false - xy: 2379, 179 + xy: 3487, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 2413, 179 + xy: 3521, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand3 rotate: false - xy: 2447, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-large - rotate: false - xy: 1931, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sandrocks1 - rotate: false - xy: 2617, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks2 - rotate: false - xy: 2651, 179 + xy: 3555, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap1 rotate: false - xy: 2685, 179 + xy: 3793, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap2 rotate: false - xy: 2719, 179 + xy: 3827, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap3 rotate: false - xy: 2753, 179 + xy: 3861, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-edge rotate: false - xy: 1177, 51 + xy: 1275, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +shale-wall-large + rotate: false + xy: 2359, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shale-wall1 + rotate: false + xy: 3997, 51 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-wall2 + rotate: false + xy: 4031, 51 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 shale1 rotate: false - xy: 2787, 179 + xy: 3895, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale2 rotate: false - xy: 2821, 179 + xy: 3929, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale3 rotate: false - xy: 2855, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shalerocks-large - rotate: false - xy: 1997, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shalerocks1 - rotate: false - xy: 2889, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shalerocks2 - rotate: false - xy: 2923, 179 + xy: 3963, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-large rotate: false - xy: 2063, 181 + xy: 2425, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shrubs1 rotate: false - xy: 2957, 179 + xy: 1733, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs2 rotate: false - xy: 2991, 179 + xy: 1767, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag rotate: false - xy: 3025, 179 + xy: 1801, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-edge rotate: false - xy: 1275, 149 + xy: 1373, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-edge rotate: false - xy: 1275, 51 + xy: 1373, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-pine rotate: false - xy: 2261, 197 + xy: 2689, 69 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +snow-wall-large + rotate: false + xy: 2491, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +snow-wall1 + rotate: false + xy: 1937, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow-wall2 + rotate: false + xy: 1971, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 snow1 rotate: false - xy: 3059, 179 + xy: 1835, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow2 rotate: false - xy: 3093, 179 + xy: 1869, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow3 rotate: false - xy: 3127, 179 + xy: 1903, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -snowrocks-large +space rotate: false - xy: 2129, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snowrocks1 - rotate: false - xy: 3161, 179 + xy: 2005, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -snowrocks2 +space-edge rotate: false - xy: 3195, 179 - size: 32, 32 - orig: 32, 32 + xy: 1471, 153 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 spawn rotate: false - xy: 3229, 179 + xy: 2039, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-edge rotate: false - xy: 1373, 149 + xy: 1471, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 spore-moss1 rotate: false - xy: 3263, 179 + xy: 2073, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss2 rotate: false - xy: 3297, 179 + xy: 2107, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss3 rotate: false - xy: 3331, 179 + xy: 2141, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-pine rotate: false - xy: 51, 1 + xy: 51, 5 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -sporerocks-large +spore-wall-large rotate: false - xy: 2195, 181 + xy: 2557, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks1 +spore-wall1 rotate: false - xy: 3365, 179 + xy: 2175, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sporerocks2 +spore-wall2 rotate: false - xy: 3399, 179 + xy: 2209, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-edge rotate: false - xy: 1373, 51 + xy: 1569, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +stone-wall-large + rotate: false + xy: 2623, 53 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall1 + rotate: false + xy: 2345, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone-wall2 + rotate: false + xy: 2379, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 stone1 rotate: false - xy: 3433, 179 + xy: 2243, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 3467, 179 + xy: 2277, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone3 rotate: false - xy: 3501, 179 + xy: 2311, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water rotate: false - xy: 3535, 179 + xy: 2413, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-edge rotate: false - xy: 1471, 149 + xy: 1569, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tar rotate: false - xy: 3569, 179 + xy: 2447, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-edge rotate: false - xy: 1471, 51 + xy: 1667, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tendrils1 rotate: false - xy: 3603, 179 + xy: 2481, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils2 rotate: false - xy: 3637, 179 + xy: 2515, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils3 rotate: false - xy: 3671, 179 + xy: 2549, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 3705, 179 + xy: 2583, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 3739, 179 + xy: 2617, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 3773, 179 + xy: 2651, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 3807, 179 + xy: 2685, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 3841, 179 + xy: 2719, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 3875, 179 + xy: 2753, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 3909, 179 + xy: 2787, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-edge rotate: false - xy: 1569, 149 + xy: 1667, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 @@ -8270,2149 +11168,2261 @@ filter: nearest,nearest repeat: none additive-reconstructor-icon-editor rotate: false - xy: 1973, 389 + xy: 2297, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory-icon-editor rotate: false - xy: 2071, 389 + xy: 2395, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-icon-editor rotate: false - xy: 2169, 389 + xy: 2493, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 1085, 227 + xy: 4061, 461 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 3897, 355 + xy: 205, 9 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt-icon-editor + rotate: false + xy: 4061, 427 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt1 + rotate: false + xy: 4061, 427 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 1119, 227 + xy: 239, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 2267, 389 + xy: 2591, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 163, 35 + xy: 163, 43 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 4031, 421 + xy: 1749, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 3931, 355 + xy: 273, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-forge-icon-editor rotate: false - xy: 2365, 389 + xy: 2689, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-loader-icon-editor rotate: false - xy: 2463, 389 + xy: 2787, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader-icon-editor rotate: false - xy: 2561, 389 + xy: 2885, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +boulder-icon-editor + rotate: false + xy: 1423, 185 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 bridge-conduit-icon-editor rotate: false - xy: 3965, 355 + xy: 307, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 163, 1 + xy: 341, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 197, 1 + xy: 375, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 197, 1 + xy: 375, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 645, 194 + xy: 645, 202 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliff-icon-editor rotate: false - xy: 231, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliffs-icon-editor - rotate: false - xy: 265, 1 + xy: 409, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 4031, 355 + xy: 1815, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 299, 1 + xy: 443, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-center-icon-editor rotate: false - xy: 553, 1 + xy: 1881, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conduit-icon-editor rotate: false - xy: 333, 1 + xy: 477, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 651, 33 + xy: 1947, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 367, 1 + xy: 511, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 401, 1 + xy: 1423, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 717, 33 + xy: 2013, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 1323, 357 + xy: 1517, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 1, 3 + xy: 1, 11 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 2659, 389 + xy: 2983, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 435, 1 + xy: 1457, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 435, 1 + xy: 1457, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cryofluidmixer-icon-editor +cryofluid-mixer-icon-editor rotate: false - xy: 783, 33 + xy: 2079, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 849, 33 + xy: 2145, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 2757, 389 + xy: 3081, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +dacite-boulder-icon-editor + rotate: false + xy: 1473, 185 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-icon-editor + rotate: false + xy: 1491, 151 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite1 + rotate: false + xy: 1491, 151 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-wall-icon-editor + rotate: false + xy: 1337, 135 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 dark-metal-icon-editor rotate: false - xy: 469, 1 + xy: 1371, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 503, 1 + xy: 2277, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 503, 1 + xy: 2277, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 915, 65 + xy: 2311, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 915, 65 + xy: 2311, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 915, 31 + xy: 2345, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 915, 31 + xy: 2345, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 945, 177 + xy: 2379, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 945, 177 + xy: 2379, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 945, 143 + xy: 2413, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 945, 143 + xy: 2413, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 979, 177 + xy: 2447, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 979, 177 + xy: 2447, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 945, 109 + xy: 2481, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 945, 109 + xy: 2481, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 979, 143 + xy: 2515, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 1013, 177 + xy: 2549, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 979, 109 + xy: 2583, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 979, 109 + xy: 2583, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 2855, 389 + xy: 3179, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode-icon-editor rotate: false - xy: 1013, 143 + xy: 2617, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-icon-editor + rotate: false + xy: 2651, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt1 + rotate: false + xy: 2651, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-wall-icon-editor + rotate: false + xy: 2685, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 disassembler-icon-editor rotate: false - xy: 2953, 389 + xy: 3277, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 1357, 193 + xy: 2211, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 1047, 177 + xy: 2719, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 1423, 193 + xy: 2297, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dunerocks-icon-editor +dune-wall-icon-editor rotate: false - xy: 1013, 109 + xy: 2753, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 1047, 143 + xy: 2787, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt2 + rotate: false + xy: 2821, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt3 + rotate: false + xy: 2855, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 1047, 109 + xy: 2889, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 949, 75 + xy: 2923, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters2 rotate: false - xy: 949, 41 + xy: 2957, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 983, 75 + xy: 2991, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite2 + rotate: false + xy: 3025, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite3 + rotate: false + xy: 3059, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water1 rotate: false - xy: 1017, 41 + xy: 3161, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water2 rotate: false - xy: 1051, 75 + xy: 3195, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water3 rotate: false - xy: 1051, 41 + xy: 3229, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water1 rotate: false - xy: 3755, 305 + xy: 3263, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water2 rotate: false - xy: 3789, 305 + xy: 3297, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water3 rotate: false - xy: 3823, 305 + xy: 3331, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 983, 41 + xy: 3093, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 1017, 75 + xy: 3127, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt2 + rotate: false + xy: 3365, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt3 + rotate: false + xy: 3399, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 3857, 313 + xy: 3433, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 3857, 313 + xy: 3433, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 1085, 193 + xy: 3467, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 1119, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone1 - rotate: false - xy: 1081, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-icon-editor - rotate: false - xy: 1081, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone2 - rotate: false - xy: 1081, 125 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone3 - rotate: false - xy: 1115, 159 + xy: 3501, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 1115, 125 + xy: 3535, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 1115, 125 + xy: 3535, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 1153, 193 + xy: 3569, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 1149, 159 + xy: 3603, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 1221, 193 + xy: 3739, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 1221, 193 + xy: 3739, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 1183, 125 + xy: 3773, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 1217, 159 + xy: 3807, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 1187, 193 + xy: 3637, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 1187, 193 + xy: 3637, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 1149, 125 + xy: 3671, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 1183, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock1 - rotate: false - xy: 1255, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-icon-editor - rotate: false - xy: 1255, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock2 - rotate: false - xy: 1217, 125 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock3 - rotate: false - xy: 1251, 159 + xy: 3705, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 1289, 193 + xy: 3841, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 1289, 193 + xy: 3841, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 1323, 193 + xy: 3875, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 1251, 125 + xy: 3909, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 1285, 159 + xy: 3943, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 1285, 159 + xy: 3943, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 1285, 125 + xy: 3977, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 1285, 125 + xy: 3977, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 1319, 159 + xy: 4011, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 1319, 159 + xy: 4011, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 1319, 125 + xy: 4045, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 1319, 125 + xy: 4045, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 1353, 159 + xy: 1339, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 1353, 159 + xy: 1339, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 1353, 125 + xy: 1339, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 1387, 159 + xy: 1373, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 1387, 125 + xy: 1373, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 1387, 125 + xy: 1373, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 1421, 159 + xy: 1339, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 1421, 125 + xy: 1373, 33 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud1 + rotate: false + xy: 915, 39 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud-icon-editor + rotate: false + xy: 915, 39 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud2 + rotate: false + xy: 949, 39 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud3 + rotate: false + xy: 983, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 1455, 159 + xy: 1017, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 1455, 125 + xy: 1051, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 1489, 159 + xy: 1085, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 1489, 125 + xy: 1753, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 1523, 159 + xy: 1753, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 1523, 125 + xy: 1787, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 1557, 159 + xy: 1787, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 1557, 125 + xy: 1821, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 1591, 159 + xy: 1821, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 1591, 125 + xy: 1855, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 1625, 159 + xy: 1855, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 1625, 125 + xy: 1889, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 1659, 159 + xy: 1889, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 1659, 125 + xy: 1923, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 1693, 159 + xy: 1923, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 1693, 125 + xy: 1957, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 1727, 159 + xy: 1957, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 1727, 125 + xy: 1991, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 1761, 159 + xy: 1991, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 1761, 125 + xy: 2025, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 1795, 159 + xy: 2025, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 1795, 125 + xy: 2059, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 1795, 125 + xy: 2059, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water1 rotate: false - xy: 1863, 125 + xy: 2127, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water2 rotate: false - xy: 1897, 159 + xy: 2127, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water3 rotate: false - xy: 1897, 125 + xy: 2161, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 1829, 159 + xy: 2059, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 1829, 159 + xy: 2059, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 1829, 125 + xy: 2093, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 1863, 159 + xy: 2093, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 1931, 159 + xy: 2161, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 1931, 159 + xy: 2161, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 1931, 125 + xy: 2195, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 1085, 91 + xy: 2195, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-slag rotate: false - xy: 1085, 57 + xy: 2229, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-icon-editor rotate: false - xy: 1085, 57 + xy: 2229, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 1119, 91 + xy: 2229, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 1119, 57 + xy: 2263, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 1153, 91 + xy: 2297, 263 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-space + rotate: false + xy: 2331, 263 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +space-icon-editor + rotate: false + xy: 2331, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spawn rotate: false - xy: 1153, 57 + xy: 2365, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 1187, 91 + xy: 2399, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 1187, 91 + xy: 2399, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 1187, 57 + xy: 2433, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 1221, 91 + xy: 2467, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 1221, 57 + xy: 2501, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 1221, 57 + xy: 2501, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 1255, 91 + xy: 2535, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 1255, 57 + xy: 2569, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 1289, 91 + xy: 2603, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 1289, 91 + xy: 2603, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 1289, 57 + xy: 2637, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 1289, 57 + xy: 2637, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 1323, 91 + xy: 2671, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 1323, 57 + xy: 2705, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 1357, 91 + xy: 2739, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 1357, 57 + xy: 2773, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 1357, 57 + xy: 2773, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 exponential-reconstructor-icon-editor rotate: false - xy: 935, 261 + xy: 935, 269 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 force-projector-icon-editor rotate: false - xy: 3051, 389 + xy: 3375, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +foreshadow-icon-editor + rotate: false + xy: 293, 43 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 fuse-icon-editor rotate: false - xy: 3149, 389 + xy: 3473, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 1489, 193 + xy: 2363, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ground-factory-icon-editor rotate: false - xy: 3247, 389 + xy: 3571, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hail-icon-editor rotate: false - xy: 1391, 91 + xy: 2807, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hyper-processor-icon-editor rotate: false - xy: 3345, 389 + xy: 3669, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -icerocks-icon-editor +ice-wall-icon-editor rotate: false - xy: 1391, 57 + xy: 2841, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-icon-editor rotate: false - xy: 1425, 91 + xy: 2875, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 293, 35 + xy: 1647, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 1425, 57 + xy: 2909, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 1459, 91 + xy: 2943, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 1459, 57 + xy: 2977, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 1493, 91 + xy: 3011, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 1493, 57 + xy: 3045, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 1555, 193 + xy: 2429, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 1621, 193 + xy: 2495, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +large-logic-display-icon-editor + rotate: false + xy: 1161, 301 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 laser-drill-icon-editor rotate: false - xy: 3443, 389 + xy: 3767, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 3541, 389 + xy: 3865, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large-icon-editor rotate: false - xy: 1453, 357 + xy: 423, 43 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 1527, 91 + xy: 3079, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 1527, 57 + xy: 3113, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1561, 91 + xy: 3147, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 3639, 389 + xy: 3963, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-void-icon-editor rotate: false - xy: 1561, 57 + xy: 3181, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-display-icon-editor rotate: false - xy: 3737, 389 + xy: 553, 75 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor-icon-editor rotate: false - xy: 1687, 193 + xy: 2561, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 3835, 389 + xy: 651, 107 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 1753, 193 + xy: 2627, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 1595, 91 + xy: 3215, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 423, 35 + xy: 1777, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 1595, 57 + xy: 3249, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +memory-bank-icon-editor + rotate: false + xy: 2693, 331 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 memory-cell-icon-editor rotate: false - xy: 1629, 91 + xy: 3283, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 1819, 193 + xy: 2759, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 1629, 57 + xy: 3317, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1663, 91 + xy: 3351, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor-icon-editor rotate: false - xy: 1663, 57 + xy: 3385, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 3933, 389 + xy: 749, 107 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor-icon-editor rotate: false - xy: 1161, 325 + xy: 1355, 333 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory-icon-editor rotate: false - xy: 553, 67 + xy: 847, 107 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 651, 99 + xy: 945, 171 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-icon-editor rotate: false - xy: 749, 99 + xy: 1043, 171 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 1885, 193 + xy: 2825, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 1697, 91 + xy: 3419, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 parallax-icon-editor rotate: false - xy: 1973, 323 + xy: 2891, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 payload-conveyor-icon-editor rotate: false - xy: 847, 99 + xy: 945, 73 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon-editor rotate: false - xy: 1161, 227 + xy: 1043, 73 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1697, 57 + xy: 3453, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 1731, 91 + xy: 3487, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 1731, 57 + xy: 3521, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 1765, 91 + xy: 3555, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 2039, 323 + xy: 2957, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 2105, 323 + xy: 3023, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 935, 211 + xy: 1553, 217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 2171, 323 + xy: 3089, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-conveyor-icon-editor rotate: false - xy: 1765, 57 + xy: 3589, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-icon-editor rotate: false - xy: 1799, 91 + xy: 3623, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large-icon-editor rotate: false - xy: 2237, 323 + xy: 3155, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plated-conduit-icon-editor rotate: false - xy: 1799, 57 + xy: 3657, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 2303, 323 + xy: 3221, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 1833, 91 + xy: 3691, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 2369, 323 + xy: 3287, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 1833, 57 + xy: 3725, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 1867, 91 + xy: 3759, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 1867, 57 + xy: 3793, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 1901, 91 + xy: 3827, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 2435, 323 + xy: 3353, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 1901, 57 + xy: 3861, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point-icon-editor rotate: false - xy: 2501, 323 + xy: 3419, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 1259, 227 + xy: 1161, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -rock-icon-editor - rotate: false - xy: 3755, 339 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rocks-icon-editor - rotate: false - xy: 1935, 91 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 rotary-pump-icon-editor rotate: false - xy: 2567, 323 + xy: 3485, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 1935, 57 + xy: 3895, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 2633, 323 + xy: 3551, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks-icon-editor +salt-wall-icon-editor rotate: false - xy: 1085, 23 + xy: 3929, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 2699, 323 + xy: 3617, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 1119, 23 + xy: 3963, 263 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall-icon-editor + rotate: false + xy: 3997, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 1153, 23 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-icon-editor - rotate: false - xy: 1187, 23 + xy: 4031, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 2765, 323 + xy: 3683, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 1221, 23 + xy: 2263, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 1583, 357 + xy: 1907, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 1357, 259 + xy: 1259, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 1255, 23 + xy: 2297, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 2831, 323 + xy: 3749, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 segment-icon-editor rotate: false - xy: 2897, 323 + xy: 3815, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 2963, 323 + xy: 3881, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 1289, 23 + xy: 2331, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shalerocks-icon-editor +shale-wall-icon-editor rotate: false - xy: 1323, 23 + xy: 2365, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 1357, 23 + xy: 2399, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 1391, 23 + xy: 2433, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-crucible-icon-editor rotate: false - xy: 1455, 259 + xy: 1141, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 3029, 323 + xy: 3947, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +snow-boulder-icon-editor + rotate: false + xy: 1603, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 snow-icon-editor rotate: false - xy: 1425, 23 + xy: 2467, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 985, 211 + xy: 1653, 217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock-icon-editor +snow-wall-icon-editor rotate: false - xy: 3805, 339 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrocks-icon-editor - rotate: false - xy: 1459, 23 + xy: 2501, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 1493, 23 + xy: 2535, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 1553, 259 + xy: 1239, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 1527, 23 + xy: 2569, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 1561, 23 + xy: 2603, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 1713, 357 + xy: 2037, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 3855, 347 + xy: 163, 1 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 1035, 211 + xy: 1703, 217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 3095, 323 + xy: 4013, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks-icon-editor +spore-wall-icon-editor rotate: false - xy: 1595, 23 + xy: 2637, 229 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +steam-generator-icon-editor + rotate: false + xy: 553, 9 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall-icon-editor + rotate: false + xy: 2671, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 3161, 323 + xy: 651, 41 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 1629, 23 + xy: 2705, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 3227, 323 + xy: 717, 41 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 3293, 323 + xy: 783, 41 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 switch-icon-editor rotate: false - xy: 1663, 23 + xy: 2739, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 1697, 23 + xy: 2773, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tetrative-reconstructor-icon-editor rotate: false - xy: 645, 197 + xy: 645, 205 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 3359, 323 + xy: 849, 41 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 1651, 259 + xy: 1357, 235 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 1749, 259 + xy: 1455, 235 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 1731, 23 + xy: 2807, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 3425, 323 + xy: 1141, 39 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 1843, 357 + xy: 2167, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 1765, 23 + xy: 2841, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 1799, 23 + xy: 2875, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 3491, 323 + xy: 1207, 39 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-icon-editor +tsunami-icon-editor rotate: false - xy: 3557, 323 - size: 64, 64 - orig: 64, 64 + xy: 1553, 267 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 underflow-gate-icon-editor rotate: false - xy: 1833, 23 + xy: 2909, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 1867, 23 + xy: 2943, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 1847, 259 + xy: 1651, 267 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 3623, 323 + xy: 1273, 39 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 3689, 323 + xy: 1357, 169 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 165 + xy: 1, 173 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 323, 165 + xy: 323, 173 size: 320, 320 orig: 320, 320 offset: 0, 0 @@ -10432,7 +13442,7 @@ alpha-bg index: -1 bar rotate: false - xy: 2399, 131 + xy: 2343, 150 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -10440,7 +13450,7 @@ bar index: -1 bar-top rotate: false - xy: 2370, 131 + xy: 3550, 139 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -10448,28 +13458,28 @@ bar-top index: -1 block-additive-reconstructor-large rotate: false - xy: 3504, 371 + xy: 1004, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-additive-reconstructor-medium rotate: false - xy: 1166, 169 + xy: 3587, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-additive-reconstructor-small rotate: false - xy: 4031, 387 + xy: 1605, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-additive-reconstructor-tiny rotate: false - xy: 3334, 345 + xy: 881, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10483,28 +13493,28 @@ block-additive-reconstructor-xlarge index: -1 block-air-factory-large rotate: false - xy: 3546, 371 + xy: 1046, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-air-factory-medium rotate: false - xy: 1200, 169 + xy: 3621, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-air-factory-small rotate: false - xy: 2457, 143 + xy: 1731, 96 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-air-factory-tiny rotate: false - xy: 3181, 272 + xy: 309, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10518,28 +13528,28 @@ block-air-factory-xlarge index: -1 block-alloy-smelter-large rotate: false - xy: 845, 371 + xy: 1004, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alloy-smelter-medium rotate: false - xy: 1234, 169 + xy: 3655, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alloy-smelter-small rotate: false - xy: 4031, 361 + xy: 1731, 70 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 3373, 321 + xy: 2169, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10553,28 +13563,28 @@ block-alloy-smelter-xlarge index: -1 block-arc-large rotate: false - xy: 887, 371 + xy: 1088, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 1268, 169 + xy: 901, 155 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 2457, 117 + xy: 1731, 44 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 309, 160 + xy: 2187, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10588,28 +13598,28 @@ block-arc-xlarge index: -1 block-armored-conveyor-large rotate: false - xy: 929, 371 + xy: 1046, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 1302, 169 + xy: 935, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 3308, 337 + xy: 3810, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 2436, 88 + xy: 2205, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10621,7184 +13631,7499 @@ block-armored-conveyor-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-battery-large +block-basalt-large rotate: false - xy: 971, 371 + xy: 1130, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-battery-large-large +block-basalt-medium rotate: false - xy: 1013, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 1336, 169 + xy: 969, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-battery-large-small +block-basalt-small rotate: false - xy: 4057, 371 + xy: 2372, 162 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-battery-large-tiny +block-basalt-tiny rotate: false - xy: 2613, 34 + xy: 2223, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-battery-large-xlarge +block-basalt-xlarge rotate: false xy: 259, 257 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-battery-medium +block-battery-large rotate: false - xy: 1370, 169 + xy: 1088, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-large + rotate: false + xy: 1172, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-medium + rotate: false + xy: 2639, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-battery-small +block-battery-large-small rotate: false - xy: 1220, 7 + xy: 2372, 136 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-battery-tiny +block-battery-large-tiny rotate: false - xy: 2656, 185 + xy: 2241, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-battery-xlarge +block-battery-large-xlarge rotate: false xy: 181, 46 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-blast-drill-large +block-battery-medium rotate: false - xy: 1055, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 1404, 169 + xy: 2673, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-blast-drill-small +block-battery-small rotate: false - xy: 1246, 7 + xy: 2398, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-blast-drill-tiny +block-battery-tiny rotate: false - xy: 2674, 185 + xy: 2259, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-blast-drill-xlarge +block-battery-xlarge rotate: false xy: 259, 207 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-blast-mixer-large +block-blast-drill-large rotate: false - xy: 1097, 371 + xy: 1130, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-blast-mixer-medium +block-blast-drill-medium rotate: false - xy: 1438, 169 + xy: 2707, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-blast-mixer-small +block-blast-drill-small rotate: false - xy: 1272, 7 + xy: 2424, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-blast-mixer-tiny +block-blast-drill-tiny rotate: false - xy: 2692, 185 + xy: 2277, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-blast-mixer-xlarge +block-blast-drill-xlarge rotate: false xy: 259, 157 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-block-forge-large +block-blast-mixer-large rotate: false - xy: 1139, 371 + xy: 1214, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-block-forge-medium +block-blast-mixer-medium rotate: false - xy: 1472, 169 + xy: 2741, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-block-forge-small +block-blast-mixer-small rotate: false - xy: 1298, 7 + xy: 2398, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-block-forge-tiny +block-blast-mixer-tiny rotate: false - xy: 3199, 267 + xy: 257, 2 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-block-forge-xlarge +block-blast-mixer-xlarge rotate: false xy: 857, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-block-loader-large +block-block-forge-large rotate: false - xy: 1181, 371 + xy: 1172, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-block-loader-medium +block-block-forge-medium rotate: false - xy: 1506, 169 + xy: 2775, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-block-loader-small +block-block-forge-small rotate: false - xy: 1324, 7 + xy: 2424, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-block-loader-tiny +block-block-forge-tiny rotate: false - xy: 2631, 34 + xy: 2384, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-block-loader-xlarge +block-block-forge-xlarge rotate: false xy: 907, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-block-unloader-large +block-block-loader-large rotate: false - xy: 1223, 371 + xy: 1256, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-block-unloader-medium +block-block-loader-medium rotate: false - xy: 1540, 169 + xy: 2809, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-block-unloader-small +block-block-loader-small rotate: false - xy: 1350, 7 + xy: 3825, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-block-unloader-tiny +block-block-loader-tiny rotate: false - xy: 3191, 249 + xy: 2402, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-block-unloader-xlarge +block-block-loader-xlarge rotate: false xy: 957, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-bridge-conduit-large +block-block-unloader-large rotate: false - xy: 1265, 371 + xy: 1214, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-bridge-conduit-medium +block-block-unloader-medium rotate: false - xy: 1574, 169 + xy: 2843, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-bridge-conduit-small +block-block-unloader-small rotate: false - xy: 1376, 7 + xy: 3836, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-bridge-conduit-tiny +block-block-unloader-tiny rotate: false - xy: 3191, 231 + xy: 2420, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-bridge-conduit-xlarge +block-block-unloader-xlarge rotate: false xy: 1007, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-bridge-conveyor-large +block-boulder-large rotate: false - xy: 1307, 371 + xy: 1298, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-bridge-conveyor-medium +block-boulder-medium rotate: false - xy: 1608, 169 + xy: 2877, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-bridge-conveyor-small +block-boulder-small rotate: false - xy: 1402, 7 + xy: 3825, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-bridge-conveyor-tiny +block-boulder-tiny rotate: false - xy: 3191, 213 + xy: 2438, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-bridge-conveyor-xlarge +block-boulder-xlarge rotate: false xy: 1057, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-char-large +block-bridge-conduit-large rotate: false - xy: 1349, 371 + xy: 1256, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-char-medium +block-bridge-conduit-medium rotate: false - xy: 1642, 169 + xy: 2911, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-char-small +block-bridge-conduit-small rotate: false - xy: 1428, 7 + xy: 3824, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-char-tiny +block-bridge-conduit-tiny rotate: false - xy: 3191, 195 + xy: 2381, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-char-xlarge +block-bridge-conduit-xlarge rotate: false xy: 1107, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cliff-large +block-bridge-conveyor-large rotate: false - xy: 1391, 371 + xy: 1340, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cliff-medium +block-bridge-conveyor-medium rotate: false - xy: 1676, 169 + xy: 2945, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cliff-small +block-bridge-conveyor-small rotate: false - xy: 1454, 7 + xy: 3851, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cliff-tiny +block-bridge-conveyor-tiny rotate: false - xy: 3191, 177 + xy: 2381, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cliff-xlarge +block-bridge-conveyor-xlarge rotate: false xy: 1157, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cliffs-large +block-char-large rotate: false - xy: 1433, 371 + xy: 1298, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cliffs-medium +block-char-medium rotate: false - xy: 1710, 169 + xy: 2979, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cliffs-small +block-char-small rotate: false - xy: 1480, 7 + xy: 3851, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cliffs-tiny +block-char-tiny rotate: false - xy: 3191, 159 + xy: 2399, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cliffs-xlarge +block-char-xlarge rotate: false xy: 1207, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-coal-centrifuge-large +block-cliff-large rotate: false - xy: 1475, 371 + xy: 1382, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-coal-centrifuge-medium +block-cliff-medium rotate: false - xy: 1744, 169 + xy: 3013, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-coal-centrifuge-small +block-cliff-small rotate: false - xy: 1506, 7 + xy: 3850, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-coal-centrifuge-tiny +block-cliff-tiny rotate: false - xy: 3191, 141 + xy: 2381, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-coal-centrifuge-xlarge +block-cliff-xlarge rotate: false xy: 1257, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-combustion-generator-large +block-coal-centrifuge-large rotate: false - xy: 1517, 371 + xy: 1340, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-combustion-generator-medium +block-coal-centrifuge-medium rotate: false - xy: 1778, 169 + xy: 3047, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-combustion-generator-small +block-coal-centrifuge-small rotate: false - xy: 1532, 7 + xy: 3862, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-combustion-generator-tiny +block-coal-centrifuge-tiny rotate: false - xy: 3209, 249 + xy: 2399, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-combustion-generator-xlarge +block-coal-centrifuge-xlarge rotate: false xy: 1307, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-command-center-large +block-combustion-generator-large rotate: false - xy: 1559, 371 + xy: 1424, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-command-center-medium +block-combustion-generator-medium rotate: false - xy: 1812, 169 + xy: 3081, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-command-center-small +block-combustion-generator-small rotate: false - xy: 1558, 7 + xy: 3877, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-command-center-tiny +block-combustion-generator-tiny rotate: false - xy: 3209, 231 + xy: 2417, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-command-center-xlarge +block-combustion-generator-xlarge rotate: false xy: 1357, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-conduit-large +block-command-center-large rotate: false - xy: 1601, 371 + xy: 1382, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-conduit-medium +block-command-center-medium rotate: false - xy: 1846, 169 + xy: 3115, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-conduit-small +block-command-center-small rotate: false - xy: 1584, 7 + xy: 3877, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-conduit-tiny +block-command-center-tiny rotate: false - xy: 3209, 213 + xy: 2381, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-conduit-xlarge +block-command-center-xlarge rotate: false xy: 1407, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-container-large +block-conduit-large rotate: false - xy: 1643, 371 + xy: 1466, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-container-medium +block-conduit-medium rotate: false - xy: 1880, 169 + xy: 3149, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-container-small +block-conduit-small rotate: false - xy: 1610, 7 + xy: 3876, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-container-tiny +block-conduit-tiny rotate: false - xy: 3209, 195 + xy: 2399, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-container-xlarge +block-conduit-xlarge rotate: false xy: 1457, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-conveyor-large +block-container-large rotate: false - xy: 1685, 371 + xy: 1424, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-conveyor-medium +block-container-medium rotate: false - xy: 1914, 169 + xy: 3183, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-conveyor-small +block-container-small rotate: false - xy: 1636, 7 + xy: 3888, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-conveyor-tiny +block-container-tiny rotate: false - xy: 3209, 177 + xy: 2417, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-conveyor-xlarge +block-container-xlarge rotate: false xy: 1507, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-copper-wall-large +block-conveyor-large rotate: false - xy: 1727, 371 + xy: 1508, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-copper-wall-large-large +block-conveyor-medium rotate: false - xy: 1769, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-medium - rotate: false - xy: 1948, 169 + xy: 3217, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-copper-wall-large-small +block-conveyor-small rotate: false - xy: 1662, 7 + xy: 3903, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-copper-wall-large-tiny +block-conveyor-tiny rotate: false - xy: 3209, 159 + xy: 2435, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-copper-wall-large-xlarge +block-conveyor-xlarge rotate: false xy: 1557, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-copper-wall-medium +block-copper-wall-large rotate: false - xy: 1982, 169 + xy: 1466, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-large + rotate: false + xy: 1550, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-medium + rotate: false + xy: 3251, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-copper-wall-small +block-copper-wall-large-small rotate: false - xy: 1688, 7 + xy: 3903, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-copper-wall-tiny +block-copper-wall-large-tiny rotate: false - xy: 3209, 141 + xy: 2399, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-copper-wall-xlarge +block-copper-wall-large-xlarge rotate: false xy: 1607, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-core-foundation-large +block-copper-wall-medium rotate: false - xy: 1811, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 2016, 169 + xy: 3285, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-core-foundation-small +block-copper-wall-small rotate: false - xy: 1714, 7 + xy: 3902, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-core-foundation-tiny +block-copper-wall-tiny rotate: false - xy: 3227, 247 + xy: 2417, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-core-foundation-xlarge +block-copper-wall-xlarge rotate: false xy: 1657, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-core-nucleus-large +block-core-foundation-large rotate: false - xy: 1853, 371 + xy: 1508, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-core-nucleus-medium +block-core-foundation-medium rotate: false - xy: 2050, 169 + xy: 3319, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-core-nucleus-small +block-core-foundation-small rotate: false - xy: 1740, 7 + xy: 3914, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-core-nucleus-tiny +block-core-foundation-tiny rotate: false - xy: 3227, 229 + xy: 2435, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-core-nucleus-xlarge +block-core-foundation-xlarge rotate: false xy: 1707, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-core-shard-large +block-core-nucleus-large rotate: false - xy: 1895, 371 + xy: 1592, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-core-shard-medium +block-core-nucleus-medium rotate: false - xy: 2084, 169 + xy: 3353, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-core-shard-small +block-core-nucleus-small rotate: false - xy: 1766, 7 + xy: 3929, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-core-shard-tiny +block-core-nucleus-tiny rotate: false - xy: 3227, 211 + xy: 2417, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-core-shard-xlarge +block-core-nucleus-xlarge rotate: false xy: 1757, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-craters-large +block-core-shard-large rotate: false - xy: 1937, 371 + xy: 1550, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-craters-medium +block-core-shard-medium rotate: false - xy: 2118, 169 + xy: 3387, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-craters-small +block-core-shard-small rotate: false - xy: 1792, 7 + xy: 3929, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-craters-tiny +block-core-shard-tiny rotate: false - xy: 3227, 193 + xy: 2435, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-craters-xlarge +block-core-shard-xlarge rotate: false xy: 1807, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cryofluidmixer-large +block-craters-large rotate: false - xy: 1979, 371 + xy: 1634, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cryofluidmixer-medium +block-craters-medium rotate: false - xy: 2152, 169 + xy: 1799, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cryofluidmixer-small +block-craters-small rotate: false - xy: 1818, 7 + xy: 3928, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cryofluidmixer-tiny +block-craters-tiny rotate: false - xy: 3227, 175 + xy: 2435, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cryofluidmixer-xlarge +block-craters-xlarge rotate: false xy: 1857, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cultivator-large +block-cryofluid-mixer-large rotate: false - xy: 2021, 371 + xy: 1592, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cultivator-medium +block-cryofluid-mixer-medium rotate: false - xy: 2186, 169 + xy: 1833, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cultivator-small +block-cryofluid-mixer-small rotate: false - xy: 1844, 7 + xy: 3940, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cultivator-tiny +block-cryofluid-mixer-tiny rotate: false - xy: 3227, 157 + xy: 2462, 107 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cultivator-xlarge +block-cryofluid-mixer-xlarge rotate: false xy: 1907, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cyclone-large +block-cultivator-large rotate: false - xy: 2063, 371 + xy: 1676, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cyclone-medium +block-cultivator-medium rotate: false - xy: 2220, 169 + xy: 1867, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cyclone-small +block-cultivator-small rotate: false - xy: 1870, 7 + xy: 3955, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cyclone-tiny +block-cultivator-tiny rotate: false - xy: 3227, 139 + xy: 1809, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cyclone-xlarge +block-cultivator-xlarge rotate: false xy: 1957, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-metal-large +block-cyclone-large rotate: false - xy: 2105, 371 + xy: 1634, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-metal-medium +block-cyclone-medium rotate: false - xy: 2254, 169 + xy: 1901, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-metal-small +block-cyclone-small rotate: false - xy: 1896, 7 + xy: 3955, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-metal-tiny +block-cyclone-tiny rotate: false - xy: 3245, 241 + xy: 1827, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-metal-xlarge +block-cyclone-xlarge rotate: false xy: 2007, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-1-large +block-dacite-boulder-large rotate: false - xy: 2147, 371 + xy: 1718, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-1-medium +block-dacite-boulder-medium rotate: false - xy: 2288, 169 + xy: 1935, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-1-small +block-dacite-boulder-small rotate: false - xy: 1922, 7 + xy: 3954, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-1-tiny +block-dacite-boulder-tiny rotate: false - xy: 3263, 241 + xy: 1845, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-1-xlarge +block-dacite-boulder-xlarge rotate: false xy: 2057, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-2-large +block-dacite-large rotate: false - xy: 2189, 371 + xy: 1676, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-2-medium +block-dacite-medium rotate: false - xy: 2322, 169 + xy: 1969, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-2-small +block-dacite-small rotate: false - xy: 1948, 7 + xy: 3966, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-2-tiny +block-dacite-tiny rotate: false - xy: 3245, 223 + xy: 1863, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-2-xlarge +block-dacite-wall-large + rotate: false + xy: 1760, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dacite-wall-medium + rotate: false + xy: 2003, 211 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-small + rotate: false + xy: 3981, 219 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dacite-wall-tiny + rotate: false + xy: 1881, 11 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dacite-wall-xlarge rotate: false xy: 2107, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-3-large - rotate: false - xy: 2231, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 2356, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 1974, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 3281, 241 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-3-xlarge +block-dacite-xlarge rotate: false xy: 2157, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-4-large +block-dark-metal-large rotate: false - xy: 2273, 371 + xy: 1718, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-4-medium +block-dark-metal-medium rotate: false - xy: 2390, 169 + xy: 2037, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-4-small +block-dark-metal-small rotate: false - xy: 2000, 7 + xy: 3981, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-4-tiny +block-dark-metal-tiny rotate: false - xy: 3245, 205 + xy: 1899, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-4-xlarge +block-dark-metal-xlarge rotate: false xy: 2207, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-5-large +block-dark-panel-1-large rotate: false - xy: 2315, 371 + xy: 1802, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-5-medium +block-dark-panel-1-medium rotate: false - xy: 2424, 169 + xy: 2071, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-5-small +block-dark-panel-1-small rotate: false - xy: 2026, 7 + xy: 3980, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-5-tiny +block-dark-panel-1-tiny rotate: false - xy: 3263, 223 + xy: 1917, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-5-xlarge +block-dark-panel-1-xlarge rotate: false xy: 2257, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-6-large +block-dark-panel-2-large rotate: false - xy: 2357, 371 + xy: 1760, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-6-medium +block-dark-panel-2-medium rotate: false - xy: 2458, 169 + xy: 2105, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-6-small +block-dark-panel-2-small rotate: false - xy: 2052, 7 + xy: 3992, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-6-tiny +block-dark-panel-2-tiny rotate: false - xy: 3245, 187 + xy: 1935, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-6-xlarge +block-dark-panel-2-xlarge rotate: false xy: 2307, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-large +block-dark-panel-3-large rotate: false - xy: 2399, 371 + xy: 1844, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-darksand-medium +block-dark-panel-3-medium rotate: false - xy: 3209, 337 + xy: 2139, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-darksand-small +block-dark-panel-3-small rotate: false - xy: 2078, 7 + xy: 4018, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-darksand-tainted-water-large +block-dark-panel-3-tiny rotate: false - xy: 2441, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 3623, 389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 2104, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 3263, 205 + xy: 1953, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-darksand-tainted-water-xlarge +block-dark-panel-3-xlarge rotate: false xy: 2357, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-tiny +block-dark-panel-4-large rotate: false - xy: 3281, 223 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 2483, 371 + xy: 1802, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-darksand-water-medium +block-dark-panel-4-medium rotate: false - xy: 3657, 379 + xy: 2173, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-darksand-water-small +block-dark-panel-4-small rotate: false - xy: 2130, 7 + xy: 4007, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-darksand-water-tiny +block-dark-panel-4-tiny rotate: false - xy: 3245, 169 + xy: 1971, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-darksand-water-xlarge +block-dark-panel-4-xlarge rotate: false xy: 2407, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-xlarge +block-dark-panel-5-large + rotate: false + xy: 1886, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-5-medium + rotate: false + xy: 2207, 211 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-5-small + rotate: false + xy: 4007, 193 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-5-tiny + rotate: false + xy: 2169, 11 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-5-xlarge rotate: false xy: 2457, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-deepwater-large +block-dark-panel-6-large rotate: false - xy: 2525, 371 + xy: 1844, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-deepwater-medium +block-dark-panel-6-medium rotate: false - xy: 3691, 379 + xy: 2241, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-deepwater-small +block-dark-panel-6-small rotate: false - xy: 2207, 41 + xy: 4006, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-deepwater-tiny +block-dark-panel-6-tiny rotate: false - xy: 3263, 187 + xy: 2187, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-deepwater-xlarge +block-dark-panel-6-xlarge rotate: false xy: 2507, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-differential-generator-large +block-darksand-large rotate: false - xy: 2567, 371 + xy: 1928, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-differential-generator-medium +block-darksand-medium rotate: false - xy: 3725, 379 + xy: 2275, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-differential-generator-small +block-darksand-small rotate: false - xy: 2233, 41 + xy: 4033, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-differential-generator-tiny +block-darksand-tainted-water-large rotate: false - xy: 3281, 205 + xy: 1886, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-medium + rotate: false + xy: 2309, 211 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-small + rotate: false + xy: 4033, 193 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-tiny + rotate: false + xy: 2205, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-differential-generator-xlarge +block-darksand-tainted-water-xlarge rotate: false xy: 2557, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-diode-large +block-darksand-tiny rotate: false - xy: 2609, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-diode-medium - rotate: false - xy: 3759, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-diode-small - rotate: false - xy: 2156, 7 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-diode-tiny - rotate: false - xy: 3245, 151 + xy: 2223, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-diode-xlarge +block-darksand-water-large + rotate: false + xy: 1970, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-water-medium + rotate: false + xy: 1969, 185 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-water-small + rotate: false + xy: 4032, 167 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-water-tiny + rotate: false + xy: 2241, 11 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-xlarge rotate: false xy: 2607, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-disassembler-large - rotate: false - xy: 2651, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-disassembler-medium - rotate: false - xy: 3793, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-disassembler-small - rotate: false - xy: 4031, 335 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-disassembler-tiny - rotate: false - xy: 3263, 169 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-disassembler-xlarge +block-darksand-xlarge rotate: false xy: 2657, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-distributor-large +block-deepwater-large rotate: false - xy: 2693, 371 + xy: 1928, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-distributor-medium +block-deepwater-medium rotate: false - xy: 3827, 379 + xy: 2003, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-distributor-small +block-deepwater-small rotate: false - xy: 4057, 345 + xy: 4059, 226 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-distributor-tiny +block-deepwater-tiny rotate: false - xy: 3281, 187 + xy: 2259, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-distributor-xlarge +block-deepwater-xlarge rotate: false xy: 2707, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-door-large +block-differential-generator-large rotate: false - xy: 2735, 371 + xy: 2012, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-door-large-large +block-differential-generator-medium rotate: false - xy: 2777, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 3861, 379 + xy: 2037, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-door-large-small +block-differential-generator-small rotate: false - xy: 2259, 41 + xy: 4059, 200 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-door-large-tiny +block-differential-generator-tiny rotate: false - xy: 3263, 151 + xy: 2277, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-door-large-xlarge +block-differential-generator-xlarge rotate: false xy: 2757, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-door-medium +block-diode-large rotate: false - xy: 3895, 379 + xy: 1970, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-diode-medium + rotate: false + xy: 2071, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-door-small +block-diode-small rotate: false - xy: 2308, 103 + xy: 4059, 174 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-door-tiny +block-diode-tiny rotate: false - xy: 3281, 169 + xy: 2295, 18 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-door-xlarge +block-diode-xlarge rotate: false xy: 2807, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dunerocks-large +block-dirt-large rotate: false - xy: 2819, 371 + xy: 2054, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dunerocks-medium +block-dirt-medium rotate: false - xy: 3929, 379 + xy: 2105, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dunerocks-small +block-dirt-small rotate: false - xy: 2306, 77 + xy: 4058, 148 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dunerocks-tiny +block-dirt-tiny rotate: false - xy: 3281, 151 + xy: 2462, 89 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dunerocks-xlarge +block-dirt-wall-large + rotate: false + xy: 2012, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dirt-wall-medium + rotate: false + xy: 2139, 177 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-small + rotate: false + xy: 2445, 177 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dirt-wall-tiny + rotate: false + xy: 2069, 8 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dirt-wall-xlarge rotate: false xy: 2857, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-duo-large - rotate: false - xy: 2861, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 3963, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 2285, 48 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 3245, 133 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-duo-xlarge +block-dirt-xlarge rotate: false xy: 2907, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-exponential-reconstructor-large +block-disassembler-large rotate: false - xy: 2903, 371 + xy: 2096, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-exponential-reconstructor-medium +block-disassembler-medium rotate: false - xy: 3997, 379 + xy: 2173, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-exponential-reconstructor-small +block-disassembler-small rotate: false - xy: 2311, 51 + xy: 2450, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-exponential-reconstructor-tiny +block-disassembler-tiny rotate: false - xy: 3263, 133 + xy: 2087, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-exponential-reconstructor-xlarge +block-disassembler-xlarge rotate: false xy: 2957, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-force-projector-large +block-distributor-large rotate: false - xy: 2945, 371 + xy: 2054, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-force-projector-medium +block-distributor-medium rotate: false - xy: 3623, 355 + xy: 2207, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-force-projector-small +block-distributor-small rotate: false - xy: 2457, 91 + xy: 2450, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-force-projector-tiny +block-distributor-tiny rotate: false - xy: 3281, 133 + xy: 2453, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-force-projector-xlarge +block-distributor-xlarge rotate: false xy: 3007, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-fuse-large +block-door-large rotate: false - xy: 2987, 371 + xy: 2138, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-fuse-medium +block-door-large-large rotate: false - xy: 3657, 345 + xy: 2096, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-medium + rotate: false + xy: 2241, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-fuse-small +block-door-large-small rotate: false - xy: 4057, 319 + xy: 2471, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-fuse-tiny +block-door-large-tiny rotate: false - xy: 3299, 232 + xy: 2453, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-fuse-xlarge +block-door-large-xlarge rotate: false xy: 3057, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-graphite-press-large +block-door-medium rotate: false - xy: 3029, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 3691, 345 + xy: 2275, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-graphite-press-small +block-door-small rotate: false - xy: 2483, 143 + xy: 2497, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-graphite-press-tiny +block-door-tiny rotate: false - xy: 3299, 214 + xy: 2453, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-graphite-press-xlarge +block-door-xlarge rotate: false xy: 3107, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-grass-large +block-dune-wall-large rotate: false - xy: 3071, 371 + xy: 2180, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-grass-medium +block-dune-wall-medium rotate: false - xy: 3725, 345 + xy: 2309, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-grass-small +block-dune-wall-small rotate: false - xy: 2483, 117 + xy: 2523, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-grass-tiny +block-dune-wall-tiny rotate: false - xy: 3299, 196 + xy: 2453, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-grass-xlarge +block-dune-wall-xlarge rotate: false xy: 3157, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ground-factory-large +block-duo-large rotate: false - xy: 3113, 371 + xy: 2138, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ground-factory-medium +block-duo-medium rotate: false - xy: 3759, 345 + xy: 881, 121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ground-factory-small +block-duo-small rotate: false - xy: 2483, 91 + xy: 2549, 194 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ground-factory-tiny +block-duo-tiny rotate: false - xy: 3299, 178 + xy: 4047, 123 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ground-factory-xlarge +block-duo-xlarge rotate: false xy: 3207, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hail-large +block-exponential-reconstructor-large rotate: false - xy: 3155, 371 + xy: 2222, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hail-medium +block-exponential-reconstructor-medium rotate: false - xy: 3793, 345 + xy: 881, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hail-small +block-exponential-reconstructor-small rotate: false - xy: 2509, 154 + xy: 2549, 168 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hail-tiny +block-exponential-reconstructor-tiny rotate: false - xy: 3299, 160 + xy: 4065, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hail-xlarge +block-exponential-reconstructor-xlarge rotate: false xy: 3257, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-holostone-large +block-force-projector-large rotate: false - xy: 3197, 371 + xy: 2180, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-holostone-medium +block-force-projector-medium rotate: false - xy: 3827, 345 + xy: 881, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-holostone-small +block-force-projector-small rotate: false - xy: 2535, 154 + xy: 2575, 177 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-holostone-tiny +block-force-projector-tiny rotate: false - xy: 3299, 142 + xy: 4047, 105 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-holostone-xlarge +block-force-projector-xlarge rotate: false xy: 3307, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hotrock-large +block-foreshadow-large rotate: false - xy: 859, 329 + xy: 2264, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hotrock-medium +block-foreshadow-medium rotate: false - xy: 3861, 345 + xy: 881, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hotrock-small +block-foreshadow-small rotate: false - xy: 2509, 128 + xy: 2601, 177 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hotrock-tiny +block-foreshadow-tiny rotate: false - xy: 3299, 124 + xy: 4065, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hotrock-xlarge +block-foreshadow-xlarge rotate: false xy: 3357, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hyper-processor-large +block-fuse-large rotate: false - xy: 859, 287 + xy: 2222, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hyper-processor-medium +block-fuse-medium rotate: false - xy: 3895, 345 + xy: 915, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hyper-processor-small +block-fuse-small rotate: false - xy: 2509, 102 + xy: 2575, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hyper-processor-tiny +block-fuse-tiny rotate: false - xy: 3191, 123 + xy: 4065, 94 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hyper-processor-xlarge +block-fuse-xlarge rotate: false xy: 3407, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-large +block-graphite-press-large rotate: false - xy: 901, 329 + xy: 2306, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ice-medium +block-graphite-press-medium rotate: false - xy: 3929, 345 + xy: 915, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ice-small +block-graphite-press-small rotate: false - xy: 2535, 128 + xy: 2601, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ice-snow-large +block-graphite-press-tiny rotate: false - xy: 859, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 3963, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 2535, 102 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 3209, 123 + xy: 3809, 311 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ice-snow-xlarge +block-graphite-press-xlarge rotate: false xy: 3457, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-tiny +block-grass-large rotate: false - xy: 3227, 121 + xy: 2264, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-grass-medium + rotate: false + xy: 949, 119 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-grass-small + rotate: false + xy: 3581, 159 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-grass-tiny + rotate: false + xy: 2476, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ice-xlarge +block-grass-xlarge rotate: false xy: 3507, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-icerocks-large +block-ground-factory-large rotate: false - xy: 901, 287 + xy: 2348, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-icerocks-medium +block-ground-factory-medium rotate: false - xy: 3997, 345 + xy: 915, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-icerocks-small +block-ground-factory-small rotate: false - xy: 2509, 76 + xy: 3607, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-icerocks-tiny +block-ground-factory-tiny rotate: false - xy: 3245, 115 + xy: 2476, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-icerocks-xlarge +block-ground-factory-xlarge rotate: false xy: 3557, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ignarock-large +block-hail-large rotate: false - xy: 943, 329 + xy: 2306, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ignarock-medium +block-hail-medium rotate: false - xy: 2749, 246 + xy: 949, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ignarock-small +block-hail-small rotate: false - xy: 2535, 76 + xy: 3633, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ignarock-tiny +block-hail-tiny rotate: false - xy: 3263, 115 + xy: 2476, 139 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ignarock-xlarge +block-hail-xlarge rotate: false xy: 3607, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-illuminator-large +block-hotrock-large rotate: false - xy: 859, 203 + xy: 2390, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-illuminator-medium +block-hotrock-medium rotate: false - xy: 2657, 203 + xy: 949, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-illuminator-small +block-hotrock-small rotate: false - xy: 2285, 22 + xy: 3659, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-illuminator-tiny +block-hotrock-tiny rotate: false - xy: 3281, 115 + xy: 2494, 167 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-illuminator-xlarge +block-hotrock-xlarge rotate: false xy: 3657, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-impact-reactor-large +block-hyper-processor-large rotate: false - xy: 901, 245 + xy: 2348, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-impact-reactor-medium +block-hyper-processor-medium rotate: false - xy: 2691, 203 + xy: 915, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-impact-reactor-small +block-hyper-processor-small rotate: false - xy: 2311, 25 + xy: 3685, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-impact-reactor-tiny +block-hyper-processor-tiny rotate: false - xy: 3299, 106 + xy: 2512, 167 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-impact-reactor-xlarge +block-hyper-processor-xlarge rotate: false xy: 3707, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-incinerator-large +block-ice-large rotate: false - xy: 943, 287 + xy: 2432, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-incinerator-medium +block-ice-medium rotate: false - xy: 2725, 204 + xy: 949, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-incinerator-small +block-ice-small rotate: false - xy: 2332, 77 + xy: 3579, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-incinerator-tiny +block-ice-snow-large rotate: false - xy: 3391, 311 + xy: 2390, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-snow-medium + rotate: false + xy: 983, 119 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-small + rotate: false + xy: 3605, 133 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-tiny + rotate: false + xy: 2494, 149 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-incinerator-xlarge +block-ice-snow-xlarge rotate: false xy: 3757, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-inverted-sorter-large +block-ice-tiny rotate: false - xy: 985, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 2759, 212 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 2334, 103 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 3409, 311 + xy: 2530, 167 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-inverted-sorter-xlarge +block-ice-wall-large + rotate: false + xy: 2474, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-wall-medium + rotate: false + xy: 983, 85 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-small + rotate: false + xy: 3631, 133 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-wall-tiny + rotate: false + xy: 2512, 149 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-wall-xlarge rotate: false xy: 3807, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-item-source-large - rotate: false - xy: 901, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 2783, 246 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 2337, 51 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 3427, 311 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge +block-ice-xlarge rotate: false xy: 3857, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-item-void-large +block-illuminator-large rotate: false - xy: 943, 245 + xy: 2432, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-item-void-medium +block-illuminator-medium rotate: false - xy: 2793, 212 + xy: 983, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-item-void-small +block-illuminator-small rotate: false - xy: 2337, 25 + xy: 3657, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-item-void-tiny +block-illuminator-tiny rotate: false - xy: 3445, 311 + xy: 2530, 149 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-item-void-xlarge +block-illuminator-xlarge rotate: false xy: 3907, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-junction-large +block-impact-reactor-large rotate: false - xy: 985, 287 + xy: 2516, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-junction-medium +block-impact-reactor-medium rotate: false - xy: 3243, 343 + xy: 983, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-junction-small +block-impact-reactor-small rotate: false - xy: 2360, 105 + xy: 3683, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-junction-tiny +block-impact-reactor-tiny rotate: false - xy: 3463, 311 + xy: 2548, 150 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-junction-xlarge +block-impact-reactor-xlarge rotate: false xy: 3957, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-kiln-large +block-incinerator-large rotate: false - xy: 1027, 329 + xy: 2474, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-kiln-medium +block-incinerator-medium rotate: false - xy: 2497, 180 + xy: 2741, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-kiln-small +block-incinerator-small rotate: false - xy: 2386, 105 + xy: 1731, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-kiln-tiny +block-incinerator-tiny rotate: false - xy: 3481, 311 + xy: 2494, 131 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-kiln-xlarge +block-incinerator-xlarge rotate: false xy: 4007, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-lancer-large +block-inverted-sorter-large rotate: false - xy: 943, 203 + xy: 2558, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-lancer-medium +block-inverted-sorter-medium rotate: false - xy: 3359, 339 + xy: 2775, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-lancer-small +block-inverted-sorter-small rotate: false - xy: 2358, 77 + xy: 1757, 205 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-lancer-tiny +block-inverted-sorter-tiny rotate: false - xy: 3385, 293 + xy: 2512, 131 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-lancer-xlarge +block-inverted-sorter-xlarge rotate: false xy: 345, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-laser-drill-large +block-item-source-large rotate: false - xy: 985, 245 + xy: 2516, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-laser-drill-medium +block-item-source-medium rotate: false - xy: 3504, 337 + xy: 2809, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-laser-drill-small +block-item-source-small rotate: false - xy: 2384, 79 + xy: 1757, 96 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-laser-drill-tiny +block-item-source-tiny rotate: false - xy: 3385, 275 + xy: 2530, 131 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-laser-drill-xlarge +block-item-source-xlarge rotate: false xy: 395, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-launch-pad-large +block-item-void-large rotate: false - xy: 1027, 287 + xy: 2600, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-launch-pad-large-large +block-item-void-medium rotate: false - xy: 1069, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 3538, 337 + xy: 2843, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-launch-pad-large-small +block-item-void-small rotate: false - xy: 2363, 51 + xy: 1757, 70 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-launch-pad-large-tiny +block-item-void-tiny rotate: false - xy: 3403, 293 + xy: 2548, 132 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-launch-pad-large-xlarge +block-item-void-xlarge rotate: false xy: 445, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-launch-pad-medium +block-junction-large rotate: false - xy: 3572, 337 + xy: 2558, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-junction-medium + rotate: false + xy: 2877, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-launch-pad-small +block-junction-small rotate: false - xy: 2363, 25 + xy: 1757, 44 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-launch-pad-tiny +block-junction-tiny rotate: false - xy: 3385, 257 + xy: 2566, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-launch-pad-xlarge +block-junction-xlarge rotate: false xy: 495, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-junction-large +block-kiln-large rotate: false - xy: 985, 203 + xy: 2642, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-junction-medium +block-kiln-medium rotate: false - xy: 2759, 178 + xy: 2911, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-junction-small +block-kiln-small rotate: false - xy: 2389, 53 + xy: 3711, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-junction-tiny +block-kiln-tiny rotate: false - xy: 3403, 275 + xy: 2584, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-junction-xlarge +block-kiln-xlarge rotate: false xy: 545, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-router-large +block-lancer-large rotate: false - xy: 1027, 245 + xy: 2600, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-router-medium +block-lancer-medium rotate: false - xy: 2793, 178 + xy: 2945, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-router-small +block-lancer-small rotate: false - xy: 2389, 27 + xy: 3737, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-router-tiny +block-lancer-tiny rotate: false - xy: 3421, 293 + xy: 2602, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-router-xlarge +block-lancer-xlarge rotate: false xy: 595, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-source-large +block-large-logic-display-large rotate: false - xy: 1069, 287 + xy: 2684, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-source-medium +block-large-logic-display-medium rotate: false - xy: 2725, 170 + xy: 2979, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-source-small +block-large-logic-display-small rotate: false - xy: 2389, 1 + xy: 3763, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-source-tiny +block-large-logic-display-tiny rotate: false - xy: 3385, 239 + xy: 2620, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-source-xlarge +block-large-logic-display-xlarge rotate: false xy: 645, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-tank-large +block-laser-drill-large rotate: false - xy: 1111, 329 + xy: 2642, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-tank-medium +block-laser-drill-medium rotate: false - xy: 2531, 180 + xy: 3013, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-tank-small +block-laser-drill-small rotate: false - xy: 2410, 79 + xy: 3789, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-tank-tiny +block-laser-drill-tiny rotate: false - xy: 3403, 257 + xy: 1989, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-tank-xlarge +block-laser-drill-xlarge rotate: false xy: 695, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-void-large +block-launch-pad-large rotate: false - xy: 1027, 203 + xy: 2726, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-void-medium +block-launch-pad-large-large rotate: false - xy: 2565, 182 + xy: 2684, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-medium + rotate: false + xy: 3047, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-void-small +block-launch-pad-large-small rotate: false - xy: 2415, 53 + xy: 3815, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-void-tiny +block-launch-pad-large-tiny rotate: false - xy: 3421, 275 + xy: 2007, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-void-xlarge +block-launch-pad-large-xlarge rotate: false xy: 231, 96 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-logic-display-large +block-launch-pad-medium rotate: false - xy: 1069, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-display-medium - rotate: false - xy: 2599, 182 + xy: 3081, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-logic-display-small +block-launch-pad-small rotate: false - xy: 2415, 27 + xy: 3841, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-logic-display-tiny +block-launch-pad-tiny rotate: false - xy: 3439, 293 + xy: 2025, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-logic-display-xlarge +block-launch-pad-xlarge rotate: false xy: 231, 46 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-logic-processor-large +block-liquid-junction-large rotate: false - xy: 1111, 287 + xy: 2768, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-logic-processor-medium +block-liquid-junction-medium rotate: false - xy: 3393, 329 + xy: 3115, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-logic-processor-small +block-liquid-junction-small rotate: false - xy: 2415, 1 + xy: 3867, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-logic-processor-tiny +block-liquid-junction-tiny rotate: false - xy: 3403, 239 + xy: 2043, 3 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-logic-processor-xlarge +block-liquid-junction-xlarge rotate: false xy: 745, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-magmarock-large +block-liquid-router-large rotate: false - xy: 1153, 329 + xy: 2726, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-magmarock-medium +block-liquid-router-medium rotate: false - xy: 3427, 329 + xy: 3149, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-magmarock-small +block-liquid-router-small rotate: false - xy: 3243, 317 + xy: 3893, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-magmarock-tiny +block-liquid-router-tiny rotate: false - xy: 3421, 257 + xy: 3887, 312 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-magmarock-xlarge +block-liquid-router-xlarge rotate: false xy: 281, 107 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mass-driver-large +block-liquid-source-large rotate: false - xy: 1069, 203 + xy: 2810, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mass-driver-medium +block-liquid-source-medium rotate: false - xy: 3461, 329 + xy: 3183, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mass-driver-small +block-liquid-source-small rotate: false - xy: 3269, 311 + xy: 3919, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mass-driver-tiny +block-liquid-source-tiny rotate: false - xy: 3439, 275 + xy: 3887, 294 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mass-driver-xlarge +block-liquid-source-xlarge rotate: false xy: 281, 57 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mechanical-drill-large +block-liquid-tank-large rotate: false - xy: 1111, 245 + xy: 2768, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mechanical-drill-medium +block-liquid-tank-medium rotate: false - xy: 2759, 144 + xy: 3217, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mechanical-drill-small +block-liquid-tank-small rotate: false - xy: 3295, 311 + xy: 3945, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mechanical-drill-tiny +block-liquid-tank-tiny rotate: false - xy: 3457, 293 + xy: 3887, 276 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mechanical-drill-xlarge +block-liquid-tank-xlarge rotate: false xy: 795, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mechanical-pump-large +block-liquid-void-large rotate: false - xy: 1153, 287 + xy: 2852, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mechanical-pump-medium +block-liquid-void-medium rotate: false - xy: 2793, 144 + xy: 3251, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mechanical-pump-small +block-liquid-void-small rotate: false - xy: 3321, 311 + xy: 3971, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mechanical-pump-tiny +block-liquid-void-tiny rotate: false - xy: 3421, 239 + xy: 3905, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mechanical-pump-xlarge +block-liquid-void-xlarge rotate: false xy: 309, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-meltdown-large +block-logic-display-large rotate: false - xy: 1195, 329 + xy: 2810, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-meltdown-medium +block-logic-display-medium rotate: false - xy: 881, 140 + xy: 3285, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-meltdown-small +block-logic-display-small rotate: false - xy: 3347, 313 + xy: 3997, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-meltdown-tiny +block-logic-display-tiny rotate: false - xy: 3439, 257 + xy: 3923, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-meltdown-xlarge +block-logic-display-xlarge rotate: false xy: 309, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-melter-large +block-logic-processor-large rotate: false - xy: 1111, 203 + xy: 2894, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-melter-medium +block-logic-processor-medium rotate: false - xy: 915, 140 + xy: 3319, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-melter-small +block-logic-processor-small rotate: false - xy: 2787, 312 + xy: 4023, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-melter-tiny +block-logic-processor-tiny rotate: false - xy: 3457, 275 + xy: 3941, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-melter-xlarge +block-logic-processor-xlarge rotate: false xy: 359, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-memory-cell-large +block-magmarock-large rotate: false - xy: 1153, 245 + xy: 2852, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-memory-cell-medium +block-magmarock-medium rotate: false - xy: 881, 106 + xy: 3353, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-memory-cell-small +block-magmarock-small rotate: false - xy: 2787, 286 + xy: 3709, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-memory-cell-tiny +block-magmarock-tiny rotate: false - xy: 3475, 293 + xy: 3905, 287 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-memory-cell-xlarge +block-magmarock-xlarge rotate: false xy: 309, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mend-projector-large +block-mass-driver-large rotate: false - xy: 1195, 287 + xy: 2936, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mend-projector-medium +block-mass-driver-medium rotate: false - xy: 949, 140 + xy: 3387, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mend-projector-small +block-mass-driver-small rotate: false - xy: 2813, 316 + xy: 3735, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mend-projector-tiny +block-mass-driver-tiny rotate: false - xy: 3439, 239 + xy: 3923, 287 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mend-projector-xlarge +block-mass-driver-xlarge rotate: false xy: 359, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mender-large +block-mechanical-drill-large rotate: false - xy: 1237, 329 + xy: 2894, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mender-medium +block-mechanical-drill-medium rotate: false - xy: 881, 72 + xy: 1631, 222 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mender-small +block-mechanical-drill-small rotate: false - xy: 2839, 316 + xy: 3761, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mender-tiny +block-mechanical-drill-tiny rotate: false - xy: 3457, 257 + xy: 3941, 287 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mender-xlarge +block-mechanical-drill-xlarge rotate: false xy: 409, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-message-large +block-mechanical-pump-large rotate: false - xy: 1153, 203 + xy: 2978, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-message-medium +block-mechanical-pump-medium rotate: false - xy: 915, 106 + xy: 1665, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-message-small +block-mechanical-pump-small rotate: false - xy: 2813, 290 + xy: 3787, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-message-tiny +block-mechanical-pump-tiny rotate: false - xy: 3475, 275 + xy: 3959, 295 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-message-xlarge +block-mechanical-pump-xlarge rotate: false xy: 359, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-2-large +block-meltdown-large rotate: false - xy: 1195, 245 + xy: 2936, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-2-medium +block-meltdown-medium rotate: false - xy: 983, 140 + xy: 1699, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-2-small +block-meltdown-small rotate: false - xy: 2865, 316 + xy: 3813, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-2-tiny +block-meltdown-tiny rotate: false - xy: 3457, 239 + xy: 3977, 295 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-2-xlarge +block-meltdown-xlarge rotate: false xy: 409, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-3-large +block-melter-large rotate: false - xy: 1237, 287 + xy: 3020, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-3-medium +block-melter-medium rotate: false - xy: 881, 38 + xy: 3421, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-3-small +block-melter-small rotate: false - xy: 2839, 290 + xy: 3839, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-3-tiny +block-melter-tiny rotate: false - xy: 3475, 257 + xy: 3959, 277 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-3-xlarge +block-melter-xlarge rotate: false xy: 459, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-5-large +block-memory-bank-large rotate: false - xy: 1279, 329 + xy: 2978, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-5-medium +block-memory-bank-medium rotate: false - xy: 915, 72 + xy: 3455, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-5-small +block-memory-bank-small rotate: false - xy: 2891, 316 + xy: 3865, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-5-tiny +block-memory-bank-tiny rotate: false - xy: 3475, 239 + xy: 3977, 277 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-5-xlarge +block-memory-bank-xlarge rotate: false xy: 409, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-damaged-large +block-memory-cell-large rotate: false - xy: 1195, 203 + xy: 3062, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-damaged-medium +block-memory-cell-medium rotate: false - xy: 949, 106 + xy: 3421, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-damaged-small +block-memory-cell-small rotate: false - xy: 2865, 290 + xy: 3891, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-damaged-tiny +block-memory-cell-tiny rotate: false - xy: 3385, 221 + xy: 2471, 71 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-damaged-xlarge +block-memory-cell-xlarge rotate: false xy: 459, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-large +block-mend-projector-large rotate: false - xy: 1237, 245 + xy: 3020, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-medium +block-mend-projector-medium rotate: false - xy: 1017, 140 + xy: 3455, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-small +block-mend-projector-small rotate: false - xy: 2917, 316 + xy: 3917, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-tiny +block-mend-projector-tiny rotate: false - xy: 3403, 221 + xy: 2471, 53 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-xlarge +block-mend-projector-xlarge rotate: false xy: 509, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-micro-processor-large +block-mender-large rotate: false - xy: 1279, 287 + xy: 3104, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-micro-processor-medium +block-mender-medium rotate: false - xy: 915, 38 + xy: 2555, 220 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-micro-processor-small +block-mender-small rotate: false - xy: 2891, 290 + xy: 3943, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-micro-processor-tiny +block-mender-tiny rotate: false - xy: 3421, 221 + xy: 2471, 35 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-micro-processor-xlarge +block-mender-xlarge rotate: false xy: 459, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-moss-large +block-message-large rotate: false - xy: 1321, 329 + xy: 3062, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-moss-medium +block-message-medium rotate: false - xy: 949, 72 + xy: 2589, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-moss-small +block-message-small rotate: false - xy: 2943, 316 + xy: 3969, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-moss-tiny +block-message-tiny rotate: false - xy: 3439, 221 + xy: 2471, 17 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-moss-xlarge +block-message-xlarge rotate: false xy: 509, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multi-press-large +block-metal-floor-2-large rotate: false - xy: 1237, 203 + xy: 3146, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multi-press-medium +block-metal-floor-2-medium rotate: false - xy: 983, 106 + xy: 2471, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multi-press-small +block-metal-floor-2-small rotate: false - xy: 2917, 290 + xy: 3995, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multi-press-tiny +block-metal-floor-2-tiny rotate: false - xy: 3457, 221 + xy: 2548, 114 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multi-press-xlarge +block-metal-floor-2-xlarge rotate: false xy: 559, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-large +block-metal-floor-3-large rotate: false - xy: 1279, 245 + xy: 3104, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-medium +block-metal-floor-3-medium rotate: false - xy: 1051, 140 + xy: 2505, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-small +block-metal-floor-3-small rotate: false - xy: 2969, 316 + xy: 4021, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-tiny +block-metal-floor-3-tiny rotate: false - xy: 3475, 221 + xy: 2566, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-xlarge +block-metal-floor-3-xlarge rotate: false xy: 509, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-naval-factory-large +block-metal-floor-5-large rotate: false - xy: 1321, 287 + xy: 3188, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-naval-factory-medium +block-metal-floor-5-medium rotate: false - xy: 949, 38 + xy: 3552, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-naval-factory-small +block-metal-floor-5-small rotate: false - xy: 2943, 290 + xy: 1760, 179 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-naval-factory-tiny +block-metal-floor-5-tiny rotate: false - xy: 3493, 293 + xy: 2584, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-naval-factory-xlarge +block-metal-floor-5-xlarge rotate: false xy: 559, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-oil-extractor-large +block-metal-floor-damaged-large rotate: false - xy: 1363, 329 + xy: 3146, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-oil-extractor-medium +block-metal-floor-damaged-medium rotate: false - xy: 983, 72 + xy: 3587, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-oil-extractor-small +block-metal-floor-damaged-small rotate: false - xy: 2995, 316 + xy: 1760, 153 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-oil-extractor-tiny +block-metal-floor-damaged-tiny rotate: false - xy: 3493, 275 + xy: 2602, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-oil-extractor-xlarge +block-metal-floor-damaged-xlarge rotate: false xy: 609, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-coal-large +block-metal-floor-large rotate: false - xy: 1279, 203 + xy: 3230, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-coal-medium +block-metal-floor-medium rotate: false - xy: 1017, 106 + xy: 3621, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-coal-small +block-metal-floor-small rotate: false - xy: 2969, 290 + xy: 1760, 127 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-coal-tiny +block-metal-floor-tiny rotate: false - xy: 3493, 257 + xy: 2620, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-coal-xlarge +block-metal-floor-xlarge rotate: false xy: 559, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-copper-large +block-micro-processor-large rotate: false - xy: 1321, 245 + xy: 3188, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-copper-medium +block-micro-processor-medium rotate: false - xy: 1085, 140 + xy: 3655, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-copper-small +block-micro-processor-small rotate: false - xy: 3021, 316 + xy: 1786, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-copper-tiny +block-micro-processor-tiny rotate: false - xy: 3493, 239 + xy: 2566, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-copper-xlarge +block-micro-processor-xlarge rotate: false xy: 609, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-lead-large +block-moss-large rotate: false - xy: 1363, 287 + xy: 3272, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-lead-medium +block-moss-medium rotate: false - xy: 983, 38 + xy: 3689, 217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-lead-small +block-moss-small rotate: false - xy: 2995, 290 + xy: 1786, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-lead-tiny +block-moss-tiny rotate: false - xy: 3493, 221 + xy: 2584, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-lead-xlarge +block-moss-xlarge rotate: false xy: 659, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-scrap-large +block-mud-large rotate: false - xy: 1405, 329 + xy: 3230, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-scrap-medium +block-mud-medium rotate: false - xy: 1017, 72 + xy: 3723, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-scrap-small +block-mud-small rotate: false - xy: 3047, 316 + xy: 1812, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-scrap-tiny +block-mud-tiny rotate: false - xy: 2182, 28 + xy: 2602, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-scrap-xlarge +block-mud-xlarge rotate: false xy: 609, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-thorium-large +block-multi-press-large rotate: false - xy: 1321, 203 + xy: 3314, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-thorium-medium +block-multi-press-medium rotate: false - xy: 1051, 106 + xy: 3757, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-thorium-small +block-multi-press-small rotate: false - xy: 3021, 290 + xy: 1812, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-thorium-tiny +block-multi-press-tiny rotate: false - xy: 2200, 23 + xy: 2620, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-thorium-xlarge +block-multi-press-xlarge rotate: false xy: 659, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-titanium-large +block-multiplicative-reconstructor-large rotate: false - xy: 1363, 245 + xy: 3272, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-titanium-medium +block-multiplicative-reconstructor-medium rotate: false - xy: 1017, 38 + xy: 993, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-titanium-small +block-multiplicative-reconstructor-small rotate: false - xy: 3073, 316 + xy: 1786, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-titanium-tiny +block-multiplicative-reconstructor-tiny rotate: false - xy: 2218, 23 + xy: 2627, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-titanium-xlarge +block-multiplicative-reconstructor-xlarge rotate: false xy: 709, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-dome-large +block-naval-factory-large rotate: false - xy: 1405, 287 + xy: 3356, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-dome-medium +block-naval-factory-medium rotate: false - xy: 1051, 72 + xy: 1027, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-dome-small +block-naval-factory-small rotate: false - xy: 3047, 290 + xy: 1838, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-dome-tiny +block-naval-factory-tiny rotate: false - xy: 2236, 23 + xy: 2627, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-dome-xlarge +block-naval-factory-xlarge rotate: false xy: 659, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-projector-large +block-oil-extractor-large rotate: false - xy: 1447, 329 + xy: 3314, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-projector-medium +block-oil-extractor-medium rotate: false - xy: 1085, 106 + xy: 1061, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-projector-small +block-oil-extractor-small rotate: false - xy: 3099, 316 + xy: 1838, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-projector-tiny +block-oil-extractor-tiny rotate: false - xy: 2254, 23 + xy: 2638, 136 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-projector-xlarge +block-oil-extractor-xlarge rotate: false xy: 709, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overflow-gate-large +block-ore-coal-large rotate: false - xy: 1363, 203 + xy: 3398, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overflow-gate-medium +block-ore-coal-medium rotate: false - xy: 1051, 38 + xy: 1095, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overflow-gate-small +block-ore-coal-small rotate: false - xy: 3073, 290 + xy: 1812, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overflow-gate-tiny +block-ore-coal-tiny rotate: false - xy: 2260, 5 + xy: 2638, 118 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overflow-gate-xlarge +block-ore-coal-xlarge rotate: false xy: 709, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-parallax-large +block-ore-copper-large rotate: false - xy: 1405, 245 + xy: 3356, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-parallax-medium +block-ore-copper-medium rotate: false - xy: 1085, 72 + xy: 1129, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-parallax-small +block-ore-copper-small rotate: false - xy: 3125, 316 + xy: 1864, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-parallax-tiny +block-ore-copper-tiny rotate: false - xy: 2278, 4 + xy: 2638, 100 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-parallax-xlarge +block-ore-copper-xlarge rotate: false xy: 759, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-conveyor-large +block-ore-lead-large rotate: false - xy: 1447, 287 + xy: 3440, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-conveyor-medium +block-ore-lead-medium rotate: false - xy: 1085, 38 + xy: 1163, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-conveyor-small +block-ore-lead-small rotate: false - xy: 3099, 290 + xy: 1864, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-conveyor-tiny +block-ore-lead-tiny rotate: false - xy: 2296, 4 + xy: 2638, 82 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-conveyor-xlarge +block-ore-lead-xlarge rotate: false xy: 759, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-router-large +block-ore-scrap-large rotate: false - xy: 1489, 329 + xy: 3398, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-router-medium +block-ore-scrap-medium rotate: false - xy: 881, 4 + xy: 1197, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-router-small +block-ore-scrap-small rotate: false - xy: 3151, 316 + xy: 1838, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-router-tiny +block-ore-scrap-tiny rotate: false - xy: 2314, 7 + xy: 2480, 96 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-router-xlarge +block-ore-scrap-xlarge rotate: false xy: 759, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pebbles-large +block-ore-thorium-large rotate: false - xy: 1405, 203 + xy: 3482, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pebbles-medium +block-ore-thorium-medium rotate: false - xy: 915, 4 + xy: 1231, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pebbles-small +block-ore-thorium-small rotate: false - xy: 3125, 290 + xy: 1890, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pebbles-tiny +block-ore-thorium-tiny rotate: false - xy: 2332, 7 + xy: 2489, 78 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pebbles-xlarge +block-ore-thorium-xlarge rotate: false xy: 809, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conduit-large +block-ore-titanium-large rotate: false - xy: 1447, 245 + xy: 3440, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conduit-medium +block-ore-titanium-medium rotate: false - xy: 949, 4 + xy: 1265, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conduit-small +block-ore-titanium-small rotate: false - xy: 3177, 316 + xy: 1890, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conduit-tiny +block-ore-titanium-tiny rotate: false - xy: 2350, 7 + xy: 2489, 60 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conduit-xlarge +block-ore-titanium-xlarge rotate: false xy: 809, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conveyor-large +block-overdrive-dome-large rotate: false - xy: 1489, 287 + xy: 3524, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conveyor-medium +block-overdrive-dome-medium rotate: false - xy: 983, 4 + xy: 1299, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conveyor-small +block-overdrive-dome-small rotate: false - xy: 3151, 290 + xy: 1864, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conveyor-tiny +block-overdrive-dome-tiny rotate: false - xy: 2368, 7 + xy: 2489, 42 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conveyor-xlarge +block-overdrive-dome-xlarge rotate: false xy: 809, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-large +block-overdrive-projector-large rotate: false - xy: 1531, 329 + xy: 3482, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-wall-large-large +block-overdrive-projector-medium rotate: false - xy: 1447, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 1017, 4 + xy: 1333, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-wall-large-small +block-overdrive-projector-small rotate: false - xy: 3177, 290 + xy: 1916, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-wall-large-tiny +block-overdrive-projector-tiny rotate: false - xy: 3499, 319 + xy: 2489, 24 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-wall-large-xlarge +block-overdrive-projector-xlarge rotate: false xy: 809, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-medium +block-overflow-gate-large rotate: false - xy: 1051, 4 + xy: 3566, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-overflow-gate-medium + rotate: false + xy: 1367, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-wall-small +block-overflow-gate-small rotate: false - xy: 3203, 311 + xy: 1916, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-wall-tiny +block-overflow-gate-tiny rotate: false - xy: 3517, 319 + xy: 2498, 96 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-wall-xlarge +block-overflow-gate-xlarge rotate: false xy: 281, 7 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-weaver-large +block-parallax-large rotate: false - xy: 1489, 245 + xy: 3524, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-weaver-medium +block-parallax-medium rotate: false - xy: 1085, 4 + xy: 1401, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-weaver-small +block-parallax-small rotate: false - xy: 3203, 285 + xy: 1890, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-weaver-tiny +block-parallax-tiny rotate: false - xy: 3535, 319 + xy: 2507, 78 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-weaver-xlarge +block-parallax-xlarge rotate: false xy: 331, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pine-large +block-payload-conveyor-large rotate: false - xy: 1531, 287 + xy: 3608, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pine-medium +block-payload-conveyor-medium rotate: false - xy: 1119, 140 + xy: 1435, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pine-small +block-payload-conveyor-small rotate: false - xy: 2817, 264 + xy: 1942, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pine-tiny +block-payload-conveyor-tiny rotate: false - xy: 3553, 319 + xy: 2507, 60 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pine-xlarge +block-payload-conveyor-xlarge rotate: false xy: 331, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-compressor-large +block-payload-router-large rotate: false - xy: 1573, 329 + xy: 3566, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-compressor-medium +block-payload-router-medium rotate: false - xy: 1119, 106 + xy: 1469, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-compressor-small +block-payload-router-small rotate: false - xy: 2843, 264 + xy: 1942, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-compressor-tiny +block-payload-router-tiny rotate: false - xy: 3571, 319 + xy: 2507, 42 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-compressor-xlarge +block-payload-router-xlarge rotate: false xy: 381, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-conveyor-large +block-pebbles-large rotate: false - xy: 1489, 203 + xy: 3650, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-conveyor-medium +block-pebbles-medium rotate: false - xy: 1119, 72 + xy: 1503, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-conveyor-small +block-pebbles-small rotate: false - xy: 2869, 264 + xy: 1916, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-conveyor-tiny +block-pebbles-tiny rotate: false - xy: 3589, 319 + xy: 2507, 24 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-conveyor-xlarge +block-pebbles-xlarge rotate: false xy: 331, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-large +block-phase-conduit-large rotate: false - xy: 1531, 245 + xy: 3608, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-wall-large-large +block-phase-conduit-medium rotate: false - xy: 1573, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 1119, 38 + xy: 1537, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-large-small +block-phase-conduit-small rotate: false - xy: 2895, 264 + xy: 1942, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-large-tiny +block-phase-conduit-tiny rotate: false - xy: 3511, 301 + xy: 2516, 96 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-large-xlarge +block-phase-conduit-xlarge rotate: false xy: 381, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-medium +block-phase-conveyor-large rotate: false - xy: 1119, 4 + xy: 3650, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conveyor-medium + rotate: false + xy: 1571, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-small +block-phase-conveyor-small rotate: false - xy: 2921, 264 + xy: 1968, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-tiny +block-phase-conveyor-tiny rotate: false - xy: 3511, 283 + xy: 2525, 78 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-xlarge +block-phase-conveyor-xlarge rotate: false xy: 431, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plated-conduit-large +block-phase-wall-large rotate: false - xy: 1615, 329 + xy: 959, 271 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plated-conduit-medium +block-phase-wall-large-large rotate: false - xy: 1153, 135 + xy: 131, 4 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-medium + rotate: false + xy: 1003, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plated-conduit-small +block-phase-wall-large-small rotate: false - xy: 2947, 264 + xy: 1968, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plated-conduit-tiny +block-phase-wall-large-tiny rotate: false - xy: 3529, 301 + xy: 2525, 60 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plated-conduit-xlarge +block-phase-wall-large-xlarge rotate: false xy: 381, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pneumatic-drill-large +block-phase-wall-medium rotate: false - xy: 1531, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 1153, 101 + xy: 1037, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pneumatic-drill-small +block-phase-wall-small rotate: false - xy: 2973, 264 + xy: 1994, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pneumatic-drill-tiny +block-phase-wall-tiny rotate: false - xy: 3511, 265 + xy: 2525, 42 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pneumatic-drill-xlarge +block-phase-wall-xlarge rotate: false xy: 431, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-large +block-phase-weaver-large rotate: false - xy: 1573, 245 + xy: 173, 4 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-node-large-large +block-phase-weaver-medium rotate: false - xy: 1615, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 1187, 135 + xy: 1071, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-large-small +block-phase-weaver-small rotate: false - xy: 2999, 264 + xy: 2020, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-large-tiny +block-phase-weaver-tiny rotate: false - xy: 3529, 283 + xy: 2525, 24 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-large-xlarge +block-phase-weaver-xlarge rotate: false xy: 481, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-medium +block-pine-large rotate: false - xy: 1153, 67 + xy: 215, 4 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pine-medium + rotate: false + xy: 1105, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-small +block-pine-small rotate: false - xy: 3025, 264 + xy: 2046, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-tiny +block-pine-tiny rotate: false - xy: 3547, 301 + xy: 2534, 96 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-xlarge +block-pine-xlarge rotate: false xy: 431, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-source-large +block-plastanium-compressor-large rotate: false - xy: 1657, 329 + xy: 3692, 335 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-source-medium +block-plastanium-compressor-medium rotate: false - xy: 1187, 101 + xy: 1139, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-source-small +block-plastanium-compressor-small rotate: false - xy: 3051, 264 + xy: 2072, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-source-tiny +block-plastanium-compressor-tiny rotate: false - xy: 3511, 247 + xy: 2543, 78 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-source-xlarge +block-plastanium-compressor-xlarge rotate: false xy: 481, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-void-large +block-plastanium-conveyor-large rotate: false - xy: 1573, 203 + xy: 909, 231 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-void-medium +block-plastanium-conveyor-medium rotate: false - xy: 1221, 135 + xy: 1173, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-void-small +block-plastanium-conveyor-small rotate: false - xy: 3077, 264 + xy: 2098, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-void-tiny +block-plastanium-conveyor-tiny rotate: false - xy: 3529, 265 + xy: 2543, 60 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-void-xlarge +block-plastanium-conveyor-xlarge rotate: false xy: 531, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulse-conduit-large +block-plastanium-wall-large rotate: false - xy: 1615, 245 + xy: 951, 229 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulse-conduit-medium +block-plastanium-wall-large-large rotate: false - xy: 1153, 33 + xy: 902, 189 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-medium + rotate: false + xy: 1207, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulse-conduit-small +block-plastanium-wall-large-small rotate: false - xy: 3103, 264 + xy: 2124, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulse-conduit-tiny +block-plastanium-wall-large-tiny rotate: false - xy: 3547, 283 + xy: 2543, 42 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulse-conduit-xlarge +block-plastanium-wall-large-xlarge rotate: false xy: 481, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulverizer-large +block-plastanium-wall-medium rotate: false - xy: 1657, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulverizer-medium - rotate: false - xy: 1187, 67 + xy: 1241, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulverizer-small +block-plastanium-wall-small rotate: false - xy: 3129, 264 + xy: 2150, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulverizer-tiny +block-plastanium-wall-tiny rotate: false - xy: 3565, 301 + xy: 2543, 24 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulverizer-xlarge +block-plastanium-wall-xlarge rotate: false xy: 531, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pyratite-mixer-large +block-plated-conduit-large rotate: false - xy: 1699, 329 + xy: 944, 187 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pyratite-mixer-medium +block-plated-conduit-medium rotate: false - xy: 1221, 101 + xy: 1275, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pyratite-mixer-small +block-plated-conduit-small rotate: false - xy: 3155, 264 + xy: 2176, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pyratite-mixer-tiny +block-plated-conduit-tiny rotate: false - xy: 3511, 229 + xy: 2561, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pyratite-mixer-xlarge +block-plated-conduit-xlarge rotate: false xy: 581, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-repair-point-large +block-pneumatic-drill-large rotate: false - xy: 1615, 203 + xy: 1004, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-repair-point-medium +block-pneumatic-drill-medium rotate: false - xy: 1255, 135 + xy: 1309, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-repair-point-small +block-pneumatic-drill-small rotate: false - xy: 3229, 291 + xy: 2202, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-repair-point-tiny +block-pneumatic-drill-tiny rotate: false - xy: 3529, 247 + xy: 2561, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-repair-point-xlarge +block-pneumatic-drill-xlarge rotate: false xy: 531, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-resupply-point-large +block-power-node-large rotate: false - xy: 1657, 245 + xy: 1046, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-resupply-point-medium +block-power-node-large-large rotate: false - xy: 1187, 33 + xy: 1088, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-medium + rotate: false + xy: 1343, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-resupply-point-small +block-power-node-large-small rotate: false - xy: 2827, 238 + xy: 2228, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-resupply-point-tiny +block-power-node-large-tiny rotate: false - xy: 3547, 265 + xy: 2579, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-resupply-point-xlarge +block-power-node-large-xlarge rotate: false xy: 581, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ripple-large +block-power-node-medium rotate: false - xy: 1699, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ripple-medium - rotate: false - xy: 1221, 67 + xy: 1377, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ripple-small +block-power-node-small rotate: false - xy: 2827, 212 + xy: 2254, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ripple-tiny +block-power-node-tiny rotate: false - xy: 3565, 283 + xy: 2561, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ripple-xlarge +block-power-node-xlarge rotate: false xy: 631, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rock-large +block-power-source-large rotate: false - xy: 1741, 329 + xy: 1130, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rock-medium +block-power-source-medium rotate: false - xy: 1255, 101 + xy: 1411, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rock-small +block-power-source-small rotate: false - xy: 2853, 238 + xy: 2280, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rock-tiny +block-power-source-tiny rotate: false - xy: 3583, 301 + xy: 2579, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rock-xlarge +block-power-source-xlarge rotate: false xy: 581, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rocks-large +block-power-void-large rotate: false - xy: 1657, 203 + xy: 1172, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rocks-medium +block-power-void-medium rotate: false - xy: 1289, 135 + xy: 1445, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rocks-small +block-power-void-small rotate: false - xy: 2827, 186 + xy: 2306, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rocks-tiny +block-power-void-tiny rotate: false - xy: 3529, 229 + xy: 2597, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rocks-xlarge +block-power-void-xlarge rotate: false xy: 631, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rotary-pump-large +block-pulse-conduit-large rotate: false - xy: 1699, 245 + xy: 1214, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rotary-pump-medium +block-pulse-conduit-medium rotate: false - xy: 1221, 33 + xy: 1479, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rotary-pump-small +block-pulse-conduit-small rotate: false - xy: 2853, 212 + xy: 1994, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rotary-pump-tiny +block-pulse-conduit-tiny rotate: false - xy: 3547, 247 + xy: 2561, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rotary-pump-xlarge +block-pulse-conduit-xlarge rotate: false xy: 681, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-router-large +block-pulverizer-large rotate: false - xy: 1741, 287 + xy: 1256, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-router-medium +block-pulverizer-medium rotate: false - xy: 1255, 67 + xy: 1513, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-router-small +block-pulverizer-small rotate: false - xy: 2879, 238 + xy: 2020, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-router-tiny +block-pulverizer-tiny rotate: false - xy: 3565, 265 + xy: 2579, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-router-xlarge +block-pulverizer-xlarge rotate: false xy: 631, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rtg-generator-large +block-pyratite-mixer-large rotate: false - xy: 1783, 329 + xy: 1298, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rtg-generator-medium +block-pyratite-mixer-medium rotate: false - xy: 1289, 101 + xy: 1547, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rtg-generator-small +block-pyratite-mixer-small rotate: false - xy: 2827, 160 + xy: 2046, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rtg-generator-tiny +block-pyratite-mixer-tiny rotate: false - xy: 3583, 283 + xy: 2597, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rtg-generator-xlarge +block-pyratite-mixer-xlarge rotate: false xy: 681, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salt-large +block-repair-point-large rotate: false - xy: 1699, 203 + xy: 1340, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salt-medium +block-repair-point-medium rotate: false - xy: 1323, 135 + xy: 1581, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salt-small +block-repair-point-small rotate: false - xy: 2853, 186 + xy: 2072, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salt-tiny +block-repair-point-tiny rotate: false - xy: 3547, 229 + xy: 2615, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salt-xlarge +block-repair-point-xlarge rotate: false xy: 731, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-saltrocks-large +block-resupply-point-large rotate: false - xy: 1741, 245 + xy: 1382, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-saltrocks-medium +block-resupply-point-medium rotate: false - xy: 1255, 33 + xy: 1017, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-saltrocks-small +block-resupply-point-small rotate: false - xy: 2879, 212 + xy: 2098, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-saltrocks-tiny +block-resupply-point-tiny rotate: false - xy: 3565, 247 + xy: 2579, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-saltrocks-xlarge +block-resupply-point-xlarge rotate: false xy: 681, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salvo-large +block-ripple-large rotate: false - xy: 1783, 287 + xy: 1424, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salvo-medium +block-ripple-medium rotate: false - xy: 1289, 67 + xy: 1017, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salvo-small +block-ripple-small rotate: false - xy: 2905, 238 + xy: 2124, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salvo-tiny +block-ripple-tiny rotate: false - xy: 3583, 265 + xy: 2597, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salvo-xlarge +block-ripple-xlarge rotate: false xy: 731, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-boulder-large +block-rotary-pump-large rotate: false - xy: 1825, 329 + xy: 1466, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-boulder-medium +block-rotary-pump-medium rotate: false - xy: 1323, 101 + xy: 1051, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-boulder-small +block-rotary-pump-small rotate: false - xy: 2853, 160 + xy: 2150, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-boulder-tiny +block-rotary-pump-tiny rotate: false - xy: 3565, 229 + xy: 2615, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-boulder-xlarge +block-rotary-pump-xlarge rotate: false xy: 731, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-large +block-router-large rotate: false - xy: 1741, 203 + xy: 1508, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-medium +block-router-medium rotate: false - xy: 1357, 135 + xy: 1017, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-small +block-router-small rotate: false - xy: 2879, 186 + xy: 2176, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-tiny +block-router-tiny rotate: false - xy: 3583, 247 + xy: 2597, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-large - rotate: false - xy: 1783, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 1289, 33 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 2905, 212 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 3583, 229 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge +block-router-xlarge rotate: false xy: 331, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-xlarge +block-rtg-generator-large + rotate: false + xy: 1550, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rtg-generator-medium + rotate: false + xy: 1051, 109 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rtg-generator-small + rotate: false + xy: 2202, 125 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rtg-generator-tiny + rotate: false + xy: 2615, 43 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rtg-generator-xlarge rotate: false xy: 381, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sandrocks-large +block-salt-large rotate: false - xy: 1825, 287 + xy: 1592, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sandrocks-medium +block-salt-medium rotate: false - xy: 1323, 67 + xy: 1085, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sandrocks-small +block-salt-small rotate: false - xy: 2931, 238 + xy: 2228, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sandrocks-tiny +block-salt-tiny rotate: false - xy: 3511, 211 + xy: 2615, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sandrocks-xlarge +block-salt-wall-large + rotate: false + xy: 1634, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-wall-medium + rotate: false + xy: 1017, 41 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-wall-small + rotate: false + xy: 2254, 125 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-wall-tiny + rotate: false + xy: 2633, 64 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-wall-xlarge rotate: false xy: 431, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scatter-large - rotate: false - xy: 1867, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 1357, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 2879, 160 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 3529, 211 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge +block-salt-xlarge rotate: false xy: 481, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scorch-large +block-salvo-large rotate: false - xy: 1783, 203 + xy: 1676, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scorch-medium +block-salvo-medium rotate: false - xy: 1391, 135 + xy: 1051, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scorch-small +block-salvo-small rotate: false - xy: 2905, 186 + xy: 2280, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scorch-tiny +block-salvo-tiny rotate: false - xy: 3547, 211 + xy: 2633, 46 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scorch-xlarge +block-salvo-xlarge rotate: false xy: 531, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-large +block-sand-boulder-large rotate: false - xy: 1825, 245 + xy: 1718, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-medium +block-sand-boulder-medium rotate: false - xy: 1323, 33 + xy: 1085, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-small +block-sand-boulder-small rotate: false - xy: 2931, 212 + xy: 2306, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-tiny +block-sand-boulder-tiny rotate: false - xy: 3565, 211 + xy: 2633, 28 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-xlarge +block-sand-boulder-xlarge rotate: false xy: 581, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-huge-large +block-sand-large rotate: false - xy: 1867, 287 + xy: 1760, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-huge-medium +block-sand-medium rotate: false - xy: 1357, 67 + xy: 1119, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-huge-small +block-sand-small rotate: false - xy: 2957, 238 + xy: 2332, 124 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-huge-tiny +block-sand-tiny rotate: false - xy: 3583, 211 + xy: 2489, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-huge-xlarge +block-sand-wall-large + rotate: false + xy: 1802, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-wall-medium + rotate: false + xy: 1051, 41 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-small + rotate: false + xy: 1786, 107 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-wall-tiny + rotate: false + xy: 2507, 6 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-wall-xlarge rotate: false xy: 631, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-large +block-sand-water-large rotate: false - xy: 1909, 329 + xy: 1844, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-large-large +block-sand-water-medium rotate: false - xy: 1825, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 1391, 101 + xy: 1085, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-large-small +block-sand-water-small rotate: false - xy: 2905, 160 + xy: 1812, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-large-tiny +block-sand-water-tiny rotate: false - xy: 3601, 301 + xy: 2525, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-large-xlarge +block-sand-water-xlarge rotate: false xy: 681, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-medium - rotate: false - xy: 1425, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 2931, 186 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 3601, 283 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge +block-sand-xlarge rotate: false xy: 731, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-segment-large +block-scatter-large rotate: false - xy: 1867, 245 + xy: 1886, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-segment-medium +block-scatter-medium rotate: false - xy: 1357, 33 + xy: 1119, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-segment-small +block-scatter-small rotate: false - xy: 2957, 212 + xy: 1838, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-segment-tiny +block-scatter-tiny rotate: false - xy: 3601, 265 + xy: 2543, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-segment-xlarge +block-scatter-xlarge rotate: false xy: 781, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-separator-large +block-scorch-large rotate: false - xy: 1909, 287 + xy: 1928, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-separator-medium +block-scorch-medium rotate: false - xy: 1391, 67 + xy: 1153, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-separator-small +block-scorch-small rotate: false - xy: 2983, 238 + xy: 1864, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-separator-tiny +block-scorch-tiny rotate: false - xy: 3601, 247 + xy: 2561, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-separator-xlarge +block-scorch-xlarge rotate: false xy: 781, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-boulder-large +block-scrap-wall-gigantic-large rotate: false - xy: 1951, 329 + xy: 1970, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-boulder-medium +block-scrap-wall-gigantic-medium rotate: false - xy: 1425, 101 + xy: 1085, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-boulder-small +block-scrap-wall-gigantic-small rotate: false - xy: 2931, 160 + xy: 1890, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-boulder-tiny +block-scrap-wall-gigantic-tiny rotate: false - xy: 3601, 229 + xy: 2579, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-boulder-xlarge +block-scrap-wall-gigantic-xlarge rotate: false xy: 781, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-large +block-scrap-wall-huge-large rotate: false - xy: 1867, 203 + xy: 2012, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-medium +block-scrap-wall-huge-medium rotate: false - xy: 1459, 135 + xy: 1119, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-small +block-scrap-wall-huge-small rotate: false - xy: 2957, 186 + xy: 1916, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-tiny +block-scrap-wall-huge-tiny rotate: false - xy: 3601, 211 + xy: 2597, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-xlarge +block-scrap-wall-huge-xlarge rotate: false xy: 831, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shalerocks-large +block-scrap-wall-large rotate: false - xy: 1909, 245 + xy: 2054, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shalerocks-medium +block-scrap-wall-large-large rotate: false - xy: 1391, 33 + xy: 2096, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-medium + rotate: false + xy: 1153, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shalerocks-small +block-scrap-wall-large-small rotate: false - xy: 2983, 212 + xy: 1942, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shalerocks-tiny +block-scrap-wall-large-tiny rotate: false - xy: 2441, 70 + xy: 2615, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shalerocks-xlarge +block-scrap-wall-large-xlarge rotate: false xy: 831, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shock-mine-large +block-scrap-wall-medium rotate: false - xy: 1951, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 1425, 67 + xy: 1187, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shock-mine-small +block-scrap-wall-small rotate: false - xy: 3009, 238 + xy: 1968, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shock-mine-tiny +block-scrap-wall-tiny rotate: false - xy: 2441, 52 + xy: 2633, 10 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shock-mine-xlarge +block-scrap-wall-xlarge rotate: false xy: 831, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shrubs-large +block-segment-large rotate: false - xy: 1993, 329 + xy: 2138, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shrubs-medium +block-segment-medium rotate: false - xy: 1459, 101 + xy: 1119, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shrubs-small +block-segment-small rotate: false - xy: 2957, 160 + xy: 1783, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shrubs-tiny +block-segment-tiny rotate: false - xy: 2441, 34 + xy: 2651, 64 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shrubs-xlarge +block-segment-xlarge rotate: false xy: 859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-crucible-large +block-separator-large rotate: false - xy: 1909, 203 + xy: 2180, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-crucible-medium +block-separator-medium rotate: false - xy: 1493, 135 + xy: 1153, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-crucible-small +block-separator-small rotate: false - xy: 2983, 186 + xy: 1783, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-crucible-tiny +block-separator-tiny rotate: false - xy: 2441, 16 + xy: 2651, 46 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-crucible-xlarge +block-separator-xlarge rotate: false xy: 909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-smelter-large +block-shale-boulder-large rotate: false - xy: 1951, 245 + xy: 2222, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-smelter-medium +block-shale-boulder-medium rotate: false - xy: 1425, 33 + xy: 1187, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-smelter-small +block-shale-boulder-small rotate: false - xy: 3009, 212 + xy: 1809, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-smelter-tiny +block-shale-boulder-tiny rotate: false - xy: 2459, 73 + xy: 2651, 28 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-smelter-xlarge +block-shale-boulder-xlarge rotate: false xy: 959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-slag-large +block-shale-large rotate: false - xy: 1993, 287 + xy: 2264, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-slag-medium +block-shale-medium rotate: false - xy: 1459, 67 + xy: 1221, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-slag-small +block-shale-small rotate: false - xy: 3035, 238 + xy: 1809, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-slag-tiny +block-shale-tiny rotate: false - xy: 2459, 55 + xy: 2651, 10 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-slag-xlarge +block-shale-wall-large + rotate: false + xy: 2306, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-wall-medium + rotate: false + xy: 1153, 41 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-wall-small + rotate: false + xy: 1835, 81 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-wall-tiny + rotate: false + xy: 2645, 201 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-wall-xlarge rotate: false xy: 1009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-large - rotate: false - xy: 2035, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 1493, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 1951, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 1527, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 2983, 160 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 2459, 37 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge +block-shale-xlarge rotate: false xy: 1059, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-small +block-shock-mine-large rotate: false - xy: 3009, 186 + xy: 2348, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shock-mine-medium + rotate: false + xy: 1187, 75 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shock-mine-small + rotate: false + xy: 1835, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-tiny +block-shock-mine-tiny rotate: false - xy: 2477, 73 + xy: 2627, 201 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-xlarge +block-shock-mine-xlarge rotate: false xy: 1109, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snowrock-large +block-shrubs-large rotate: false - xy: 1993, 245 + xy: 2390, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snowrock-medium +block-shrubs-medium rotate: false - xy: 1459, 33 + xy: 1221, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snowrock-small +block-shrubs-small rotate: false - xy: 3035, 212 + xy: 1861, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrock-tiny +block-shrubs-tiny rotate: false - xy: 2459, 19 + xy: 2645, 183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrock-xlarge +block-shrubs-xlarge rotate: false xy: 1159, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snowrocks-large +block-silicon-crucible-large rotate: false - xy: 2035, 287 + xy: 2432, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snowrocks-medium +block-silicon-crucible-medium rotate: false - xy: 1493, 67 + xy: 1255, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snowrocks-small +block-silicon-crucible-small rotate: false - xy: 3061, 238 + xy: 1861, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrocks-tiny +block-silicon-crucible-tiny rotate: false - xy: 2459, 1 + xy: 2645, 165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrocks-xlarge +block-silicon-crucible-xlarge rotate: false xy: 1209, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-large +block-silicon-smelter-large rotate: false - xy: 2077, 329 + xy: 2474, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-solar-panel-large-large +block-silicon-smelter-medium rotate: false - xy: 1993, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 1527, 101 + xy: 1187, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-solar-panel-large-small +block-silicon-smelter-small rotate: false - xy: 3009, 160 + xy: 1887, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-solar-panel-large-tiny +block-silicon-smelter-tiny rotate: false - xy: 2477, 55 + xy: 2663, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-solar-panel-large-xlarge +block-silicon-smelter-xlarge rotate: false xy: 1259, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-medium +block-slag-large rotate: false - xy: 1561, 135 + xy: 2516, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-slag-medium + rotate: false + xy: 1221, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-solar-panel-small +block-slag-small rotate: false - xy: 3035, 186 + xy: 1887, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-solar-panel-tiny +block-slag-tiny rotate: false - xy: 2477, 37 + xy: 2681, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-solar-panel-xlarge +block-slag-xlarge rotate: false xy: 1309, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sorter-large +block-snow-boulder-large rotate: false - xy: 2035, 245 + xy: 2558, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sorter-medium +block-snow-boulder-medium rotate: false - xy: 1493, 33 + xy: 1255, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sorter-small +block-snow-boulder-small rotate: false - xy: 3061, 212 + xy: 1913, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sorter-tiny +block-snow-boulder-tiny rotate: false - xy: 2477, 19 + xy: 2663, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sorter-xlarge +block-snow-boulder-xlarge rotate: false xy: 1359, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spawn-large +block-snow-large rotate: false - xy: 2077, 287 + xy: 2600, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spawn-medium +block-snow-medium rotate: false - xy: 1527, 67 + xy: 1289, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spawn-small +block-snow-pine-large rotate: false - xy: 3087, 238 + xy: 2642, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-pine-medium + rotate: false + xy: 1221, 41 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-small + rotate: false + xy: 1913, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spawn-tiny +block-snow-pine-tiny rotate: false - xy: 2477, 1 + xy: 2699, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spawn-xlarge +block-snow-pine-xlarge rotate: false xy: 1409, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spectre-large +block-snow-small rotate: false - xy: 2119, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 1561, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 3035, 160 + xy: 1939, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spectre-tiny +block-snow-tiny rotate: false - xy: 2495, 58 + xy: 2681, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spectre-xlarge +block-snow-wall-large + rotate: false + xy: 2684, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-wall-medium + rotate: false + xy: 1255, 75 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-small + rotate: false + xy: 1939, 55 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-wall-tiny + rotate: false + xy: 2717, 193 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-wall-xlarge rotate: false xy: 1459, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-cluster-large - rotate: false - xy: 2035, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 1595, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 3061, 186 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 2495, 40 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge +block-snow-xlarge rotate: false xy: 1509, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-moss-large +block-solar-panel-large rotate: false - xy: 2077, 245 + xy: 2726, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-moss-medium +block-solar-panel-large-large rotate: false - xy: 1527, 33 + xy: 2768, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-medium + rotate: false + xy: 1289, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-moss-small +block-solar-panel-large-small rotate: false - xy: 3087, 212 + xy: 1965, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-moss-tiny +block-solar-panel-large-tiny rotate: false - xy: 2513, 58 + xy: 2699, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-moss-xlarge +block-solar-panel-large-xlarge rotate: false xy: 1559, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-pine-large +block-solar-panel-medium rotate: false - xy: 2119, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-pine-medium - rotate: false - xy: 1561, 67 + xy: 1323, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-pine-small +block-solar-panel-small rotate: false - xy: 3113, 238 + xy: 1965, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-pine-tiny +block-solar-panel-tiny rotate: false - xy: 2495, 22 + xy: 2717, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-pine-xlarge +block-solar-panel-xlarge rotate: false xy: 1609, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-press-large +block-sorter-large rotate: false - xy: 2161, 329 + xy: 2810, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-press-medium +block-sorter-medium rotate: false - xy: 1595, 101 + xy: 1255, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-press-small +block-sorter-small rotate: false - xy: 3061, 160 + xy: 1994, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-press-tiny +block-sorter-tiny rotate: false - xy: 2513, 40 + xy: 2663, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-press-xlarge +block-sorter-xlarge rotate: false xy: 1659, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sporerocks-large +block-space-large rotate: false - xy: 2077, 203 + xy: 2852, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sporerocks-medium +block-space-medium rotate: false - xy: 1629, 135 + xy: 1289, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sporerocks-small +block-space-small rotate: false - xy: 3087, 186 + xy: 2020, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sporerocks-tiny +block-space-tiny rotate: false - xy: 2531, 58 + xy: 2681, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sporerocks-xlarge +block-space-xlarge rotate: false xy: 1709, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-stone-large +block-spawn-large rotate: false - xy: 2119, 245 + xy: 2894, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-stone-medium +block-spawn-medium rotate: false - xy: 1561, 33 + xy: 1323, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-stone-small +block-spawn-small rotate: false - xy: 3113, 212 + xy: 2046, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-stone-tiny +block-spawn-tiny rotate: false - xy: 2495, 4 + xy: 2699, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-stone-xlarge +block-spawn-xlarge rotate: false xy: 1759, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-tower-large +block-spectre-large rotate: false - xy: 2161, 287 + xy: 2936, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-tower-medium +block-spectre-medium rotate: false - xy: 1595, 67 + xy: 1357, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-tower-small +block-spectre-small rotate: false - xy: 3139, 238 + xy: 2072, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-tower-tiny +block-spectre-tiny rotate: false - xy: 2513, 22 + xy: 2717, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-tower-xlarge +block-spectre-xlarge rotate: false xy: 1809, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-large +block-spore-cluster-large rotate: false - xy: 2203, 329 + xy: 2978, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-large +block-spore-cluster-medium rotate: false - xy: 2119, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 1629, 101 + xy: 1289, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-large-small +block-spore-cluster-small rotate: false - xy: 3087, 160 + xy: 2098, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-large-tiny +block-spore-cluster-tiny rotate: false - xy: 2531, 40 + xy: 2735, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-large-xlarge +block-spore-cluster-xlarge rotate: false xy: 1859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-medium +block-spore-moss-large rotate: false - xy: 1663, 135 + xy: 3020, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-medium + rotate: false + xy: 1323, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-small +block-spore-moss-small rotate: false - xy: 3113, 186 + xy: 2124, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-tiny +block-spore-moss-tiny rotate: false - xy: 2513, 4 + xy: 2753, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-xlarge +block-spore-moss-xlarge rotate: false xy: 1909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-swarmer-large +block-spore-pine-large rotate: false - xy: 2161, 245 + xy: 3062, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-swarmer-medium +block-spore-pine-medium rotate: false - xy: 1595, 33 + xy: 1357, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-swarmer-small +block-spore-pine-small rotate: false - xy: 3139, 212 + xy: 2150, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-swarmer-tiny +block-spore-pine-tiny rotate: false - xy: 2531, 22 + xy: 2771, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-swarmer-xlarge +block-spore-pine-xlarge rotate: false xy: 1959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-switch-large +block-spore-press-large rotate: false - xy: 2203, 287 + xy: 3104, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-switch-medium +block-spore-press-medium rotate: false - xy: 1629, 67 + xy: 1391, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-switch-small +block-spore-press-small rotate: false - xy: 3113, 160 + xy: 2176, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-switch-tiny +block-spore-press-tiny rotate: false - xy: 2531, 4 + xy: 2789, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-switch-xlarge +block-spore-press-xlarge rotate: false xy: 2009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tainted-water-large +block-spore-wall-large rotate: false - xy: 2245, 329 + xy: 3146, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tainted-water-medium +block-spore-wall-medium rotate: false - xy: 1663, 101 + xy: 1323, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tainted-water-small +block-spore-wall-small rotate: false - xy: 3139, 186 + xy: 2202, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tainted-water-tiny +block-spore-wall-tiny rotate: false - xy: 2549, 37 + xy: 2807, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tainted-water-xlarge +block-spore-wall-xlarge rotate: false xy: 2059, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tar-large +block-steam-generator-large rotate: false - xy: 2161, 203 + xy: 3188, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tar-medium +block-steam-generator-medium rotate: false - xy: 1697, 135 + xy: 1357, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tar-small +block-steam-generator-small rotate: false - xy: 3139, 160 + xy: 2228, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tar-tiny +block-steam-generator-tiny rotate: false - xy: 2549, 19 + xy: 2825, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tar-xlarge +block-steam-generator-xlarge rotate: false xy: 2109, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tendrils-large +block-stone-large rotate: false - xy: 2203, 245 + xy: 3230, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tendrils-medium +block-stone-medium rotate: false - xy: 1629, 33 + xy: 1391, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tendrils-small +block-stone-small rotate: false - xy: 2827, 134 + xy: 2254, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tendrils-tiny +block-stone-tiny rotate: false - xy: 2549, 1 + xy: 2843, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tendrils-xlarge +block-stone-wall-large + rotate: false + xy: 3272, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-wall-medium + rotate: false + xy: 1425, 143 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-small + rotate: false + xy: 2280, 99 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-wall-tiny + rotate: false + xy: 2861, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-wall-xlarge rotate: false xy: 2159, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tetrative-reconstructor-large - rotate: false - xy: 2245, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-medium - rotate: false - xy: 1663, 67 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-small - rotate: false - xy: 2853, 134 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-tiny - rotate: false - xy: 2567, 37 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-xlarge +block-stone-xlarge rotate: false xy: 2209, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-generator-large +block-surge-tower-large rotate: false - xy: 2287, 329 + xy: 3314, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-generator-medium +block-surge-tower-medium rotate: false - xy: 1697, 101 + xy: 1357, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-generator-small +block-surge-tower-small rotate: false - xy: 2879, 134 + xy: 2306, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-generator-tiny +block-surge-tower-tiny rotate: false - xy: 2567, 19 + xy: 2879, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-generator-xlarge +block-surge-tower-xlarge rotate: false xy: 2259, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-pump-large +block-surge-wall-large rotate: false - xy: 2203, 203 + xy: 3356, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-pump-medium +block-surge-wall-large-large rotate: false - xy: 1731, 135 + xy: 3398, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 1391, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-pump-small +block-surge-wall-large-small rotate: false - xy: 2905, 134 + xy: 2332, 98 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-pump-tiny +block-surge-wall-large-tiny rotate: false - xy: 2567, 1 + xy: 2897, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-pump-xlarge +block-surge-wall-large-xlarge rotate: false xy: 2309, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-reactor-large +block-surge-wall-medium rotate: false - xy: 2245, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-reactor-medium - rotate: false - xy: 1663, 33 + xy: 1425, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-reactor-small +block-surge-wall-small rotate: false - xy: 2931, 134 + xy: 1991, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-reactor-tiny +block-surge-wall-tiny rotate: false - xy: 2585, 17 + xy: 2915, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-reactor-xlarge +block-surge-wall-xlarge rotate: false xy: 2359, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-large +block-swarmer-large rotate: false - xy: 2287, 287 + xy: 3440, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-large +block-swarmer-medium rotate: false - xy: 2329, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1697, 67 + xy: 1459, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-large-small +block-swarmer-small rotate: false - xy: 2957, 134 + xy: 2017, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-large-tiny +block-swarmer-tiny rotate: false - xy: 2603, 16 + xy: 2933, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-large-xlarge +block-swarmer-xlarge rotate: false xy: 2409, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-medium +block-switch-large rotate: false - xy: 1731, 101 + xy: 3482, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-switch-medium + rotate: false + xy: 1391, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-small +block-switch-small rotate: false - xy: 2983, 134 + xy: 2043, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-tiny +block-switch-tiny rotate: false - xy: 2621, 16 + xy: 2951, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-xlarge +block-switch-xlarge rotate: false xy: 2459, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thruster-large +block-tainted-water-large rotate: false - xy: 2245, 203 + xy: 3524, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thruster-medium +block-tainted-water-medium rotate: false - xy: 1765, 135 + xy: 1425, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thruster-small +block-tainted-water-small rotate: false - xy: 3009, 134 + xy: 2069, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thruster-tiny +block-tainted-water-tiny rotate: false - xy: 2639, 16 + xy: 2969, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thruster-xlarge +block-tainted-water-xlarge rotate: false xy: 2509, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-conveyor-large +block-tar-large rotate: false - xy: 2287, 245 + xy: 3566, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-conveyor-medium +block-tar-medium rotate: false - xy: 1697, 33 + xy: 1459, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-conveyor-small +block-tar-small rotate: false - xy: 3035, 134 + xy: 2095, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-conveyor-tiny +block-tar-tiny rotate: false - xy: 3317, 225 + xy: 2987, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-conveyor-xlarge +block-tar-xlarge rotate: false xy: 2559, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-large +block-tendrils-large rotate: false - xy: 2329, 287 + xy: 3608, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-wall-large-large +block-tendrils-medium rotate: false - xy: 2371, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1731, 67 + xy: 1493, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-large-small +block-tendrils-small rotate: false - xy: 3061, 134 + xy: 2121, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-large-tiny +block-tendrils-tiny rotate: false - xy: 3317, 207 + xy: 3005, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-large-xlarge +block-tendrils-xlarge rotate: false xy: 2609, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-medium +block-tetrative-reconstructor-large rotate: false - xy: 1765, 101 + xy: 3650, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-medium + rotate: false + xy: 1425, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-small +block-tetrative-reconstructor-small rotate: false - xy: 3087, 134 + xy: 2147, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-tiny +block-tetrative-reconstructor-tiny rotate: false - xy: 3335, 225 + xy: 3023, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-xlarge +block-tetrative-reconstructor-xlarge rotate: false xy: 2659, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-turbine-generator-large +block-thermal-generator-large rotate: false - xy: 2287, 203 + xy: 3692, 293 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-turbine-generator-medium +block-thermal-generator-medium rotate: false - xy: 1799, 135 + xy: 1459, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-turbine-generator-small +block-thermal-generator-small rotate: false - xy: 3113, 134 + xy: 2173, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-turbine-generator-tiny +block-thermal-generator-tiny rotate: false - xy: 3317, 189 + xy: 3041, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-turbine-generator-xlarge +block-thermal-generator-xlarge rotate: false xy: 2709, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-underflow-gate-large +block-thermal-pump-large rotate: false - xy: 2329, 245 + xy: 3734, 323 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-underflow-gate-medium +block-thermal-pump-medium rotate: false - xy: 1731, 33 + xy: 1493, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-underflow-gate-small +block-thermal-pump-small rotate: false - xy: 3139, 134 + xy: 2199, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-underflow-gate-tiny +block-thermal-pump-tiny rotate: false - xy: 3335, 207 + xy: 3059, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-underflow-gate-xlarge +block-thermal-pump-xlarge rotate: false xy: 2759, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-unloader-large +block-thorium-reactor-large rotate: false - xy: 2371, 287 + xy: 3734, 281 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-unloader-medium +block-thorium-reactor-medium rotate: false - xy: 1765, 67 + xy: 1527, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-unloader-small +block-thorium-reactor-small rotate: false - xy: 3165, 238 + xy: 2225, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-unloader-tiny +block-thorium-reactor-tiny rotate: false - xy: 3317, 171 + xy: 3077, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-unloader-xlarge +block-thorium-reactor-xlarge rotate: false xy: 2809, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-vault-large +block-thorium-wall-large rotate: false - xy: 2413, 329 + xy: 3692, 251 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-vault-medium +block-thorium-wall-large-large rotate: false - xy: 1799, 101 + xy: 3734, 239 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 1459, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-vault-small +block-thorium-wall-large-small rotate: false - xy: 3165, 212 + xy: 2251, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-vault-tiny +block-thorium-wall-large-tiny rotate: false - xy: 3335, 189 + xy: 3095, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-vault-xlarge +block-thorium-wall-large-xlarge rotate: false xy: 2859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-extractor-large +block-thorium-wall-medium rotate: false - xy: 2329, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-extractor-medium - rotate: false - xy: 1833, 135 + xy: 1493, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-extractor-small +block-thorium-wall-small rotate: false - xy: 3165, 186 + xy: 2277, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-extractor-tiny +block-thorium-wall-tiny rotate: false - xy: 3317, 153 + xy: 3113, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-extractor-xlarge +block-thorium-wall-xlarge rotate: false xy: 2909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-large +block-thruster-large rotate: false - xy: 2371, 245 + xy: 1001, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-medium +block-thruster-medium rotate: false - xy: 1765, 33 + xy: 1527, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-small +block-thruster-small rotate: false - xy: 3165, 160 + xy: 2303, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-tiny +block-thruster-tiny rotate: false - xy: 3335, 171 + xy: 3131, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-xlarge +block-thruster-xlarge rotate: false xy: 2959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wave-large +block-titanium-conveyor-large rotate: false - xy: 2413, 287 + xy: 1043, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-wave-medium +block-titanium-conveyor-medium rotate: false - xy: 1799, 67 + xy: 1561, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-wave-small +block-titanium-conveyor-small rotate: false - xy: 3165, 134 + xy: 2329, 72 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-wave-tiny +block-titanium-conveyor-tiny rotate: false - xy: 3317, 135 + xy: 3149, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-wave-xlarge +block-titanium-conveyor-xlarge rotate: false xy: 3009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-dead-large +block-titanium-wall-large rotate: false - xy: 2455, 329 + xy: 1085, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-dead-medium +block-titanium-wall-large-large rotate: false - xy: 1833, 101 + xy: 1127, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 1493, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-dead-small +block-titanium-wall-large-small rotate: false - xy: 3229, 265 + xy: 1991, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-dead-tiny +block-titanium-wall-large-tiny rotate: false - xy: 3335, 153 + xy: 3167, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-dead-xlarge +block-titanium-wall-large-xlarge rotate: false xy: 3059, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-large +block-titanium-wall-medium rotate: false - xy: 2371, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-medium - rotate: false - xy: 1867, 135 + xy: 1527, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-small +block-titanium-wall-small rotate: false - xy: 3255, 285 + xy: 2017, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-tiny +block-titanium-wall-tiny rotate: false - xy: 3317, 117 + xy: 3185, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-xlarge +block-titanium-wall-xlarge rotate: false xy: 3109, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +block-tsunami-large + rotate: false + xy: 1169, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tsunami-medium + rotate: false + xy: 1561, 109 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tsunami-small + rotate: false + xy: 2043, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tsunami-tiny + rotate: false + xy: 3203, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tsunami-xlarge + rotate: false + xy: 3159, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-underflow-gate-large + rotate: false + xy: 1211, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-underflow-gate-medium + rotate: false + xy: 1527, 41 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-underflow-gate-small + rotate: false + xy: 2069, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-underflow-gate-tiny + rotate: false + xy: 3221, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-underflow-gate-xlarge + rotate: false + xy: 3209, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-unloader-large + rotate: false + xy: 1253, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-unloader-medium + rotate: false + xy: 1561, 75 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-unloader-small + rotate: false + xy: 2095, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-unloader-tiny + rotate: false + xy: 3239, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-unloader-xlarge + rotate: false + xy: 3259, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-vault-large + rotate: false + xy: 1295, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-vault-medium + rotate: false + xy: 1561, 41 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-small + rotate: false + xy: 2121, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-vault-tiny + rotate: false + xy: 3257, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-vault-xlarge + rotate: false + xy: 3309, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-extractor-large + rotate: false + xy: 1337, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-extractor-medium + rotate: false + xy: 1017, 7 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-small + rotate: false + xy: 2147, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-extractor-tiny + rotate: false + xy: 3275, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-extractor-xlarge + rotate: false + xy: 3359, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-large + rotate: false + xy: 1379, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-medium + rotate: false + xy: 1051, 7 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-small + rotate: false + xy: 2173, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-tiny + rotate: false + xy: 3293, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-xlarge + rotate: false + xy: 3409, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wave-large + rotate: false + xy: 1421, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wave-medium + rotate: false + xy: 1085, 7 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wave-small + rotate: false + xy: 2199, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wave-tiny + rotate: false + xy: 3311, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wave-xlarge + rotate: false + xy: 3459, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-dead-large + rotate: false + xy: 1463, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-dead-medium + rotate: false + xy: 1119, 7 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-dead-small + rotate: false + xy: 2225, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-dead-tiny + rotate: false + xy: 3329, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-dead-xlarge + rotate: false + xy: 3509, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-large + rotate: false + xy: 1505, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-medium + rotate: false + xy: 1153, 7 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-small + rotate: false + xy: 2251, 47 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-tiny + rotate: false + xy: 3347, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-xlarge + rotate: false + xy: 3559, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 button rotate: false - xy: 3133, 342 + xy: 2989, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17838,7 +21163,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 2749, 309 + xy: 4059, 368 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17846,7 +21171,15 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 2791, 342 + xy: 4059, 339 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-disabled + rotate: false + xy: 4059, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17854,7 +21187,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 2707, 238 + xy: 4059, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17862,7 +21195,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 2749, 280 + xy: 4059, 281 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17870,7 +21203,7 @@ button-over index: -1 button-red rotate: false - xy: 2829, 342 + xy: 4059, 252 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17878,7 +21211,7 @@ button-red index: -1 button-right rotate: false - xy: 2943, 342 + xy: 2799, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17886,7 +21219,7 @@ button-right index: -1 button-right-down rotate: false - xy: 2867, 342 + xy: 2723, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17894,7 +21227,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 2905, 342 + xy: 2761, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17902,7 +21235,7 @@ button-right-over index: -1 button-select rotate: false - xy: 3281, 285 + xy: 2277, 47 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -17910,7 +21243,7 @@ button-select index: -1 button-square rotate: false - xy: 3057, 342 + xy: 2913, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17918,7 +21251,7 @@ button-square index: -1 button-square-down rotate: false - xy: 2981, 342 + xy: 2837, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17926,7 +21259,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 3019, 342 + xy: 2875, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17934,7 +21267,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 3095, 342 + xy: 2951, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17942,42 +21275,42 @@ button-trans index: -1 check-disabled rotate: false - xy: 1799, 33 + xy: 1187, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1833, 67 + xy: 1221, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1867, 101 + xy: 1255, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1901, 135 + xy: 1289, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1833, 33 + xy: 1323, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1867, 67 + xy: 1357, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -17991,14 +21324,14 @@ clear index: -1 crater rotate: false - xy: 3239, 393 + xy: 1789, 1 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 cursor rotate: false - xy: 2340, 129 + xy: 2003, 247 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -18012,7 +21345,7 @@ discord-banner index: -1 flat-down-base rotate: false - xy: 3171, 342 + xy: 3027, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18027,7 +21360,7 @@ info-banner index: -1 inventory rotate: false - xy: 3307, 269 + xy: 3835, 271 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -18035,147 +21368,147 @@ inventory index: -1 item-blast-compound-icon rotate: false - xy: 1901, 101 + xy: 1391, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-icon rotate: false - xy: 1935, 135 + xy: 1425, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-icon rotate: false - xy: 1867, 33 + xy: 1459, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-icon rotate: false - xy: 1901, 67 + xy: 1493, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-icon rotate: false - xy: 1935, 101 + xy: 1527, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-icon rotate: false - xy: 1969, 135 + xy: 1561, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-icon rotate: false - xy: 1901, 33 + xy: 1595, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-icon rotate: false - xy: 1935, 67 + xy: 1595, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-icon rotate: false - xy: 1969, 101 + xy: 1595, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-icon rotate: false - xy: 2003, 135 + xy: 1595, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-icon rotate: false - xy: 1935, 33 + xy: 1595, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-icon rotate: false - xy: 1969, 67 + xy: 1615, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-icon rotate: false - xy: 2003, 101 + xy: 1629, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-icon rotate: false - xy: 2037, 135 + xy: 1629, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-icon rotate: false - xy: 1969, 33 + xy: 1629, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-icon rotate: false - xy: 2003, 67 + xy: 1629, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-icon rotate: false - xy: 2037, 101 + xy: 1629, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-icon rotate: false - xy: 2071, 135 + xy: 1649, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-icon rotate: false - xy: 2003, 33 + xy: 1663, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-icon rotate: false - xy: 2037, 67 + xy: 1663, 111 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-node rotate: false - xy: 2071, 101 + xy: 1663, 77 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18196,7 +21529,7 @@ nomap index: -1 pane rotate: false - xy: 2619, 216 + xy: 3103, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18204,7 +21537,7 @@ pane index: -1 pane-2 rotate: false - xy: 2581, 216 + xy: 3065, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18212,7 +21545,7 @@ pane-2 index: -1 scroll rotate: false - xy: 3359, 276 + xy: 2303, 36 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -18220,7 +21553,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 1129, 177 + xy: 3407, 261 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -18228,56 +21561,56 @@ scroll-horizontal index: -1 scroll-knob-horizontal-black rotate: false - xy: 859, 177 + xy: 859, 172 size: 40, 24 orig: 40, 24 offset: 0, 0 index: -1 scroll-knob-vertical-black rotate: false - xy: 3333, 269 + xy: 3861, 271 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 4083, 355 + xy: 3995, 271 size: 12, 40 orig: 12, 40 offset: 0, 0 index: -1 selection rotate: false - xy: 2311, 22 + xy: 1001, 310 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 2386, 15 + xy: 3689, 277 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 2275, 74 + xy: 3489, 197 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 3277, 337 + xy: 3520, 197 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 2309, 129 + xy: 3489, 157 size: 29, 38 orig: 29, 38 offset: 0, 0 @@ -18291,7 +21624,7 @@ slider-vertical index: -1 underline rotate: false - xy: 1053, 174 + xy: 3293, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18299,7 +21632,7 @@ underline index: -1 underline-2 rotate: false - xy: 901, 174 + xy: 3141, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18307,7 +21640,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 939, 174 + xy: 3179, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18315,7 +21648,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 977, 174 + xy: 3217, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18323,7 +21656,7 @@ underline-red index: -1 underline-white rotate: false - xy: 1015, 174 + xy: 3255, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18331,35 +21664,35 @@ underline-white index: -1 unit-alpha-large rotate: false - xy: 2413, 245 + xy: 1547, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-alpha-medium rotate: false - xy: 2105, 135 + xy: 1663, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-alpha-small rotate: false - xy: 3255, 259 + xy: 2329, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-alpha-tiny rotate: false - xy: 3335, 135 + xy: 3365, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-alpha-xlarge rotate: false - xy: 3159, 413 + xy: 3609, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -18373,646 +21706,751 @@ unit-antumbra-large index: -1 unit-antumbra-medium rotate: false - xy: 2340, 135 + xy: 3776, 271 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 unit-antumbra-small rotate: false - xy: 2633, 190 + xy: 257, 20 size: 21, 24 orig: 21, 24 offset: 0, 0 index: -1 unit-antumbra-tiny rotate: false - xy: 2412, 113 + xy: 2623, 219 size: 14, 16 orig: 14, 16 offset: 0, 0 index: -1 unit-antumbra-xlarge rotate: false - xy: 3459, 363 + xy: 959, 363 size: 43, 48 orig: 43, 48 offset: 0, 0 index: -1 unit-arkyid-large rotate: false - xy: 2455, 287 + xy: 1589, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-arkyid-medium rotate: false - xy: 2037, 33 + xy: 1663, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-arkyid-small rotate: false - xy: 3281, 259 + xy: 2358, 110 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-arkyid-tiny rotate: false - xy: 3335, 117 + xy: 3383, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-arkyid-xlarge rotate: false - xy: 3209, 413 + xy: 3659, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-atrax-large rotate: false - xy: 2497, 340 + xy: 1631, 256 size: 40, 29 orig: 40, 29 offset: 0, 0 index: -1 unit-atrax-medium rotate: false - xy: 1153, 8 + xy: 1683, 186 size: 32, 23 orig: 32, 23 offset: 0, 0 index: -1 unit-atrax-small rotate: false - xy: 3307, 250 + xy: 1731, 25 size: 24, 17 orig: 24, 17 offset: 0, 0 index: -1 unit-atrax-tiny rotate: false - xy: 2441, 3 + xy: 2723, 245 size: 16, 11 orig: 16, 11 offset: 0, 0 index: -1 unit-atrax-xlarge rotate: false - xy: 3259, 427 + xy: 3709, 427 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 unit-beta-large rotate: false - xy: 2413, 203 - size: 40, 40 - orig: 40, 40 + xy: 1673, 247 + size: 40, 38 + orig: 40, 38 offset: 0, 0 index: -1 unit-beta-medium rotate: false - xy: 2071, 67 - size: 32, 32 - orig: 32, 32 + xy: 3776, 239 + size: 32, 30 + orig: 32, 30 offset: 0, 0 index: -1 unit-beta-small rotate: false - xy: 3333, 243 - size: 24, 24 - orig: 24, 24 + xy: 2358, 85 + size: 24, 23 + orig: 24, 23 offset: 0, 0 index: -1 unit-beta-tiny rotate: false - xy: 3353, 206 - size: 16, 16 - orig: 16, 16 + xy: 881, 155 + size: 16, 15 + orig: 16, 15 offset: 0, 0 index: -1 unit-beta-xlarge rotate: false - xy: 3309, 413 - size: 48, 48 - orig: 48, 48 + xy: 3759, 415 + size: 48, 46 + orig: 48, 46 offset: 0, 0 index: -1 unit-bryde-large rotate: false - xy: 2455, 245 + xy: 1715, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-bryde-medium rotate: false - xy: 2105, 101 + xy: 3791, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-bryde-small rotate: false - xy: 3359, 250 + xy: 2355, 59 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-bryde-tiny rotate: false - xy: 3353, 188 + xy: 3401, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-bryde-xlarge rotate: false - xy: 3359, 413 + xy: 3809, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-corvus-large + rotate: false + xy: 1757, 259 + size: 40, 26 + orig: 40, 26 + offset: 0, 0 + index: -1 +unit-corvus-medium + rotate: false + xy: 1697, 1 + size: 31, 20 + orig: 31, 20 + offset: 0, 0 + index: -1 +unit-corvus-small + rotate: false + xy: 3859, 313 + size: 24, 15 + orig: 24, 15 + offset: 0, 0 + index: -1 +unit-corvus-tiny + rotate: false + xy: 771, 404 + size: 15, 10 + orig: 15, 10 + offset: 0, 0 + index: -1 +unit-corvus-xlarge + rotate: false + xy: 3859, 430 + size: 48, 31 + orig: 48, 31 + offset: 0, 0 + index: -1 unit-crawler-large rotate: false - xy: 2497, 298 + xy: 1799, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-crawler-medium rotate: false - xy: 2139, 135 + xy: 3825, 329 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-crawler-small rotate: false - xy: 3359, 224 + xy: 2355, 33 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-crawler-tiny rotate: false - xy: 3353, 170 + xy: 2735, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-crawler-xlarge rotate: false - xy: 3409, 413 + xy: 3909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-large rotate: false - xy: 2539, 329 + xy: 1841, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-dagger-medium rotate: false - xy: 2071, 33 + xy: 1697, 152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-dagger-small rotate: false - xy: 2561, 154 + xy: 2329, 20 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-dagger-tiny rotate: false - xy: 3353, 152 + xy: 2753, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-dagger-xlarge rotate: false - xy: 3459, 413 + xy: 3959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eclipse-large rotate: false - xy: 2455, 203 + xy: 1883, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-eclipse-medium rotate: false - xy: 2105, 67 + xy: 1697, 118 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-eclipse-small rotate: false - xy: 2561, 128 + xy: 2355, 7 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-eclipse-tiny rotate: false - xy: 3353, 134 + xy: 2771, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-eclipse-xlarge rotate: false - xy: 3509, 413 + xy: 4009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-flare-large rotate: false - xy: 2497, 256 + xy: 1925, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-flare-medium rotate: false - xy: 2139, 101 + xy: 1697, 84 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-flare-small rotate: false - xy: 2561, 102 + xy: 2384, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-flare-tiny rotate: false - xy: 3353, 116 + xy: 2789, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-flare-xlarge rotate: false - xy: 3559, 413 + xy: 3859, 380 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-fortress-large rotate: false - xy: 2539, 295 + xy: 1967, 253 size: 40, 32 orig: 40, 32 offset: 0, 0 index: -1 unit-fortress-medium rotate: false - xy: 2173, 142 + xy: 1697, 57 size: 32, 25 orig: 32, 25 offset: 0, 0 index: -1 unit-fortress-small rotate: false - xy: 2561, 81 + xy: 1757, 23 size: 24, 19 orig: 24, 19 offset: 0, 0 index: -1 unit-fortress-tiny rotate: false - xy: 2585, 3 + xy: 2476, 125 size: 16, 12 orig: 16, 12 offset: 0, 0 index: -1 unit-fortress-xlarge rotate: false - xy: 3609, 423 + xy: 3909, 373 size: 48, 38 orig: 48, 38 offset: 0, 0 index: -1 unit-gamma-large rotate: false - xy: 2581, 329 + xy: 2009, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-gamma-medium rotate: false - xy: 2105, 33 + xy: 1697, 23 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-gamma-small rotate: false - xy: 2587, 156 + xy: 1783, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-gamma-tiny rotate: false - xy: 3317, 99 + xy: 2807, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-gamma-xlarge rotate: false - xy: 3659, 413 + xy: 3959, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-horizon-large rotate: false - xy: 2497, 214 + xy: 2051, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-horizon-medium rotate: false - xy: 2139, 67 + xy: 3586, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-horizon-small rotate: false - xy: 2587, 130 + xy: 2410, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-horizon-tiny rotate: false - xy: 3335, 99 + xy: 2825, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-horizon-xlarge rotate: false - xy: 3709, 413 + xy: 4009, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mace-large rotate: false - xy: 2539, 253 + xy: 2093, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mace-medium rotate: false - xy: 2173, 108 + xy: 3620, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mace-small rotate: false - xy: 2587, 104 + xy: 1809, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mace-tiny rotate: false - xy: 3353, 98 + xy: 2843, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mace-xlarge rotate: false - xy: 3759, 413 + xy: 3709, 377 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mega-large rotate: false - xy: 2581, 287 + xy: 2135, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mega-medium rotate: false - xy: 2207, 135 + xy: 3654, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mega-small rotate: false - xy: 2587, 78 + xy: 2436, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mega-tiny rotate: false - xy: 3371, 203 + xy: 2861, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mega-xlarge rotate: false - xy: 3809, 413 + xy: 3759, 365 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-minke-large rotate: false - xy: 2623, 329 - size: 40, 40 - orig: 40, 40 + xy: 3481, 245 + size: 34, 40 + orig: 34, 40 offset: 0, 0 index: -1 unit-minke-medium rotate: false - xy: 2139, 33 - size: 32, 32 - orig: 32, 32 + xy: 3806, 271 + size: 27, 32 + orig: 27, 32 offset: 0, 0 index: -1 unit-minke-small rotate: false - xy: 2613, 156 - size: 24, 24 - orig: 24, 24 + xy: 309, 178 + size: 20, 24 + orig: 20, 24 offset: 0, 0 index: -1 unit-minke-tiny rotate: false - xy: 3371, 185 - size: 16, 16 - orig: 16, 16 + xy: 4044, 253 + size: 13, 16 + orig: 13, 16 offset: 0, 0 index: -1 unit-minke-xlarge rotate: false - xy: 3859, 413 - size: 48, 48 - orig: 48, 48 + xy: 859, 198 + size: 41, 48 + orig: 41, 48 offset: 0, 0 index: -1 unit-mono-large rotate: false - xy: 2623, 287 + xy: 2177, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mono-medium rotate: false - xy: 2173, 74 + xy: 3688, 183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mono-small rotate: false - xy: 2613, 130 + xy: 1835, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mono-tiny rotate: false - xy: 3389, 203 + xy: 2879, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mono-xlarge rotate: false - xy: 3909, 413 + xy: 3809, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-nova-large rotate: false - xy: 2665, 329 + xy: 2219, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-nova-medium rotate: false - xy: 2207, 101 + xy: 3722, 171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-nova-small rotate: false - xy: 2613, 104 + xy: 1861, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-nova-tiny rotate: false - xy: 3371, 167 + xy: 2897, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-nova-xlarge rotate: false - xy: 3959, 413 + xy: 3859, 330 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-oct-large + rotate: false + xy: 2261, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-oct-medium + rotate: false + xy: 3756, 171 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-oct-small + rotate: false + xy: 1887, 29 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-oct-tiny + rotate: false + xy: 2915, 154 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-oct-xlarge + rotate: false + xy: 3909, 323 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-omura-large + rotate: false + xy: 3520, 155 + size: 28, 40 + orig: 28, 40 + offset: 0, 0 + index: -1 +unit-omura-medium + rotate: false + xy: 1733, 211 + size: 22, 32 + orig: 22, 32 + offset: 0, 0 + index: -1 +unit-omura-small + rotate: false + xy: 2933, 146 + size: 16, 24 + orig: 16, 24 + offset: 0, 0 + index: -1 +unit-omura-tiny + rotate: false + xy: 4084, 156 + size: 11, 16 + orig: 11, 16 + offset: 0, 0 + index: -1 +unit-omura-xlarge + rotate: false + xy: 3517, 237 + size: 33, 48 + orig: 33, 48 + offset: 0, 0 + index: -1 unit-poly-large rotate: false - xy: 2665, 287 + xy: 2303, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-poly-medium rotate: false - xy: 2241, 135 + xy: 3790, 171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-poly-small rotate: false - xy: 2613, 78 + xy: 1913, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-poly-tiny rotate: false - xy: 3389, 185 + xy: 2951, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-poly-xlarge rotate: false - xy: 4009, 413 + xy: 3959, 313 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-pulsar-large rotate: false - xy: 2539, 218 - size: 40, 33 - orig: 40, 33 + xy: 2345, 251 + size: 40, 34 + orig: 40, 34 offset: 0, 0 index: -1 unit-pulsar-medium rotate: false - xy: 2173, 46 - size: 32, 26 - orig: 32, 26 + xy: 2345, 222 + size: 32, 27 + orig: 32, 27 offset: 0, 0 index: -1 unit-pulsar-small rotate: false - xy: 2182, 1 - size: 24, 19 - orig: 24, 19 + xy: 1763, 1 + size: 24, 20 + orig: 24, 20 offset: 0, 0 index: -1 unit-pulsar-tiny @@ -19024,133 +22462,168 @@ unit-pulsar-tiny index: -1 unit-pulsar-xlarge rotate: false - xy: 131, 5 - size: 48, 39 - orig: 48, 39 + xy: 4009, 321 + size: 48, 40 + orig: 48, 40 + offset: 0, 0 + index: -1 +unit-quad-large + rotate: false + xy: 2387, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-quad-medium + rotate: false + xy: 3776, 332 + size: 31, 31 + orig: 31, 31 + offset: 0, 0 + index: -1 +unit-quad-small + rotate: false + xy: 1939, 29 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-quad-tiny + rotate: false + xy: 3692, 396 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +unit-quad-xlarge + rotate: false + xy: 4009, 271 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 unit-quasar-large rotate: false - xy: 2581, 245 + xy: 2429, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-quasar-medium rotate: false - xy: 2207, 67 + xy: 2343, 188 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-quasar-small rotate: false - xy: 2561, 55 + xy: 1965, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-quasar-tiny rotate: false - xy: 3407, 203 + xy: 2969, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-quasar-xlarge rotate: false - xy: 3259, 377 + xy: 859, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-reign-large rotate: false - xy: 2707, 343 + xy: 1757, 231 size: 40, 26 orig: 40, 26 offset: 0, 0 index: -1 unit-reign-medium rotate: false - xy: 1187, 11 + xy: 1730, 1 size: 31, 20 orig: 31, 20 offset: 0, 0 index: -1 unit-reign-small rotate: false - xy: 2587, 61 + xy: 1991, 30 size: 24, 15 orig: 24, 15 offset: 0, 0 index: -1 unit-reign-tiny rotate: false - xy: 771, 404 + xy: 3734, 365 size: 15, 10 orig: 15, 10 offset: 0, 0 index: -1 unit-reign-xlarge rotate: false - xy: 181, 13 + xy: 859, 330 size: 48, 31 orig: 48, 31 offset: 0, 0 index: -1 unit-risso-large rotate: false - xy: 2623, 245 - size: 40, 40 - orig: 40, 40 + xy: 3444, 245 + size: 35, 40 + orig: 35, 40 offset: 0, 0 index: -1 unit-risso-medium rotate: false - xy: 2241, 101 - size: 32, 32 - orig: 32, 32 + xy: 3551, 177 + size: 28, 32 + orig: 28, 32 offset: 0, 0 index: -1 unit-risso-small rotate: false - xy: 2613, 52 - size: 24, 24 - orig: 24, 24 + xy: 2447, 219 + size: 21, 24 + orig: 21, 24 offset: 0, 0 index: -1 unit-risso-tiny rotate: false - xy: 3371, 149 - size: 16, 16 - orig: 16, 16 + xy: 2539, 227 + size: 14, 16 + orig: 14, 16 offset: 0, 0 index: -1 unit-risso-xlarge rotate: false - xy: 3309, 363 - size: 48, 48 - orig: 48, 48 + xy: 959, 313 + size: 43, 48 + orig: 43, 48 offset: 0, 0 index: -1 unit-scepter-large rotate: false - xy: 2707, 309 + xy: 2471, 253 size: 40, 32 orig: 40, 32 offset: 0, 0 index: -1 unit-scepter-medium rotate: false - xy: 2275, 141 + xy: 2379, 217 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 unit-scepter-small rotate: false - xy: 2208, 1 + xy: 2017, 26 size: 24, 19 orig: 24, 19 offset: 0, 0 @@ -19164,49 +22637,84 @@ unit-scepter-tiny index: -1 unit-scepter-xlarge rotate: false - xy: 231, 5 + xy: 859, 289 size: 48, 39 orig: 48, 39 offset: 0, 0 index: -1 +unit-sei-large + rotate: false + xy: 2513, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-sei-medium + rotate: false + xy: 2413, 211 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-sei-small + rotate: false + xy: 2043, 21 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-sei-tiny + rotate: false + xy: 2987, 154 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-sei-xlarge + rotate: false + xy: 909, 363 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 unit-spiroct-large rotate: false - xy: 2749, 338 + xy: 2555, 254 size: 40, 31 orig: 40, 31 offset: 0, 0 index: -1 unit-spiroct-medium rotate: false - xy: 2275, 114 + xy: 3776, 305 size: 31, 25 orig: 31, 25 offset: 0, 0 index: -1 unit-spiroct-small rotate: false - xy: 2234, 1 + xy: 2069, 26 size: 24, 19 orig: 24, 19 offset: 0, 0 index: -1 unit-spiroct-tiny rotate: false - xy: 3606, 357 + xy: 3692, 382 size: 15, 12 orig: 15, 12 offset: 0, 0 index: -1 unit-spiroct-xlarge rotate: false - xy: 3359, 373 + xy: 909, 323 size: 48, 38 orig: 48, 38 offset: 0, 0 index: -1 unit-toxopid-large rotate: false - xy: 3588, 371 + xy: 3552, 245 size: 33, 40 orig: 33, 40 offset: 0, 0 @@ -19220,63 +22728,106 @@ unit-toxopid-medium index: -1 unit-toxopid-small rotate: false - xy: 309, 178 + xy: 2147, 21 size: 20, 24 orig: 20, 24 offset: 0, 0 index: -1 unit-toxopid-tiny rotate: false - xy: 2710, 185 + xy: 899, 1 size: 13, 16 orig: 13, 16 offset: 0, 0 index: -1 unit-toxopid-xlarge rotate: false - xy: 2665, 237 + xy: 2597, 237 size: 40, 48 orig: 40, 48 offset: 0, 0 index: -1 +unit-vela-large + rotate: false + xy: 2639, 253 + size: 40, 32 + orig: 40, 32 + offset: 0, 0 + index: -1 +unit-vela-medium + rotate: false + xy: 2377, 189 + size: 32, 26 + orig: 32, 26 + offset: 0, 0 + index: -1 +unit-vela-small + rotate: false + xy: 2095, 26 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-vela-tiny + rotate: false + xy: 37, 1 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-vela-xlarge + rotate: false + xy: 859, 248 + size: 48, 39 + orig: 48, 39 + offset: 0, 0 + index: -1 unit-zenith-large rotate: false - xy: 2707, 267 + xy: 2681, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-zenith-medium rotate: false - xy: 2241, 67 + xy: 2411, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-zenith-small rotate: false - xy: 2587, 35 + xy: 2121, 21 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-zenith-tiny rotate: false - xy: 3389, 167 + xy: 3005, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-zenith-xlarge rotate: false - xy: 3409, 363 + xy: 909, 273 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +wavepane + rotate: false + xy: 3331, 258 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 white-pane rotate: false - xy: 1091, 174 + xy: 3369, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19284,14 +22835,14 @@ white-pane index: -1 whiteui rotate: false - xy: 845, 366 + xy: 821, 416 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 2428, 106 + xy: 1731, 122 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 789d38de3d..71293fe7a0 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/sprites/sprites2.png b/core/assets/sprites/sprites2.png index f64b0a63ff..fba6d8fe48 100644 Binary files a/core/assets/sprites/sprites2.png and b/core/assets/sprites/sprites2.png differ diff --git a/core/assets/sprites/sprites3.png b/core/assets/sprites/sprites3.png index a51d8709a2..6e26e044e2 100644 Binary files a/core/assets/sprites/sprites3.png and b/core/assets/sprites/sprites3.png differ diff --git a/core/assets/sprites/sprites4.png b/core/assets/sprites/sprites4.png index 3bbaee35f4..4a76287a49 100644 Binary files a/core/assets/sprites/sprites4.png and b/core/assets/sprites/sprites4.png differ diff --git a/core/assets/sprites/sprites5.png b/core/assets/sprites/sprites5.png index aa7bc69e07..a85adcfbb9 100644 Binary files a/core/assets/sprites/sprites5.png and b/core/assets/sprites/sprites5.png differ diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index 54f58da967..37ba22d3cb 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -60,8 +60,10 @@ public class Vars implements Loadable{ 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 to the JSON file containing all the BE servers. Only queried in the V6 alpha (will be removed once it's out). */ + public static final String serverJsonV6URL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json"; /** URL of the github issue report template.*/ - public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md"; + public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; /** list of built-in servers.*/ public static final Seq defaultServers = Seq.with(); /** maximum distance between mine and core that supports automatic transferring */ @@ -78,20 +80,26 @@ public class Vars implements Loadable{ public static final float miningRange = 70f; /** range for building */ public static final float buildingRange = 220f; + /** range for moving items */ + public static final float itemTransferRange = 220f; + /** range for moving items for logic units */ + public static final float logicItemTransferRange = 45f; /** duration of time between turns in ticks */ - public static final float turnDuration = 20 * Time.toMinutes; + public static final float turnDuration = 2 * Time.toMinutes; /** turns needed to destroy a sector completely */ - public static final float sectorDestructionTurns = 3f; + public static final float sectorDestructionTurns = 2f; /** min armor fraction damage; e.g. 0.05 = at least 5% damage */ - public static final float minArmorDamage = 0.05f; + public static final float minArmorDamage = 0.1f; /** launch animation duration */ public static final float launchDuration = 140f; + /** size of tiles in units */ + public static final int tilesize = 8; + /** size of one tile payload (^2) */ + public static final float tilePayload = tilesize * tilesize; /** tile used in certain situations, instead of null */ public static Tile emptyTile; /** for map generator dialog */ public static boolean updateEditorOnChange = false; - /** size of tiles in units */ - public static final int tilesize = 8; /** all choosable player colors in join/host dialog */ public static final Color[] playerColors = { Color.valueOf("82759a"), @@ -176,13 +184,12 @@ public class Vars implements Loadable{ public static GameState state; public static EntityCollisions collisions; public static DefaultWaves defaultWaves; - public static mindustry.audio.LoopControl loops; + public static LoopControl loops; public static Platform platform = new Platform(){}; public static Mods mods; public static Schematics schematics; public static BeControl becontrol; public static AsyncCore asyncCore; - public static TeamIndexProcess teamIndex; public static BaseRegistry bases; public static Universe universe; diff --git a/core/src/mindustry/ai/Astar.java b/core/src/mindustry/ai/Astar.java index c6f33e70f6..df50547d22 100644 --- a/core/src/mindustry/ai/Astar.java +++ b/core/src/mindustry/ai/Astar.java @@ -6,7 +6,7 @@ import arc.struct.*; import arc.util.*; import mindustry.world.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; public class Astar{ public static final DistanceHeuristic manhattan = (x1, y1, x2, y2) -> Math.abs(x1 - x2) + Math.abs(y1 - y2); diff --git a/core/src/mindustry/ai/BaseAI.java b/core/src/mindustry/ai/BaseAI.java index 83f393cc83..3b45d8a17b 100644 --- a/core/src/mindustry/ai/BaseAI.java +++ b/core/src/mindustry/ai/BaseAI.java @@ -44,7 +44,7 @@ public class BaseAI{ CoreBlock block = (CoreBlock)data.core().block; //create AI core unit - if(!Groups.unit.contains(u -> u.team() == data.team && u.type() == block.unitType)){ + if(!state.isEditor() && !Groups.unit.contains(u -> u.team() == data.team && u.type() == block.unitType)){ Unit unit = block.unitType.create(data.team); unit.set(data.core()); unit.add(); diff --git a/core/src/mindustry/ai/BaseRegistry.java b/core/src/mindustry/ai/BaseRegistry.java index bc470b9096..269b79d3bf 100644 --- a/core/src/mindustry/ai/BaseRegistry.java +++ b/core/src/mindustry/ai/BaseRegistry.java @@ -1,14 +1,15 @@ package mindustry.ai; import arc.*; +import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.ctype.*; import mindustry.game.*; import mindustry.game.Schematic.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.environment.*; import mindustry.world.blocks.production.*; import mindustry.world.blocks.sandbox.*; import mindustry.world.blocks.storage.*; @@ -16,12 +17,16 @@ import mindustry.world.meta.*; import java.io.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class BaseRegistry{ + /** cores, sorted by tier */ public Seq cores = new Seq<>(); + /** parts with no requirement */ public Seq parts = new Seq<>(); public ObjectMap> reqParts = new ObjectMap<>(); + public ObjectMap ores = new ObjectMap<>(); + public ObjectMap oreFloors = new ObjectMap<>(); public Seq forResource(Content item){ return reqParts.get(item, Seq::new); @@ -32,6 +37,15 @@ public class BaseRegistry{ parts.clear(); reqParts.clear(); + //load ore types and corresponding items + for(Block block : content.blocks()){ + if(block instanceof OreBlock && block.asFloor().itemDrop != null){ + ores.put(block.asFloor().itemDrop, (OreBlock)block); + }else if(block.isFloor() && block.asFloor().itemDrop != null && !oreFloors.containsKey(block.asFloor().itemDrop)){ + oreFloors.put(block.asFloor().itemDrop, block.asFloor()); + } + } + String[] names = Core.files.internal("basepartnames").readString().split("\n"); for(String name : names){ @@ -68,7 +82,7 @@ public class BaseRegistry{ } schem.tiles.removeAll(s -> s.block.buildVisibility == BuildVisibility.sandboxOnly); - part.tier = schem.tiles.sumf(s -> s.block.buildCost / s.block.buildCostMultiplier); + part.tier = schem.tiles.sumf(s -> Mathf.pow(s.block.buildCost / s.block.buildCostMultiplier, 1.2f)); if(part.core != null){ cores.add(part); diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index a0cf28b869..63151e0d11 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -6,6 +6,7 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.EnumSet; import arc.struct.*; +import arc.util.*; import mindustry.content.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -33,7 +34,7 @@ public class BlockIndexer{ /** 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 BuildingArray[] damagedTiles = new BuildingArray[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. */ @@ -70,7 +71,7 @@ public class BlockIndexer{ Events.on(WorldLoadEvent.class, event -> { scanOres.clear(); scanOres.addAll(Item.getAllOres()); - damagedTiles = new BuildingArray[Team.all.length]; + damagedTiles = new ObjectSet[Team.all.length]; flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; unitCaps = new int[Team.all.length]; activeTeams = new Seq<>(Team.class); @@ -139,14 +140,14 @@ public class BlockIndexer{ } /** Returns all damaged tiles by team. */ - public BuildingArray getDamaged(Team team){ - returnArray.clear(); + public ObjectSet getDamaged(Team team){ + breturnArray.clear(); if(damagedTiles[team.id] == null){ - damagedTiles[team.id] = new BuildingArray(); + damagedTiles[team.id] = new ObjectSet<>(); } - BuildingArray set = damagedTiles[team.id]; + ObjectSet set = damagedTiles[team.id]; for(Building build : set){ if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof ConstructBlock){ breturnArray.add(build); @@ -165,6 +166,11 @@ public class BlockIndexer{ return flagMap[team.id][type.ordinal()]; } + @Nullable + public Tile findClosestFlag(float x, float y, Team team, BlockFlag flag){ + return Geometry.findClosest(x, y, getAllied(team, flag)); + } + public boolean eachBlock(Teamc team, float range, Boolf pred, Cons cons){ return eachBlock(team.team(), team.getX(), team.getY(), range, pred, cons); } @@ -186,7 +192,7 @@ public class BlockIndexer{ if(other == null) continue; - if(other.team == team && pred.get(other) && intSet.add(other.pos())){ + if((team == null || other.team == team) && pred.get(other) && intSet.add(other.pos())){ cons.get(other); any = true; } @@ -214,7 +220,7 @@ public class BlockIndexer{ public void notifyTileDamaged(Building entity){ if(damagedTiles[entity.team.id] == null){ - damagedTiles[entity.team.id] = new BuildingArray(); + damagedTiles[entity.team.id] = new ObjectSet<>(); } damagedTiles[entity.team.id].add(entity); @@ -255,15 +261,15 @@ public class BlockIndexer{ if(e == null) continue; - if(e.team != team || !pred.get(e) || !e.block().targetable) + if(e.team != team || !pred.get(e) || !e.block.targetable) continue; float ndst = e.dst2(x, y); if(ndst < range2 && (closest == null || //this one is closer, and it is at least of equal priority - (ndst < dst && (!usePriority || closest.block().priority.ordinal() <= e.block().priority.ordinal())) || + (ndst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) || //priority is used, and new block has higher priority regardless of range - (usePriority && closest.block().priority.ordinal() < e.block().priority.ordinal()))){ + (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){ dst = ndst; closest = e; } @@ -476,35 +482,4 @@ public class BlockIndexer{ return tiles.iterator(); } } - - //TODO copy-pasted code, generics would be nice here - public static class BuildingArray implements Iterable{ - private Seq tiles = new Seq<>(false, 16); - private IntSet contained = new IntSet(); - - public void add(Building tile){ - if(contained.add(tile.pos())){ - tiles.add(tile); - } - } - - public void remove(Building tile){ - if(contained.remove(tile.pos())){ - tiles.remove(tile); - } - } - - public int size(){ - return tiles.size; - } - - public Building first(){ - return tiles.first(); - } - - @Override - public Iterator iterator(){ - return tiles.iterator(); - } - } } diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index 280106eaa8..c24cecd49c 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -4,7 +4,6 @@ import arc.*; import arc.func.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.async.*; import mindustry.annotations.Annotations.*; @@ -43,23 +42,25 @@ public class Pathfinder implements Runnable{ PathTile.health(tile) * 5 + (PathTile.nearSolid(tile) ? 2 : 0) + (PathTile.nearLiquid(tile) ? 6 : 0) + - (PathTile.deep(tile) ? 70 : 0), + (PathTile.deep(tile) ? 6000 : 0) + + (PathTile.damages(tile) ? 30 : 0), //legs (team, tile) -> PathTile.legSolid(tile) ? impassable : 1 + (PathTile.solid(tile) ? 5 : 0), //water - (team, tile) -> PathTile.solid(tile) || !PathTile.liquid(tile) ? 200 : 2 + //TODO cannot go through blocks - pathfinding isn't great + (team, tile) -> PathTile.solid(tile) || !PathTile.liquid(tile) ? 200 : 2 + (PathTile.nearGround(tile) || PathTile.nearSolid(tile) ? 14 : 0) + - (PathTile.deep(tile) ? -1 : 0) + (PathTile.deep(tile) ? -1 : 0) + + (PathTile.damages(tile) ? 35 : 0) ); //maps team, cost, type to flow field Flowfield[][][] cache; /** tile data, see PathTileStruct */ - int[][] tiles; + int[][] tiles = new int[0][0]; /** unordered array of path data for iteration only. DO NOT iterate or access this in the main thread. */ Seq threadList = new Seq<>(), mainList = new Seq<>(); /** handles task scheduling on the update thread. */ @@ -101,7 +102,6 @@ public class Pathfinder implements Runnable{ /** Packs a tile into its internal representation. */ private int packTile(Tile tile){ - //TODO nearGround is just the inverse of nearLiquid? boolean nearLiquid = false, nearSolid = false, nearGround = false; for(int i = 0; i < 4; i++){ @@ -114,7 +114,7 @@ public class Pathfinder implements Runnable{ } return PathTile.get( - tile.build == null ? 0 : Math.min((int)(tile.build.health / 40), 127), + tile.build == null ? 0 : Math.min((int)(tile.build.health / 40), 80), tile.getTeamID(), tile.solid(), tile.floor().isLiquid, @@ -122,7 +122,8 @@ public class Pathfinder implements Runnable{ nearLiquid, nearGround, nearSolid, - tile.floor().isDeep() + tile.floor().isDeep(), + tile.floor().damageTaken > 0.00001f ); } @@ -185,6 +186,8 @@ public class Pathfinder implements Runnable{ for(Flowfield data : threadList){ updateFrontier(data, maxUpdate / threadList.size); + //TODO implement timeouts... or don't + /* //remove flowfields that have 'timed out' so they can be garbage collected and no longer waste space if(data.refreshRate > 0 && Time.timeSinceMillis(data.lastUpdateTime) > fieldTimeout){ //make sure it doesn't get removed twice @@ -193,12 +196,11 @@ public class Pathfinder implements Runnable{ Team team = data.team; Core.app.post(() -> { - //TODO ????? //remove its used state - //if(fieldMap[team.id] != null){ - // fieldMap[team.id].remove(data.target); - // fieldMapUsed[team.id].remove(data.target); - //} + if(fieldMap[team.id] != null){ + fieldMap[team.id].remove(data.target); + fieldMapUsed[team.id].remove(data.target); + } //remove from main thread list mainList.remove(data); }); @@ -207,7 +209,7 @@ public class Pathfinder implements Runnable{ //remove from this thread list with a delay threadList.remove(data); }); - } + }*/ } } @@ -466,7 +468,7 @@ public class Pathfinder implements Runnable{ /** search frontier, these are Pos objects */ IntQueue frontier = new IntQueue(); /** all target positions; these positions have a cost of 0, and must be synchronized on! */ - IntSeq targets = new IntSeq(); + final IntSeq targets = new IntSeq(); /** current search ID */ int search = 1; /** last updated time */ @@ -514,5 +516,7 @@ public class Pathfinder implements Runnable{ boolean nearSolid; //whether this block is deep / drownable boolean deep; + //whether the floor damages + boolean damages; } } diff --git a/core/src/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java index 43882cfbbe..9cecf32ac1 100644 --- a/core/src/mindustry/ai/WaveSpawner.java +++ b/core/src/mindustry/ai/WaveSpawner.java @@ -77,14 +77,18 @@ public class WaveSpawner{ eachGroundSpawn((spawnX, spawnY, doShockwave) -> { if(doShockwave){ - Time.run(20f, () -> Fx.spawnShockwave.at(spawnX, spawnY, state.rules.dropZoneRadius)); - Time.run(40f, () -> Damage.damage(state.rules.waveTeam, spawnX, spawnY, state.rules.dropZoneRadius, 99999999f, true)); + doShockwave(spawnX, spawnY); } }); Time.runTask(121f, () -> spawning = false); } + public void doShockwave(float x, float y){ + Time.run(20f, () -> Fx.spawnShockwave.at(x, y, state.rules.dropZoneRadius)); + Time.run(40f, () -> Damage.damage(state.rules.waveTeam, x, y, state.rules.dropZoneRadius, 99999999f, true)); + } + private void eachGroundSpawn(SpawnConsumer cons){ for(Tile spawn : spawns){ cons.accept(spawn.worldx(), spawn.worldy(), true); @@ -93,7 +97,7 @@ public class WaveSpawner{ if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){ Building firstCore = state.teams.playerCores().first(); for(Building core : state.rules.waveTeam.cores()){ - Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block().size * tilesize /2f * Mathf.sqrt2); + Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block.size * tilesize /2f * Mathf.sqrt2); boolean valid = false; int steps = 0; diff --git a/core/src/mindustry/ai/formations/patterns/ArrowFormation.java b/core/src/mindustry/ai/formations/patterns/ArrowFormation.java deleted file mode 100644 index e3db12d2fe..0000000000 --- a/core/src/mindustry/ai/formations/patterns/ArrowFormation.java +++ /dev/null @@ -1,26 +0,0 @@ -package mindustry.ai.formations.patterns; - -import arc.math.geom.*; -import mindustry.ai.formations.*; - -public class ArrowFormation extends FormationPattern{ - //total triangular numbers - private static final int totalTris = 30; - //triangular number table - private static final int[] triTable = new int[totalTris]; - - //calculat triangular numbers - static{ - int sum = 0; - for(int i = 0; i < totalTris; i++){ - triTable[i] = sum; - sum += (i + 1); - } - } - - @Override - public Vec3 calculateSlotLocation(Vec3 out, int slot){ - //TODO - return out; - } -} diff --git a/core/src/mindustry/ai/formations/patterns/CircleFormation.java b/core/src/mindustry/ai/formations/patterns/CircleFormation.java index c658c48bf0..9636d97036 100644 --- a/core/src/mindustry/ai/formations/patterns/CircleFormation.java +++ b/core/src/mindustry/ai/formations/patterns/CircleFormation.java @@ -5,23 +5,17 @@ import arc.math.geom.*; import mindustry.ai.formations.*; public class CircleFormation extends FormationPattern{ - /** The radius of one member. This is needed to determine how close we can pack a given number of members around circle. */ - public float memberRadius; /** Angle offset. */ public float angleOffset = 0; - public CircleFormation(float memberRadius){ - this.memberRadius = memberRadius; - } - @Override public Vec3 calculateSlotLocation(Vec3 outLocation, int slotNumber){ if(slots > 1){ float angle = (360f * slotNumber) / slots; - float radius = memberRadius / (float)Math.sin(180f / slots * Mathf.degRad); + float radius = spacing / (float)Math.sin(180f / slots * Mathf.degRad); outLocation.set(Angles.trnsx(angle, radius), Angles.trnsy(angle, radius), angle); }else{ - outLocation.set(0, 0, 360f * slotNumber); + outLocation.set(0, spacing * 1.1f, 360f * slotNumber); } outLocation.z += angleOffset; diff --git a/core/src/mindustry/ai/types/BuilderAI.java b/core/src/mindustry/ai/types/BuilderAI.java index bd4fca20ed..8e8c74f986 100644 --- a/core/src/mindustry/ai/types/BuilderAI.java +++ b/core/src/mindustry/ai/types/BuilderAI.java @@ -1,6 +1,8 @@ package mindustry.ai.types; import arc.struct.*; +import arc.util.*; +import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.Teams.*; import mindustry.gen.*; @@ -10,19 +12,41 @@ import mindustry.world.blocks.ConstructBlock.*; import static mindustry.Vars.*; public class BuilderAI extends AIController{ + float buildRadius = 1500; + boolean found = false; + @Nullable Builderc following; @Override - public void updateUnit(){ + public void updateMovement(){ Builderc builder = (Builderc)unit; if(builder.moving()){ builder.lookAt(builder.vel().angle()); } + if(target != null && shouldShoot()){ + unit.lookAt(target); + } + builder.updateBuilding(true); - //approach request if building + if(following != null){ + //try to follow and mimic someone + + //validate follower + if(!following.isValid() || !following.activelyBuilding()){ + following = null; + builder.plans().clear(); + return; + } + + //set to follower's first build plan, whatever that is + builder.plans().clear(); + builder.plans().addFirst(following.buildPlan()); + } + if(builder.buildPlan() != null){ + //approach request if building BuildPlan req = builder.buildPlan(); boolean valid = @@ -39,9 +63,34 @@ public class BuilderAI extends AIController{ builder.plans().removeFirst(); } }else{ + + //follow someone and help them build + if(timer.get(timerTarget2, 60f)){ + found = false; + + Units.nearby(unit.team, unit.x, unit.y, buildRadius, u -> { + if(found) return; + + if(u instanceof Builderc b && u != unit && ((Builderc)u).activelyBuilding()){ + BuildPlan plan = b.buildPlan(); + + Building build = world.build(plan.x, plan.y); + if(build instanceof ConstructBuild cons){ + float dist = Math.min(cons.dst(unit) - buildingRange, 0); + + //make sure you can reach the request in time + if(dist / unit.type().speed < cons.buildCost * 0.9f){ + following = b; + found = true; + } + } + } + }); + } + //find new request - if(!unit.team().data().blocks.isEmpty()){ - Queue blocks = unit.team().data().blocks; + if(!unit.team.data().blocks.isEmpty() && following == null && timer.get(timerTarget3, 60 * 2f)){ + Queue blocks = unit.team.data().blocks; BlockPlan block = blocks.first(); //check if it's already been placed @@ -50,6 +99,8 @@ public class BuilderAI extends AIController{ }else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation)){ //it's valid. //add build request. builder.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config)); + //shift build plan to tail so next unit builds something else. + blocks.addLast(blocks.removeFirst()); }else{ //shift head of queue to tail, try something else next time blocks.removeFirst(); @@ -58,4 +109,19 @@ public class BuilderAI extends AIController{ } } } + + @Override + public AIController fallback(){ + return unit.type().flying ? new FlyingAI() : new GroundAI(); + } + + @Override + public boolean useFallback(){ + return state.rules.waves && unit.team == state.rules.waveTeam && !unit.team.rules().ai; + } + + @Override + public boolean shouldShoot(){ + return !((Builderc)unit).isBuilding(); + } } diff --git a/core/src/mindustry/ai/types/FlyingAI.java b/core/src/mindustry/ai/types/FlyingAI.java index 6f4eae425f..0758f9016a 100644 --- a/core/src/mindustry/ai/types/FlyingAI.java +++ b/core/src/mindustry/ai/types/FlyingAI.java @@ -1,7 +1,6 @@ package mindustry.ai.types; import arc.math.*; -import arc.util.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.world.meta.*; @@ -12,20 +11,12 @@ public class FlyingAI extends AIController{ @Override public void updateMovement(){ - if(unit.moving()){ - unit.lookAt(unit.vel.angle()); - } - - if(unit.isFlying()){ - unit.wobble(); - } - if(target != null && unit.hasWeapons() && command() == UnitCommand.attack){ if(unit.type().weapons.first().rotate){ moveTo(target, unit.range() * 0.8f); unit.lookAt(target); }else{ - attack(80f); + attack(100f); } } @@ -34,8 +25,7 @@ public class FlyingAI extends AIController{ } if(command() == UnitCommand.rally){ - target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); - moveTo(target, 60f); + moveTo(targetFlag(unit.x, unit.y, BlockFlag.rally, false), 60f); } } @@ -67,7 +57,7 @@ public class FlyingAI extends AIController{ vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.6f)); } - vec.setLength(unit.type().speed * Time.delta); + vec.setLength(unit.type().speed); unit.moveAt(vec); } diff --git a/core/src/mindustry/ai/types/FormationAI.java b/core/src/mindustry/ai/types/FormationAI.java index 0a5bdbb25b..cbe12a565e 100644 --- a/core/src/mindustry/ai/types/FormationAI.java +++ b/core/src/mindustry/ai/types/FormationAI.java @@ -1,11 +1,12 @@ package mindustry.ai.types; +import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; -import mindustry.*; +import arc.util.*; import mindustry.ai.formations.*; import mindustry.entities.units.*; import mindustry.gen.*; +import mindustry.type.*; public class FormationAI extends AIController implements FormationMember{ public Unit leader; @@ -25,49 +26,50 @@ public class FormationAI extends AIController implements FormationMember{ @Override public void updateUnit(){ + UnitType type = unit.type(); + if(leader.dead){ unit.resetController(); return; } - unit.controlWeapons(leader.isRotate(), leader.isShooting); + if(unit.type().canBoost && unit.canPassOn()){ + unit.elevation = Mathf.approachDelta(unit.elevation, 0f, 0.08f); + } + + unit.controlWeapons(true, leader.isShooting); // unit.moveAt(Tmp.v1.set(deltaX, deltaY).limit(unit.type().speed)); - if(leader.isShooting){ - unit.aimLook(leader.aimX(), leader.aimY()); - }else{ - if(!leader.moving() || !unit.type().rotateShooting){ - if(unit.moving()){ - unit.lookAt(unit.vel.angle()); - } - }else{ - unit.lookAt(leader.rotation); - } + + unit.aim(leader.aimX(), leader.aimY()); + + if(unit.type().rotateShooting){ + unit.lookAt(leader.aimX(), leader.aimY()); + }else if(unit.moving()){ + unit.lookAt(unit.vel.angle()); } Vec2 realtarget = vec.set(target); - if(unit.isGrounded() && Vars.world.raycast(unit.tileX(), unit.tileY(), leader.tileX(), leader.tileY(), Vars.world::solid)){ - //TODO pathfind - //realtarget.set(Vars.pathfinder.getTargetTile(unit.tileOn(), unit.team, leader)); - } + float margin = 3f; - unit.moveAt(realtarget.sub(unit).limit(unit.type().speed)); + if(unit.dst(realtarget) <= margin){ + unit.vel.approachDelta(Vec2.ZERO, type.speed * type.accel / 2f); + }else{ + unit.moveAt(realtarget.sub(unit).limit(type.speed)); + } } @Override public void removed(Unit unit){ if(formation != null){ formation.removeMember(this); + unit.resetController(); } } @Override public float formationSize(){ - if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){ - //TODO return formation size - //eturn ((Commanderc)unit).formation(). - } - return unit.hitSize * 1.7f; + return unit.hitSize * 1f; } @Override diff --git a/core/src/mindustry/ai/types/GroundAI.java b/core/src/mindustry/ai/types/GroundAI.java index eca4d32e62..157ed2eb9d 100644 --- a/core/src/mindustry/ai/types/GroundAI.java +++ b/core/src/mindustry/ai/types/GroundAI.java @@ -34,14 +34,14 @@ public class GroundAI extends AIController{ if(spawner != null && unit.within(spawner, state.rules.dropZoneRadius + 120f)) move = false; } - if(move) moveTo(Pathfinder.fieldCore); + if(move) pathfind(Pathfinder.fieldCore); } if(command() == UnitCommand.rally){ Teamc target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); if(target != null && !unit.within(target, 70f)){ - moveTo(Pathfinder.fieldRally); + pathfind(Pathfinder.fieldRally); } } @@ -49,9 +49,9 @@ public class GroundAI extends AIController{ unit.elevation = Mathf.approachDelta(unit.elevation, 0f, 0.08f); } - if(!Units.invalidateTarget(target, unit, unit.range())){ + if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type().rotateShooting){ if(unit.type().hasWeapons()){ - unit.aimLook(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); + unit.lookAt(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); } }else if(unit.moving()){ unit.lookAt(unit.vel().angle()); @@ -72,19 +72,4 @@ public class GroundAI extends AIController{ } }*/ } - - protected void moveTo(int pathType){ - int costType = - unit instanceof Legsc ? Pathfinder.costLegs : - unit instanceof WaterMovec ? Pathfinder.costWater : - Pathfinder.costGround; - - Tile tile = unit.tileOn(); - if(tile == null) return; - Tile targetTile = pathfinder.getTargetTile(tile, pathfinder.getField(unit.team, costType, pathType)); - - if(tile == targetTile || (costType == Pathfinder.costWater && !targetTile.floor().isLiquid)) return; - - unit.moveAt(vec.trns(unit.angleTo(targetTile), unit.type().speed)); - } } diff --git a/core/src/mindustry/ai/types/LogicAI.java b/core/src/mindustry/ai/types/LogicAI.java new file mode 100644 index 0000000000..a7b606b932 --- /dev/null +++ b/core/src/mindustry/ai/types/LogicAI.java @@ -0,0 +1,144 @@ +package mindustry.ai.types; + +import arc.math.*; +import arc.struct.*; +import arc.util.*; +import mindustry.ai.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.logic.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +public class LogicAI extends AIController{ + /** Minimum delay between item transfers. */ + public static final float transferDelay = 60f * 2f; + /** Time after which the unit resets its controlled and reverts to a normal unit. */ + public static final float logicControlTimeout = 10f * 60f; + + public LUnitControl control = LUnitControl.stop; + public float moveX, moveY, moveRad; + public float itemTimer, payTimer, controlTimer = logicControlTimeout, targetTimer; + @Nullable + public Building controller; + public BuildPlan plan = new BuildPlan(); + + //special cache for instruction to store data + public ObjectMap execCache = new ObjectMap<>(); + + //type of aiming to use + public LUnitControl aimControl = LUnitControl.stop; + + //whether to use the boost (certain units only) + public boolean boost; + //main target set for shootP + public Teamc mainTarget; + //whether to shoot at all + public boolean shoot; + //target shoot positions for manual aiming + public PosTeam posTarget = PosTeam.create(); + + private ObjectSet radars = new ObjectSet<>(); + + @Override + protected void updateMovement(){ + if(itemTimer > 0) itemTimer -= Time.delta; + if(payTimer > 0) payTimer -= Time.delta; + + if(targetTimer > 0f){ + targetTimer -= Time.delta; + }else{ + radars.clear(); + targetTimer = 40f; + } + + //timeout when not controlled by logic for a while + if(controlTimer > 0 && controller != null && controller.isValid()){ + controlTimer -= Time.delta; + }else{ + unit.resetController(); + return; + } + + switch(control){ + case move -> { + moveTo(Tmp.v1.set(moveX, moveY), 1f, 30f); + } + case approach -> { + moveTo(Tmp.v1.set(moveX, moveY), moveRad - 8f, 8f); + } + case pathfind -> { + Building core = unit.closestEnemyCore(); + + if((core == null || !unit.within(core, unit.range() * 0.5f)) && command() == UnitCommand.attack){ + boolean move = true; + + if(state.rules.waves && unit.team == state.rules.defaultTeam){ + Tile spawner = getClosestSpawner(); + if(spawner != null && unit.within(spawner, state.rules.dropZoneRadius + 120f)) move = false; + } + + if(move) pathfind(Pathfinder.fieldCore); + } + + if(command() == UnitCommand.rally){ + Teamc target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); + + if(target != null && !unit.within(target, 70f)){ + pathfind(Pathfinder.fieldRally); + } + } + } + case stop -> { + if(unit instanceof Builderc build){ + build.clearBuilding(); + } + } + } + + if(unit.type().canBoost && !unit.type().flying){ + unit.elevation = Mathf.approachDelta(unit.elevation, Mathf.num(boost || unit.onSolid()), 0.08f); + } + + //look where moving if there's nothing to aim at + if(!shoot){ + if(unit.moving()){ + unit.lookAt(unit.vel().angle()); + } + }else if(unit.hasWeapons()){ //if there is, look at the object + unit.lookAt(unit.mounts[0].aimX, unit.mounts[0].aimY); + } + } + + public boolean checkTargetTimer(Object radar){ + return radars.add(radar); + } + + //always retarget + @Override + protected boolean retarget(){ + return true; + } + + @Override + protected boolean invalid(Teamc target){ + return false; + } + + @Override + protected boolean shouldShoot(){ + return shoot && !(unit.type().canBoost && boost); + } + + //always aim for the main target + @Override + protected Teamc target(float x, float y, float range, boolean air, boolean ground){ + return switch(aimControl){ + case target -> posTarget; + case targetp -> mainTarget; + default -> null; + }; + } +} diff --git a/core/src/mindustry/ai/types/MinerAI.java b/core/src/mindustry/ai/types/MinerAI.java index 5077ad77a1..a03481768f 100644 --- a/core/src/mindustry/ai/types/MinerAI.java +++ b/core/src/mindustry/ai/types/MinerAI.java @@ -15,19 +15,9 @@ public class MinerAI extends AIController{ @Override protected void updateMovement(){ - if(unit.moving()){ - unit.lookAt(unit.vel.angle()); - } - - if(unit.isFlying()){ - unit.wobble(); - } - Building core = unit.closestCore(); - if(!(unit instanceof Minerc) || core == null) return; - - Minerc miner = (Minerc)unit; + if(!(unit instanceof Minerc miner) || core == null) return; if(miner.mineTile() != null && !miner.mineTile().within(unit, unit.type().range)){ miner.mineTile(null); @@ -39,6 +29,7 @@ public class MinerAI extends AIController{ //core full of the target item, do nothing if(targetItem != null && core.acceptStack(targetItem, 1, unit) == 0){ unit.clearItem(); + miner.mineTile(null); return; } @@ -51,7 +42,7 @@ public class MinerAI extends AIController{ } if(ore != null){ - moveTo(ore, unit.type().range / 1.5f); + moveTo(ore, unit.type().range / 2f); if(unit.within(ore, unit.type().range)){ miner.mineTile(ore); @@ -63,6 +54,8 @@ public class MinerAI extends AIController{ } } }else{ + miner.mineTile(null); + if(unit.stack.amount == 0){ mining = true; return; diff --git a/core/src/mindustry/ai/types/RepairAI.java b/core/src/mindustry/ai/types/RepairAI.java new file mode 100644 index 0000000000..5f021ae828 --- /dev/null +++ b/core/src/mindustry/ai/types/RepairAI.java @@ -0,0 +1,45 @@ +package mindustry.ai.types; + +import mindustry.entities.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.world.blocks.ConstructBlock.*; + +public class RepairAI extends AIController{ + + @Override + protected void updateMovement(){ + if(target instanceof Building){ + boolean shoot = false; + + if(target.within(unit, unit.type().range)){ + unit.aim(target); + shoot = true; + } + + unit.controlWeapons(shoot); + }else if(target == null){ + unit.controlWeapons(false); + } + + if(target != null){ + if(!target.within(unit, unit.type().range * 0.65f)){ + moveTo(target, unit.type().range * 0.65f); + } + + unit.lookAt(target); + } + } + + @Override + protected void updateTargeting(){ + target = Units.findDamagedTile(unit.team, unit.x, unit.y); + + if(target instanceof ConstructBuild) target = null; + + if(target == null){ + super.updateTargeting(); + } + } + +} diff --git a/core/src/mindustry/ai/types/SuicideAI.java b/core/src/mindustry/ai/types/SuicideAI.java index ffa276492a..2eae6e409f 100644 --- a/core/src/mindustry/ai/types/SuicideAI.java +++ b/core/src/mindustry/ai/types/SuicideAI.java @@ -3,8 +3,12 @@ package mindustry.ai.types; import mindustry.*; import mindustry.ai.*; import mindustry.entities.*; +import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.world.*; +import mindustry.world.blocks.distribution.*; +import mindustry.world.blocks.liquid.*; +import mindustry.world.meta.*; public class SuicideAI extends GroundAI{ static boolean blockedByBlock; @@ -12,7 +16,7 @@ public class SuicideAI extends GroundAI{ @Override public void updateUnit(){ - if(Units.invalidateTarget(target, unit.team(), unit.x(), unit.y(), Float.MAX_VALUE)){ + if(Units.invalidateTarget(target, unit.team, unit.x, unit.y, Float.MAX_VALUE)){ target = null; } @@ -22,44 +26,60 @@ public class SuicideAI extends GroundAI{ Building core = unit.closestEnemyCore(); - boolean rotate = false, shoot = false; + boolean rotate = false, shoot = false, moveToTarget = false; - if(!Units.invalidateTarget(target, unit, unit.range())){ + if(!Units.invalidateTarget(target, unit, unit.range()) && unit.hasWeapons()){ rotate = true; shoot = unit.within(target, unit.type().weapons.first().bullet.range() + - (target instanceof Building ? ((Building)target).block().size * Vars.tilesize / 2f : ((Hitboxc)target).hitSize() / 2f)); + (target instanceof Building ? ((Building)target).block.size * Vars.tilesize / 2f : ((Hitboxc)target).hitSize() / 2f)); if(unit.type().hasWeapons()){ unit.aimLook(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); } - blockedByBlock = false; + //do not move toward walls or transport blocks + if(!(target instanceof Building build && ( + build.block.group == BlockGroup.walls || + build.block.group == BlockGroup.liquids || + build.block.group == BlockGroup.transportation + ))){ + blockedByBlock = false; - //raycast for target - boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> { - Tile tile = Vars.world.tile(x, y); - if(tile != null && tile.build == target) return false; - if(tile != null && tile.build != null && tile.build.team != unit.team()){ - blockedByBlock = true; - return true; - }else{ - return tile == null || tile.solid(); + //raycast for target + boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> { + Tile tile = Vars.world.tile(x, y); + if(tile != null && tile.build == target) return false; + if(tile != null && tile.build != null && tile.build.team != unit.team()){ + blockedByBlock = true; + return true; + }else{ + return tile == null || tile.solid(); + } + }); + + //shoot when there's an enemy block in the way + if(blockedByBlock){ + shoot = true; } - }); - //shoot when there's an enemy block in the way - if(blockedByBlock){ - shoot = true; + if(!blocked){ + moveToTarget = true; + //move towards target directly + unit.moveAt(vec.set(target).sub(unit).limit(unit.type().speed)); + } } - if(!blocked){ - //move towards target directly - unit.moveAt(vec.set(target).sub(unit).limit(unit.type().speed)); - } + } - }else{ - if(core != null){ - moveTo(Pathfinder.fieldCore); + if(!moveToTarget){ + if(command() == UnitCommand.rally){ + Teamc target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); + + if(target != null && !unit.within(target, 70f)){ + pathfind(Pathfinder.fieldRally); + } + }else if(command() == UnitCommand.attack && core != null){ + pathfind(Pathfinder.fieldCore); } if(unit.moving()) unit.lookAt(unit.vel().angle()); @@ -67,4 +87,10 @@ public class SuicideAI extends GroundAI{ unit.controlWeapons(rotate, shoot); } + + @Override + protected Teamc target(float x, float y, float range, boolean air, boolean ground){ + return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground), t -> ground && + !(t.block instanceof Conveyor || t.block instanceof Conduit)); //do not target conveyors/conduits + } } diff --git a/core/src/mindustry/async/AsyncCore.java b/core/src/mindustry/async/AsyncCore.java index a023afafcc..a9d4cdd90d 100644 --- a/core/src/mindustry/async/AsyncCore.java +++ b/core/src/mindustry/async/AsyncCore.java @@ -2,18 +2,16 @@ package mindustry.async; import arc.*; import arc.struct.*; -import mindustry.*; import mindustry.game.EventType.*; import java.util.concurrent.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; public class AsyncCore{ //all processes to be executed each frame private final Seq processes = Seq.with( - new PhysicsProcess(), - Vars.teamIndex = new TeamIndexProcess() + new PhysicsProcess() ); //futures to be awaited diff --git a/core/src/mindustry/async/PhysicsProcess.java b/core/src/mindustry/async/PhysicsProcess.java index 5e8b1be923..07d44d4717 100644 --- a/core/src/mindustry/async/PhysicsProcess.java +++ b/core/src/mindustry/async/PhysicsProcess.java @@ -1,31 +1,25 @@ package mindustry.async; -import arc.box2d.*; -import arc.box2d.BodyDef.*; +import arc.math.*; import arc.math.geom.*; +import arc.math.geom.QuadTree.*; import arc.struct.*; +import mindustry.*; +import mindustry.async.PhysicsProcess.PhysicsWorld.*; import mindustry.entities.*; import mindustry.gen.*; public class PhysicsProcess implements AsyncProcess{ - private Physics physics; + private static final int + layers = 3, + layerGround = 0, + layerLegs = 1, + layerFlying = 2; + + private PhysicsWorld physics; private Seq refs = new Seq<>(false); - private BodyDef def; - - private EntityGroup group; - private Filter flying = new Filter(){{ - maskBits = categoryBits = 2; - }}, ground = new Filter(){{ - maskBits = categoryBits = 1; - }}; - - public PhysicsProcess(){ - def = new BodyDef(); - def.type = BodyType.dynamicBody; - - //currently only enabled for units - group = Groups.unit; - } + //currently only enabled for units + private EntityGroup group = Groups.unit; @Override public void begin(){ @@ -34,48 +28,39 @@ public class PhysicsProcess implements AsyncProcess{ //remove stale entities refs.removeAll(ref -> { if(!ref.entity.isAdded()){ - physics.destroyBody(ref.body); + physics.remove(ref.body); + ref.entity.physref(null); return true; } return false; }); - //find entities without bodies and assign them - for(Physicsc entity : group){ - boolean grounded = entity.isGrounded(); + //find Unit without bodies and assign them + for(Unit entity : group){ if(entity.physref() == null){ - //add bodies to entities that have none - FixtureDef fd = new FixtureDef(); - fd.shape = new CircleShape(entity.hitSize() / 2f); - fd.density = 5f; - fd.restitution = 0.0f; - fd.filter.maskBits = fd.filter.categoryBits = (grounded ? ground : flying).maskBits; - - def.position.set(entity); - - Body body = physics.createBody(def); - body.createFixture(fd); + PhysicsBody body = new PhysicsBody(); + body.x = entity.x(); + body.y = entity.y(); + body.mass = entity.mass(); + body.radius = entity.hitSize() / 2f; PhysicRef ref = new PhysicRef(entity, body); refs.add(ref); entity.physref(ref); + + physics.add(body); } //save last position PhysicRef ref = entity.physref(); - if(ref.wasGround != grounded){ - if(ref.body.getFixtureList().isEmpty()) continue; - - //set correct filter - ref.body.getFixtureList().first().setFilterData(grounded ? ground : flying); - ref.wasGround = grounded; - } - - ref.velocity.set(entity.deltaX(), entity.deltaY()); - ref.position.set(entity); + ref.body.layer = + entity.type().allowLegStep ? layerLegs : + entity.isGrounded() ? layerGround : layerFlying; + ref.x = entity.x(); + ref.y = entity.y(); } } @@ -86,26 +71,11 @@ public class PhysicsProcess implements AsyncProcess{ //get last position vectors before step for(PhysicRef ref : refs){ //force set target position - ref.body.setPosition(ref.position.x, ref.position.y); - - //save last position for delta - ref.lastPosition.set(ref.body.getPosition()); - - //write velocity - ref.body.setLinearVelocity(ref.velocity); - - ref.lastVelocity.set(ref.velocity); + ref.body.x = ref.x; + ref.body.y = ref.y; } - physics.step(1f/45f, 5, 8); - - //get delta vectors - for(PhysicRef ref : refs){ - //get delta vector - ref.delta.set(ref.body.getPosition()).sub(ref.lastPosition); - - ref.velocity.set(ref.body.getLinearVelocity()); - } + physics.update(); } @Override @@ -116,13 +86,8 @@ public class PhysicsProcess implements AsyncProcess{ for(PhysicRef ref : refs){ Physicsc entity = ref.entity; - entity.move(ref.delta.x, ref.delta.y); - - //save last position - ref.position.set(entity); - - //add delta velocity - this doesn't work very well yet - //entity.vel().add(ref.velocity).sub(ref.lastVelocity); + //move by delta + entity.move(ref.body.x - ref.x, ref.body.y - ref.y); } } @@ -130,7 +95,6 @@ public class PhysicsProcess implements AsyncProcess{ public void reset(){ if(physics != null){ refs.clear(); - physics.dispose(); physics = null; } } @@ -139,18 +103,95 @@ public class PhysicsProcess implements AsyncProcess{ public void init(){ reset(); - physics = new Physics(new Vec2(), true); + physics = new PhysicsWorld(Vars.world.getQuadBounds(new Rect())); } public static class PhysicRef{ - Physicsc entity; - Body body; - boolean wasGround = true; - Vec2 lastPosition = new Vec2(), delta = new Vec2(), velocity = new Vec2(), lastVelocity = new Vec2(), position = new Vec2(); + public Physicsc entity; + public PhysicsBody body; + public float x, y; - public PhysicRef(Physicsc entity, Body body){ + public PhysicRef(Physicsc entity, PhysicsBody body){ this.entity = entity; this.body = body; } } + + //world for simulating physics in a different thread + public static class PhysicsWorld{ + //how much to soften movement by + private static final float scl = 1.25f; + + private final QuadTree[] trees = new QuadTree[layers]; + private final Seq bodies = new Seq<>(false, 16, PhysicsBody.class); + private final Seq seq = new Seq<>(PhysicsBody.class); + private final Rect rect = new Rect(); + private final Vec2 vec = new Vec2(); + + public PhysicsWorld(Rect bounds){ + for(int i = 0; i < layers; i++){ + trees[i] = new QuadTree<>(new Rect(bounds)); + } + } + + public void add(PhysicsBody body){ + bodies.add(body); + } + + public void remove(PhysicsBody body){ + bodies.remove(body); + } + + public void update(){ + for(int i = 0; i < layers; i++){ + trees[i].clear(); + } + + for(int i = 0; i < bodies.size; i++){ + PhysicsBody body = bodies.items[i]; + body.collided = false; + trees[body.layer].insert(body); + } + + for(int i = 0; i < bodies.size; i++){ + PhysicsBody body = bodies.items[i]; + body.hitbox(rect); + + seq.size = 0; + trees[body.layer].intersect(rect, seq); + + for(int j = 0; j < seq.size; j++){ + PhysicsBody other = seq.items[j]; + + if(other == body || other.collided) continue; + + float rs = body.radius + other.radius; + float dst = Mathf.dst(body.x, body.y, other.x, other.y); + + if(dst < rs){ + vec.set(body.x - other.x, body.y - other.y).setLength(rs - dst); + float ms = body.mass + other.mass; + float m1 = other.mass / ms, m2 = body.mass / ms; + + body.x += vec.x * m1 / scl; + body.y += vec.y * m1 / scl; + other.x -= vec.x * m2 / scl; + other.y -= vec.y * m2 / scl; + } + } + body.collided = true; + } + } + + public static class PhysicsBody implements QuadTreeObject{ + public float x, y, radius, mass; + public int layer = 0; + public boolean collided = false; + + @Override + public void hitbox(Rect out){ + out.setCentered(x, y, radius * 2, radius * 2); + } + } + } } diff --git a/core/src/mindustry/async/TeamIndexProcess.java b/core/src/mindustry/async/TeamIndexProcess.java deleted file mode 100644 index c4dbede3a7..0000000000 --- a/core/src/mindustry/async/TeamIndexProcess.java +++ /dev/null @@ -1,83 +0,0 @@ -package mindustry.async; - -import arc.math.geom.*; -import mindustry.*; -import mindustry.game.*; -import mindustry.gen.*; -import mindustry.type.*; - -import java.util.*; - -/** Creates quadtrees per unit team. */ -public class TeamIndexProcess implements AsyncProcess{ - private QuadTree[] trees = new QuadTree[Team.all.length]; - private int[] counts = new int[Team.all.length]; - private int[][] typeCounts = new int[Team.all.length][0]; - private int[][] activeCounts = new int[Team.all.length][0]; - - public QuadTree tree(Team team){ - if(trees[team.id] == null) trees[team.id] = new QuadTree<>(Vars.world.getQuadBounds(new Rect())); - - return trees[team.id]; - } - - public int count(Team team){ - return counts[team.id]; - } - - public int countType(Team team, UnitType type){ - return typeCounts[team.id].length <= type.id ? 0 : typeCounts[team.id][type.id]; - } - - public int countActive(Team team, UnitType type){ - return activeCounts[team.id].length <= type.id ? 0 : activeCounts[team.id][type.id]; - } - - public void updateCount(Team team, UnitType type, int amount){ - counts[team.id] += amount; - if(typeCounts[team.id].length <= type.id){ - typeCounts[team.id] = new int[Vars.content.units().size]; - } - typeCounts[team.id][type.id] += amount; - } - - public void updateActiveCount(Team team, UnitType type, int amount){ - if(activeCounts[team.id].length <= type.id){ - activeCounts[team.id] = new int[Vars.content.units().size]; - } - activeCounts[team.id][type.id] += amount; - } - - @Override - public void reset(){ - counts = new int[Team.all.length]; - trees = new QuadTree[Team.all.length]; - } - - @Override - public void begin(){ - - for(Team team : Team.all){ - if(trees[team.id] != null){ - trees[team.id].clear(); - } - - Arrays.fill(typeCounts[team.id], 0); - Arrays.fill(activeCounts[team.id], 0); - } - - Arrays.fill(counts, 0); - - for(Unit unit : Groups.unit){ - tree(unit.team).insert(unit); - - updateCount(unit.team, unit.type(), 1); - if(!unit.deactivated) updateActiveCount(unit.team, unit.type(), 1); - } - } - - @Override - public boolean shouldProcess(){ - return false; - } -} diff --git a/core/src/mindustry/audio/LoopControl.java b/core/src/mindustry/audio/LoopControl.java index 1b102ab0a4..65e3789463 100644 --- a/core/src/mindustry/audio/LoopControl.java +++ b/core/src/mindustry/audio/LoopControl.java @@ -2,9 +2,9 @@ package mindustry.audio; import arc.*; import arc.audio.*; -import arc.struct.*; import arc.math.*; import arc.math.geom.*; +import arc.struct.*; import mindustry.*; public class LoopControl{ diff --git a/core/src/mindustry/audio/MusicControl.java b/core/src/mindustry/audio/MusicControl.java index 1b642bc7cd..52358af758 100644 --- a/core/src/mindustry/audio/MusicControl.java +++ b/core/src/mindustry/audio/MusicControl.java @@ -4,7 +4,6 @@ import arc.*; import arc.audio.*; import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.game.EventType.*; import mindustry.gen.*; diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index d9232a34d1..05ed572f7e 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -3,6 +3,7 @@ package mindustry.content; import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; +import arc.struct.*; import mindustry.ctype.*; import mindustry.entities.bullet.*; import mindustry.gen.*; @@ -34,10 +35,10 @@ public class Blocks implements ContentList{ public static Block //environment - air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, ice, snow, darksandTaintedWater, - holostone, rocks, sporerocks, icerocks, cliffs, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, - iceSnow, sandWater, darksandWater, duneRocks, sandRocks, moss, sporeMoss, shale, shaleRocks, shaleBoulder, sandBoulder, grass, salt, - metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, ignarock, magmarock, hotrock, snowrocks, rock, snowrock, saltRocks, + air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, space, + dacite, stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, + iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, grass, salt, + metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, basalt, magmarock, hotrock, snowWall, boulder, snowBoulder, saltWall, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal, pebbles, tendrils, @@ -64,7 +65,7 @@ public class Blocks implements ContentList{ mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, platedConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit, //power - combustionGenerator, thermalGenerator, turbineGenerator, differentialGenerator, rtgGenerator, solarPanel, largeSolarPanel, thoriumReactor, + combustionGenerator, thermalGenerator, steamGenerator, differentialGenerator, rtgGenerator, solarPanel, largeSolarPanel, thoriumReactor, impactReactor, battery, batteryLarge, powerNode, powerNodeLarge, surgeTower, diode, //production @@ -74,7 +75,7 @@ public class Blocks implements ContentList{ coreShard, coreFoundation, coreNucleus, vault, container, unloader, //turrets - duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, spectre, meltdown, segment, parallax, + duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, foreshadow, spectre, meltdown, segment, parallax, tsunami, //units commandCenter, @@ -83,7 +84,7 @@ public class Blocks implements ContentList{ repairPoint, resupplyPoint, //logic - message, switchBlock, microProcessor, logicProcessor, hyperProcessor, logicDisplay, memoryCell, + message, switchBlock, microProcessor, logicProcessor, hyperProcessor, largeLogicDisplay, logicDisplay, memoryCell, memoryBank, //campaign launchPad, launchPadLarge, @@ -208,6 +209,18 @@ public class Blocks implements ContentList{ liquidDrop = Liquids.slag; isLiquid = true; cacheLayer = CacheLayer.slag; + attributes.set(Attribute.heat, 0.85f); + + emitLight = true; + lightRadius = 40f; + lightColor = Color.orange.cpy().a(0.38f); + }}; + + space = new Floor("space"){{ + cacheLayer = CacheLayer.space; + placeableOn = false; + solid = true; + variants = 0; }}; stone = new Floor("stone"); @@ -221,14 +234,14 @@ public class Blocks implements ContentList{ blendGroup = stone; }}; - ignarock = new Floor("ignarock"){{ + basalt = new Floor("basalt"){{ attributes.set(Attribute.water, -0.25f); }}; hotrock = new Floor("hotrock"){{ attributes.set(Attribute.heat, 0.5f); attributes.set(Attribute.water, -0.5f); - blendGroup = ignarock; + blendGroup = basalt; emitLight = true; lightRadius = 30f; @@ -239,10 +252,10 @@ public class Blocks implements ContentList{ attributes.set(Attribute.heat, 0.75f); attributes.set(Attribute.water, -0.75f); updateEffect = Fx.magmasmoke; - blendGroup = ignarock; + blendGroup = basalt; emitLight = true; - lightRadius = 60f; + lightRadius = 50f; lightColor = Color.orange.cpy().a(0.3f); }}; @@ -258,11 +271,23 @@ public class Blocks implements ContentList{ attributes.set(Attribute.oil, 1.5f); }}; + dirt = new Floor("dirt"); + + mud = new Floor("mud"){{ + speedMultiplier = 0.6f; + variants = 3; + status = StatusEffects.muddy; + statusDuration = 30f; + attributes.set(Attribute.water, 1f); + cacheLayer = CacheLayer.mud; + albedo = 0.35f; + }}; + ((ShallowLiquid)darksandTaintedWater).set(Blocks.taintedWater, Blocks.darksand); ((ShallowLiquid)sandWater).set(Blocks.water, Blocks.sand); ((ShallowLiquid)darksandWater).set(Blocks.water, Blocks.darksand); - holostone = new Floor("holostone"); + dacite = new Floor("dacite"); grass = new Floor("grass"){{ attributes.set(Attribute.water, 0.1f); @@ -270,7 +295,7 @@ public class Blocks implements ContentList{ salt = new Floor("salt"){{ variants = 0; - attributes.set(Attribute.water, -0.25f); + attributes.set(Attribute.water, -0.3f); attributes.set(Attribute.oil, 0.3f); }}; @@ -290,46 +315,51 @@ public class Blocks implements ContentList{ attributes.set(Attribute.water, 0.3f); }}; - cliffs = new StaticWall("cliffs"){{ - variants = 1; - fillsTile = false; - }}; - - rocks = new StaticWall("rocks"){{ + stoneWall = new StaticWall("stone-wall"){{ variants = 2; }}; - sporerocks = new StaticWall("sporerocks"){{ + sporeWall = new StaticWall("spore-wall"){{ variants = 2; }}; - rock = new Rock("rock"){{ + boulder = new Boulder("boulder"){{ variants = 2; }}; - snowrock = new Rock("snowrock"){{ + snowBoulder = new Boulder("snow-boulder"){{ + variants = 2; + snow.asFloor().decoration = ice.asFloor().decoration = iceSnow.asFloor().decoration = this; + }}; + + dirtWall = new StaticWall("dirt-wall"){{ variants = 2; }}; - icerocks = new StaticWall("icerocks"){{ + daciteWall = new StaticWall("dacite-wall"){{ + variants = 2; + }}; + + iceWall = new StaticWall("ice-wall"){{ variants = 2; iceSnow.asFloor().wall = this; }}; - snowrocks = new StaticWall("snowrocks"){{ + snowWall = new StaticWall("snow-wall"){{ variants = 2; }}; - duneRocks = new StaticWall("dunerocks"){{ + duneWall = new StaticWall("dune-wall"){{ variants = 2; - ignarock.asFloor().wall = this; + basalt.asFloor().wall = darksandWater.asFloor().wall = darksandTaintedWater.asFloor().wall = this; }}; - sandRocks = new StaticWall("sandrocks"){{ + sandWall = new StaticWall("sand-wall"){{ variants = 2; + sandWater.asFloor().wall = this; }}; - saltRocks = new StaticWall("saltrocks"); + saltWall = new StaticWall("salt-wall"); sporePine = new StaticTree("spore-pine"){{ variants = 0; @@ -349,7 +379,7 @@ public class Blocks implements ContentList{ whiteTree = new TreeBlock("white-tree"); - sporeCluster = new Rock("spore-cluster"){{ + sporeCluster = new Boulder("spore-cluster"){{ variants = 3; }}; @@ -358,15 +388,19 @@ public class Blocks implements ContentList{ attributes.set(Attribute.oil, 1f); }}; - shaleRocks = new StaticWall("shalerocks"){{ + shaleWall = new StaticWall("shale-wall"){{ variants = 2; }}; - shaleBoulder = new Rock("shale-boulder"){{ + shaleBoulder = new Boulder("shale-boulder"){{ variants = 2; }}; - sandBoulder = new Rock("sand-boulder"){{ + sandBoulder = new Boulder("sand-boulder"){{ + variants = 2; + }}; + + daciteBoulder = new Boulder("dacite-boulder"){{ variants = 2; }}; @@ -379,7 +413,7 @@ public class Blocks implements ContentList{ sporeMoss = new Floor("spore-moss"){{ variants = 3; attributes.set(Attribute.spores, 0.3f); - wall = sporerocks; + wall = sporeWall; }}; metalFloor = new Floor("metal-floor"){{ @@ -507,7 +541,7 @@ public class Blocks implements ContentList{ itemCapacity = 30; boostScale = 0.15f; - consumes.items(new ItemStack(Items.coal, 3), new ItemStack(Items.sand, 6), new ItemStack(Items.pyratite, 1)); + consumes.items(new ItemStack(Items.coal, 4), new ItemStack(Items.sand, 6), new ItemStack(Items.pyratite, 1)); consumes.power(4f); }}; @@ -568,7 +602,7 @@ public class Blocks implements ContentList{ consumes.items(new ItemStack(Items.copper, 3), new ItemStack(Items.lead, 4), new ItemStack(Items.titanium, 2), new ItemStack(Items.silicon, 3)); }}; - cryofluidMixer = new LiquidConverter("cryofluidmixer"){{ + cryofluidMixer = new LiquidConverter("cryofluid-mixer"){{ requirements(Category.crafting, with(Items.lead, 65, Items.silicon, 40, Items.titanium, 60)); outputLiquid = new LiquidStack(Liquids.cryofluid, 0.2f); craftTime = 120f; @@ -668,7 +702,7 @@ public class Blocks implements ContentList{ drawer = new DrawAnimation(); consumes.item(Items.sporePod, 1); - consumes.power(0.60f); + consumes.power(0.7f); }}; pulverizer = new GenericCrafter("pulverizer"){{ @@ -692,8 +726,8 @@ public class Blocks implements ContentList{ size = 2; hasPower = hasItems = hasLiquids = true; - consumes.liquid(Liquids.oil, 0.09f); - consumes.power(0.5f); + consumes.liquid(Liquids.oil, 0.1f); + consumes.power(0.7f); }}; incinerator = new Incinerator("incinerator"){{ @@ -731,14 +765,14 @@ public class Blocks implements ContentList{ plastaniumWall = new Wall("plastanium-wall"){{ requirements(Category.defense, with(Items.plastanium, 5, Items.metaglass, 2)); - health = 190 * wallHealthMultiplier; + health = 130 * wallHealthMultiplier; insulated = true; absorbLasers = true; }}; plastaniumWallLarge = new Wall("plastanium-wall-large"){{ requirements(Category.defense, ItemStack.mult(plastaniumWall.requirements, 4)); - health = 190 * wallHealthMultiplier * 4; + health = 130 * wallHealthMultiplier * 4; size = 2; insulated = true; absorbLasers = true; @@ -782,7 +816,7 @@ public class Blocks implements ContentList{ }}; door = new Door("door"){{ - requirements(Category.defense, with(Items.graphite, 6, Items.silicon, 4)); + requirements(Category.defense, with(Items.titanium, 6, Items.silicon, 4)); health = 100 * wallHealthMultiplier; }}; @@ -795,27 +829,27 @@ public class Blocks implements ContentList{ }}; scrapWall = new Wall("scrap-wall"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, with(Items.scrap, 6)); health = 60 * wallHealthMultiplier; variants = 5; }}; scrapWallLarge = new Wall("scrap-wall-large"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.mult(scrapWall.requirements, 4)); health = 60 * 4 * wallHealthMultiplier; size = 2; variants = 4; }}; scrapWallHuge = new Wall("scrap-wall-huge"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.mult(scrapWall.requirements, 9)); health = 60 * 9 * wallHealthMultiplier; size = 3; variants = 3; }}; scrapWallGigantic = new Wall("scrap-wall-gigantic"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, with()); + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.mult(scrapWall.requirements, 16)); health = 60 * 16 * wallHealthMultiplier; size = 4; }}; @@ -844,7 +878,8 @@ public class Blocks implements ContentList{ size = 2; reload = 250f; range = 85f; - healPercent = 14f; + healPercent = 11f; + phaseBoost = 15f; health = 80 * size * size; consumes.item(Items.phasefabric).boost(); }}; @@ -920,7 +955,7 @@ public class Blocks implements ContentList{ requirements(Category.distribution, with(Items.plastanium, 1, Items.thorium, 1, Items.metaglass, 1)); health = 180; speed = 0.08f; - displayedSpeed = 10f; + displayedSpeed = 11f; }}; junction = new Junction("junction"){{ @@ -959,7 +994,7 @@ public class Blocks implements ContentList{ router = new Router("router"){{ requirements(Category.distribution, with(Items.copper, 3)); - buildCostMultiplier = 2f; + buildCostMultiplier = 4f; }}; distributor = new Router("distributor"){{ @@ -1002,7 +1037,7 @@ public class Blocks implements ContentList{ mechanicalPump = new Pump("mechanical-pump"){{ requirements(Category.liquid, with(Items.copper, 15, Items.metaglass, 10)); - pumpAmount = 0.1f; + pumpAmount = 0.11f; }}; rotaryPump = new Pump("rotary-pump"){{ @@ -1092,7 +1127,7 @@ public class Blocks implements ContentList{ requirements(Category.power, with(Items.titanium, 7, Items.lead, 10, Items.silicon, 15, Items.surgealloy, 15)); size = 2; maxNodes = 2; - laserRange = 30f; + laserRange = 40f; }}; diode = new PowerDiode("diode"){{ @@ -1121,13 +1156,14 @@ public class Blocks implements ContentList{ powerProduction = 1.8f; generateEffect = Fx.redgeneratespark; size = 2; + floating = true; }}; - turbineGenerator = new BurnerGenerator("turbine-generator"){{ + steamGenerator = new BurnerGenerator("steam-generator"){{ requirements(Category.power, with(Items.copper, 35, Items.graphite, 25, Items.lead, 40, Items.silicon, 30)); powerProduction = 5.5f; itemDuration = 90f; - consumes.liquid(Liquids.water, 0.05f); + consumes.liquid(Liquids.water, 0.1f); hasLiquids = true; size = 2; }}; @@ -1148,7 +1184,7 @@ public class Blocks implements ContentList{ requirements(Category.power, with(Items.lead, 100, Items.silicon, 75, Items.phasefabric, 25, Items.plastanium, 75, Items.thorium, 50)); size = 2; powerProduction = 4.5f; - itemDuration = 500f; + itemDuration = 60 * 15f; }}; solarPanel = new SolarGenerator("solar-panel"){{ @@ -1247,11 +1283,11 @@ public class Blocks implements ContentList{ rotateSpeed = 1.4f; attribute = Attribute.water; - consumes.power(1f); + consumes.power(1.5f); }}; cultivator = new Cultivator("cultivator"){{ - requirements(Category.production, with(Items.copper, 10, Items.lead, 25, Items.silicon, 10)); + requirements(Category.production, with(Items.copper, 25, Items.lead, 25, Items.silicon, 10)); outputItem = new ItemStack(Items.sporePod, 1); craftTime = 140; size = 2; @@ -1259,8 +1295,8 @@ public class Blocks implements ContentList{ hasPower = true; hasItems = true; - consumes.power(0.80f); - consumes.liquid(Liquids.water, 0.18f); + consumes.power(0.9f); + consumes.liquid(Liquids.water, 0.2f); }}; oilExtractor = new Fracker("oil-extractor"){{ @@ -1300,22 +1336,24 @@ public class Blocks implements ContentList{ requirements(Category.effect, with(Items.copper, 3000, Items.lead, 3000, Items.silicon, 2000)); unitType = UnitTypes.beta; - health = 2000; + health = 3500; itemCapacity = 9000; size = 4; unitCapModifier = 14; + researchCostMultiplier = 0.04f; }}; coreNucleus = new CoreBlock("core-nucleus"){{ requirements(Category.effect, with(Items.copper, 8000, Items.lead, 8000, Items.silicon, 5000, Items.thorium, 4000)); unitType = UnitTypes.gamma; - health = 4000; + health = 6000; itemCapacity = 13000; size = 5; unitCapModifier = 20; + researchCostMultiplier = 0.06f; }}; vault = new StorageBlock("vault"){{ @@ -1333,6 +1371,7 @@ public class Blocks implements ContentList{ unloader = new Unloader("unloader"){{ requirements(Category.effect, with(Items.titanium, 25, Items.silicon, 30)); speed = 6f; + group = BlockGroup.transportation; }}; //endregion @@ -1357,7 +1396,7 @@ public class Blocks implements ContentList{ ammoUseEffect = Fx.shellEjectSmall; health = 250; inaccuracy = 2f; - rotatespeed = 10f; + rotateSpeed = 10f; }}; scatter = new ItemTurret("scatter"){{ @@ -1375,7 +1414,7 @@ public class Blocks implements ContentList{ targetGround = false; recoilAmount = 2f; - rotatespeed = 15f; + rotateSpeed = 15f; inaccuracy = 17f; shootCone = 35f; @@ -1472,14 +1511,14 @@ public class Blocks implements ContentList{ arc = new PowerTurret("arc"){{ requirements(Category.turret, with(Items.copper, 35, Items.lead, 50)); shootType = new LightningBulletType(){{ - damage = 21; + damage = 20; lightningLength = 25; collidesAir = false; }}; reloadTime = 35f; shootCone = 40f; - rotatespeed = 8f; - powerUse = 4f; + rotateSpeed = 8f; + powerUse = 3f; targetAir = false; range = 90f; shootEffect = Fx.lightningShoot; @@ -1495,13 +1534,12 @@ public class Blocks implements ContentList{ hasPower = true; size = 2; - force = 4.5f; + force = 5f; scaledForce = 5.5f; - range = 170f; - damage = 0.1f; + range = 160f; + damage = 0.4f; health = 160 * size * size; rotateSpeed = 10; - range = 85f; consumes.powerCond(3f, (TractorBeamBuild e) -> e.target != null); }}; @@ -1550,16 +1588,40 @@ public class Blocks implements ContentList{ }}; segment = new PointDefenseTurret("segment"){{ - requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phasefabric, 25)); + requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phasefabric, 40)); - range = 125f; + health = 250 * size * size; + range = 160f; hasPower = true; - consumes.power(3f); + consumes.powerCond(8f, (PointDefenseBuild b) -> b.target != null); size = 2; shootLength = 5f; - bulletDamage = 18f; - reloadTime = 11f; - health = 190 * size * size; + bulletDamage = 25f; + reloadTime = 9f; + }}; + + tsunami = new LiquidTurret("tsunami"){{ + requirements(Category.turret, with(Items.metaglass, 100, Items.lead, 400, Items.titanium, 250, Items.thorium, 100)); + ammo( + Liquids.water, Bullets.heavyWaterShot, + Liquids.slag, Bullets.heavySlagShot, + Liquids.cryofluid, Bullets.heavyCryoShot, + Liquids.oil, Bullets.heavyOilShot + ); + size = 3; + recoilAmount = 0f; + reloadTime = 2f; + shots = 2; + velocityInaccuracy = 0.1f; + inaccuracy = 4f; + recoilAmount = 1f; + restitution = 0.04f; + shootCone = 45f; + liquidCapacity = 40f; + shootEffect = Fx.shootLiquid; + range = 190f; + health = 250 * size * size; + shootSound = Sounds.splash; }}; fuse = new ItemTurret("fuse"){{ @@ -1578,8 +1640,10 @@ public class Blocks implements ContentList{ health = 220 * size * size; shootSound = Sounds.shotgun; + float brange = range + 10f; + ammo(Items.thorium, new ShrapnelBulletType(){{ - length = range + 10f; + length = brange; damage = 105f; ammoMultiplier = 6f; }}); @@ -1628,7 +1692,7 @@ public class Blocks implements ContentList{ range = 200f; size = 3; recoilAmount = 3f; - rotatespeed = 10f; + rotateSpeed = 10f; inaccuracy = 10f; shootCone = 30f; shootSound = Sounds.shootSnap; @@ -1636,8 +1700,50 @@ public class Blocks implements ContentList{ health = 145 * size * size; }}; + foreshadow = new ItemTurret("foreshadow"){{ + float brange = range = 500f; + + requirements(Category.turret, with(Items.copper, 1000, Items.metaglass, 600, Items.surgealloy, 300, Items.plastanium, 200, Items.silicon, 600)); + ammo( + Items.surgealloy, new PointBulletType(){{ + shootEffect = Fx.instShoot; + hitEffect = Fx.instHit; + smokeEffect = Fx.smokeCloud; + trailEffect = Fx.instTrail; + despawnEffect = Fx.instBomb; + trailSpacing = 20f; + damage = 1350; + tileDamageMultiplier = 0.5f; + speed = brange; + hitShake = 6f; + ammoMultiplier = 1f; + }} + ); + + rotateSpeed = 2.5f; + reloadTime = 200f; + restitution = 0.2f; + ammoUseEffect = Fx.shellEjectBig; + recoilAmount = 5f; + restitution = 0.009f; + cooldown = 0.009f; + shootShake = 4f; + shots = 1; + size = 4; + shootCone = 2f; + shootSound = Sounds.shootBig; + unitSort = (u, x, y) -> -u.maxHealth; + + coolantMultiplier = 0.09f; + + health = 150 * size * size; + consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 2f)).update(false).optional(true, true); + + consumes.powerCond(10f, TurretBuild::isActive); + }}; + spectre = new ItemTurret("spectre"){{ - requirements(Category.turret, with(Items.copper, 350, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250)); + requirements(Category.turret, with(Items.copper, 900, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250)); ammo( Items.graphite, Bullets.standardDenseBig, Items.pyratite, Bullets.standardIncendiaryBig, @@ -1658,12 +1764,12 @@ public class Blocks implements ContentList{ shootCone = 24f; shootSound = Sounds.shootBig; - health = 155 * size * size; + health = 160 * size * size; consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 2f)).update(false).optional(true, true); }}; meltdown = new LaserTurret("meltdown"){{ - requirements(Category.turret, with(Items.copper, 250, Items.lead, 350, Items.graphite, 300, Items.surgealloy, 325, Items.silicon, 325)); + requirements(Category.turret, with(Items.copper, 1200, Items.lead, 350, Items.graphite, 300, Items.surgealloy, 325, Items.silicon, 325)); shootEffect = Fx.shootBigSmoke2; shootCone = 40f; recoilAmount = 4f; @@ -1673,7 +1779,7 @@ public class Blocks implements ContentList{ reloadTime = 90f; firingMoveFract = 0.5f; shootDuration = 220f; - powerUse = 14f; + powerUse = 17f; shootSound = Sounds.laserbig; activeSound = Sounds.beam; activeSoundVolume = 2f; @@ -1703,33 +1809,33 @@ public class Blocks implements ContentList{ groundFactory = new UnitFactory("ground-factory"){{ requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 80)); - plans = new UnitPlan[]{ + plans = Seq.with( new UnitPlan(UnitTypes.dagger, 60f * 15, with(Items.silicon, 10, Items.lead, 10)), new UnitPlan(UnitTypes.crawler, 60f * 12, with(Items.silicon, 10, Items.coal, 20)), - new UnitPlan(UnitTypes.nova, 60f * 40, with(Items.silicon, 30, Items.lead, 20, Items.titanium, 20)), - }; + new UnitPlan(UnitTypes.nova, 60f * 40, with(Items.silicon, 30, Items.lead, 20, Items.titanium, 20)) + ); size = 3; consumes.power(1.2f); }}; airFactory = new UnitFactory("air-factory"){{ requirements(Category.units, with(Items.copper, 60, Items.lead, 70)); - plans = new UnitPlan[]{ + plans = Seq.with( new UnitPlan(UnitTypes.flare, 60f * 15, with(Items.silicon, 15)), - new UnitPlan(UnitTypes.mono, 60f * 35, with(Items.silicon, 30, Items.lead, 15)), - }; + new UnitPlan(UnitTypes.mono, 60f * 35, with(Items.silicon, 30, Items.lead, 15)) + ); size = 3; consumes.power(1.2f); }}; navalFactory = new UnitFactory("naval-factory"){{ requirements(Category.units, with(Items.copper, 150, Items.lead, 130, Items.metaglass, 120)); - plans = new UnitPlan[]{ - new UnitPlan(UnitTypes.risso, 60f * 30f, with(Items.silicon, 20, Items.metaglass, 25)), - }; + plans = Seq.with( + new UnitPlan(UnitTypes.risso, 60f * 45f, with(Items.silicon, 20, Items.metaglass, 35)) + ); size = 3; - requiresWater = true; consumes.power(1.2f); + floating = true; }}; additiveReconstructor = new Reconstructor("additive-reconstructor"){{ @@ -1741,69 +1847,75 @@ public class Blocks implements ContentList{ constructTime = 60f * 10f; - upgrades = new UnitType[][]{ - {UnitTypes.nova, UnitTypes.pulsar}, - {UnitTypes.dagger, UnitTypes.mace}, - {UnitTypes.crawler, UnitTypes.atrax}, - {UnitTypes.flare, UnitTypes.horizon}, - {UnitTypes.mono, UnitTypes.poly}, - {UnitTypes.risso, UnitTypes.minke}, - }; + upgrades.addAll( + new UnitType[]{UnitTypes.nova, UnitTypes.pulsar}, + new UnitType[]{UnitTypes.dagger, UnitTypes.mace}, + new UnitType[]{UnitTypes.crawler, UnitTypes.atrax}, + new UnitType[]{UnitTypes.flare, UnitTypes.horizon}, + new UnitType[]{UnitTypes.mono, UnitTypes.poly}, + new UnitType[]{UnitTypes.risso, UnitTypes.minke} + ); }}; multiplicativeReconstructor = new Reconstructor("multiplicative-reconstructor"){{ - requirements(Category.units, with(Items.lead, 650, Items.silicon, 350, Items.titanium, 350, Items.thorium, 650)); + requirements(Category.units, with(Items.lead, 650, Items.silicon, 450, Items.titanium, 350, Items.thorium, 650)); size = 5; consumes.power(6f); - consumes.items(with(Items.silicon, 130, Items.titanium, 80, Items.metaglass, 30)); + consumes.items(with(Items.silicon, 130, Items.titanium, 80, Items.metaglass, 40)); constructTime = 60f * 30f; - upgrades = new UnitType[][]{ - {UnitTypes.horizon, UnitTypes.zenith}, - {UnitTypes.mace, UnitTypes.fortress}, - {UnitTypes.poly, UnitTypes.mega}, - {UnitTypes.minke, UnitTypes.bryde}, - {UnitTypes.pulsar, UnitTypes.quasar}, - {UnitTypes.atrax, UnitTypes.spiroct}, - }; + upgrades.addAll( + new UnitType[]{UnitTypes.horizon, UnitTypes.zenith}, + new UnitType[]{UnitTypes.mace, UnitTypes.fortress}, + new UnitType[]{UnitTypes.poly, UnitTypes.mega}, + new UnitType[]{UnitTypes.minke, UnitTypes.bryde}, + new UnitType[]{UnitTypes.pulsar, UnitTypes.quasar}, + new UnitType[]{UnitTypes.atrax, UnitTypes.spiroct} + ); }}; exponentialReconstructor = new Reconstructor("exponential-reconstructor"){{ - requirements(Category.units, with(Items.lead, 2000, Items.silicon, 750, Items.titanium, 950, Items.thorium, 450, Items.plastanium, 350, Items.phasefabric, 450)); + requirements(Category.units, with(Items.lead, 2000, Items.silicon, 1000, Items.titanium, 2000, Items.thorium, 750, Items.plastanium, 450, Items.phasefabric, 600)); size = 7; consumes.power(13f); - consumes.items(with(Items.silicon, 450, Items.titanium, 550, Items.plastanium, 550)); + consumes.items(with(Items.silicon, 850, Items.titanium, 750, Items.plastanium, 650)); consumes.liquid(Liquids.cryofluid, 1f); constructTime = 60f * 60f * 1.5f; liquidCapacity = 60f; - upgrades = new UnitType[][]{ - {UnitTypes.zenith, UnitTypes.antumbra}, - {UnitTypes.spiroct, UnitTypes.arkyid}, - {UnitTypes.fortress, UnitTypes.scepter}, - }; + upgrades.addAll( + new UnitType[]{UnitTypes.zenith, UnitTypes.antumbra}, + new UnitType[]{UnitTypes.spiroct, UnitTypes.arkyid}, + new UnitType[]{UnitTypes.fortress, UnitTypes.scepter}, + new UnitType[]{UnitTypes.bryde, UnitTypes.sei}, + new UnitType[]{UnitTypes.mega, UnitTypes.quad}, + new UnitType[]{UnitTypes.quasar, UnitTypes.vela} + ); }}; tetrativeReconstructor = new Reconstructor("tetrative-reconstructor"){{ - requirements(Category.units, with(Items.lead, 4000, Items.silicon, 1500, Items.thorium, 500, Items.plastanium, 450, Items.phasefabric, 600, Items.surgealloy, 500)); + requirements(Category.units, with(Items.lead, 4000, Items.silicon, 3000, Items.thorium, 1000, Items.plastanium, 600, Items.phasefabric, 600, Items.surgealloy, 800)); size = 9; consumes.power(25f); - consumes.items(with(Items.silicon, 350, Items.plastanium, 550, Items.surgealloy, 350, Items.phasefabric, 150)); + consumes.items(with(Items.silicon, 1000, Items.plastanium, 600, Items.surgealloy, 500, Items.phasefabric, 350)); consumes.liquid(Liquids.cryofluid, 3f); constructTime = 60f * 60f * 4; liquidCapacity = 180f; - upgrades = new UnitType[][]{ - {UnitTypes.antumbra, UnitTypes.eclipse}, - {UnitTypes.arkyid, UnitTypes.toxopid}, - {UnitTypes.scepter, UnitTypes.reign}, - }; + upgrades.addAll( + new UnitType[]{UnitTypes.antumbra, UnitTypes.eclipse}, + new UnitType[]{UnitTypes.arkyid, UnitTypes.toxopid}, + new UnitType[]{UnitTypes.scepter, UnitTypes.reign}, + new UnitType[] {UnitTypes.sei, UnitTypes.omura}, + new UnitType[]{UnitTypes.quad, UnitTypes.oct}, + new UnitType[]{UnitTypes.vela, UnitTypes.corvus} + ); }}; repairPoint = new RepairPoint("repair-point"){{ @@ -1818,6 +1930,8 @@ public class Blocks implements ContentList{ size = 2; range = 80f; + itemCapacity = 20; + ammoAmount = 5; consumes.item(Items.copper, 1); }}; @@ -1913,7 +2027,7 @@ public class Blocks implements ContentList{ logicProcessor = new LogicBlock("logic-processor"){{ requirements(Category.logic, with(Items.lead, 320, Items.silicon, 100, Items.graphite, 60, Items.thorium, 50)); - instructionsPerTick = 5; + instructionsPerTick = 8; range = 8 * 22; @@ -1933,18 +2047,33 @@ public class Blocks implements ContentList{ size = 3; }}; + memoryCell = new MemoryBlock("memory-cell"){{ + requirements(Category.logic, with(Items.graphite, 30, Items.silicon, 30)); + + memoryCapacity = 64; + }}; + + memoryBank = new MemoryBlock("memory-bank"){{ + requirements(Category.logic, with(Items.graphite, 80, Items.silicon, 80, Items.phasefabric, 30)); + + memoryCapacity = 512; + size = 2; + }}; + logicDisplay = new LogicDisplay("logic-display"){{ - requirements(Category.logic, with(Items.copper, 200, Items.lead, 120, Items.silicon, 100, Items.metaglass, 50)); + requirements(Category.logic, with(Items.lead, 100, Items.silicon, 50, Items.metaglass, 50)); displaySize = 80; size = 3; }}; - memoryCell = new MemoryBlock("memory-cell"){{ - requirements(Category.logic, with(Items.graphite, 40, Items.silicon, 40)); + largeLogicDisplay = new LogicDisplay("large-logic-display"){{ + requirements(Category.logic, with(Items.lead, 200, Items.silicon, 150, Items.metaglass, 100, Items.phasefabric, 75)); - memoryCapacity = 64; + displaySize = 176; + + size = 6; }}; //endregion diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index 7408f35da7..221dc44e8d 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -34,7 +34,7 @@ public class Bullets implements ContentList{ standardGlaive, standardDenseBig, standardThoriumBig, standardIncendiaryBig, //liquid - waterShot, cryoShot, slagShot, oilShot, + waterShot, cryoShot, slagShot, oilShot, heavyWaterShot, heavyCryoShot, heavySlagShot, heavyOilShot, //environment, misc. damageLightning, damageLightningGround, fireball, basicFlame, pyraFlame, driverBolt, healBullet, healBulletBig, frag; @@ -42,7 +42,7 @@ public class Bullets implements ContentList{ @Override public void load(){ - artilleryDense = new ArtilleryBulletType(3f, 12, "shell"){{ + artilleryDense = new ArtilleryBulletType(3f, 20, "shell"){{ hitEffect = Fx.flakExplosion; knockback = 0.8f; lifetime = 80f; @@ -63,7 +63,7 @@ public class Bullets implements ContentList{ collidesAir = false; }}; - artilleryPlastic = new ArtilleryBulletType(3.4f, 12, "shell"){{ + artilleryPlastic = new ArtilleryBulletType(3.4f, 20, "shell"){{ hitEffect = Fx.plasticExplosion; knockback = 1f; lifetime = 80f; @@ -77,7 +77,7 @@ public class Bullets implements ContentList{ frontColor = Pal.plastaniumFront; }}; - artilleryHoming = new ArtilleryBulletType(3f, 12, "shell"){{ + artilleryHoming = new ArtilleryBulletType(3f, 20, "shell"){{ hitEffect = Fx.flakExplosion; knockback = 0.8f; lifetime = 80f; @@ -91,7 +91,7 @@ public class Bullets implements ContentList{ homingRange = 50f; }}; - artilleryIncendiary = new ArtilleryBulletType(3f, 12, "shell"){{ + artilleryIncendiary = new ArtilleryBulletType(3f, 20, "shell"){{ hitEffect = Fx.blastExplosion; knockback = 0.8f; lifetime = 80f; @@ -105,7 +105,7 @@ public class Bullets implements ContentList{ trailEffect = Fx.incendTrail; }}; - artilleryExplosive = new ArtilleryBulletType(2f, 12, "shell"){{ + artilleryExplosive = new ArtilleryBulletType(2f, 20, "shell"){{ hitEffect = Fx.blastExplosion; knockback = 0.8f; lifetime = 80f; @@ -269,13 +269,13 @@ public class Bullets implements ContentList{ status = StatusEffects.burning; }}; - missileSurge = new MissileBulletType(3.7f, 20){{ + missileSurge = new MissileBulletType(3.7f, 18){{ width = 8f; height = 8f; shrinkY = 0f; drag = -0.01f; - splashDamageRadius = 28f; - splashDamage = 35f; + splashDamageRadius = 25f; + splashDamage = 25f; hitEffect = Fx.blastExplosion; despawnEffect = Fx.blastExplosion; lightning = 2; @@ -354,6 +354,8 @@ public class Bullets implements ContentList{ width = 16f; height = 23f; shootEffect = Fx.shootBig; + pierceCap = 2; + pierceBuilding = true; }}; standardIncendiaryBig = new BasicBulletType(7f, 60, "bullet"){{ @@ -363,6 +365,8 @@ public class Bullets implements ContentList{ backColor = Pal.lightOrange; status = StatusEffects.burning; shootEffect = Fx.shootBig; + pierceCap = 2; + pierceBuilding = true; }}; damageLightning = new BulletType(0.0001f, 0f){{ @@ -375,17 +379,22 @@ public class Bullets implements ContentList{ }}; //this is just a copy of the damage lightning bullet that doesn't damage air units - damageLightningGround = new BulletType(0.0001f, 0f){{ - collidesAir = false; - }}; + damageLightningGround = new BulletType(0.0001f, 0f){}; JsonIO.copy(damageLightning, damageLightningGround); + damageLightningGround.collidesAir = false; - healBullet = new HealBulletType(5.2f, 13){{ + healBullet = new LaserBoltBulletType(5.2f, 13){{ healPercent = 3f; + collidesTeam = true; + backColor = Pal.heal; + frontColor = Color.white; }}; - healBulletBig = new HealBulletType(5.2f, 15){{ + healBulletBig = new LaserBoltBulletType(5.2f, 15){{ healPercent = 5.5f; + collidesTeam = true; + backColor = Pal.heal; + frontColor = Color.white; }}; fireball = new BulletType(1f, 4){ @@ -433,6 +442,7 @@ public class Bullets implements ContentList{ hitSize = 7f; lifetime = 18f; pierce = true; + collidesAir = false; statusDuration = 60f * 4; shootEffect = Fx.shootSmallFlame; hitEffect = Fx.hitFlameSmall; @@ -447,6 +457,7 @@ public class Bullets implements ContentList{ hitSize = 7f; lifetime = 18f; pierce = true; + collidesAir = false; statusDuration = 60f * 6; shootEffect = Fx.shootPyraFlame; hitEffect = Fx.hitFlameSmall; @@ -472,6 +483,50 @@ public class Bullets implements ContentList{ drag = 0.03f; }}; + heavyWaterShot = new LiquidBulletType(Liquids.water){{ + lifetime = 49f; + speed = 4f; + knockback = 1.7f; + puddleSize = 8f; + drag = 0.001f; + ammoMultiplier = 2f; + statusDuration = 60f * 4f; + damage = 0.1f; + }}; + + heavyCryoShot = new LiquidBulletType(Liquids.cryofluid){{ + lifetime = 49f; + speed = 4f; + knockback = 1.3f; + puddleSize = 8f; + drag = 0.001f; + ammoMultiplier = 2f; + statusDuration = 60f * 4f; + damage = 0.1f; + }}; + + heavySlagShot = new LiquidBulletType(Liquids.slag){{ + lifetime = 49f; + speed = 4f; + knockback = 1.3f; + puddleSize = 8f; + damage = 6f; + drag = 0.001f; + ammoMultiplier = 2f; + statusDuration = 60f * 4f; + }}; + + heavyOilShot = new LiquidBulletType(Liquids.oil){{ + lifetime = 49f; + speed = 4f; + knockback = 1.3f; + puddleSize = 8f; + drag = 0.001f; + ammoMultiplier = 2f; + statusDuration = 60f * 4f; + damage = 0.1f; + }}; + driverBolt = new MassDriverBolt(); frag = new BasicBulletType(5f, 8, "bullet"){{ diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index f09b85b887..6ca6ccb24d 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -18,7 +18,7 @@ import static arc.graphics.g2d.Draw.rect; import static arc.graphics.g2d.Draw.*; import static arc.graphics.g2d.Lines.*; import static arc.math.Angles.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class Fx{ public static final Effect @@ -36,7 +36,7 @@ public class Fx{ TextureRegion region = unit.icon(Cicon.full); rect(region, e.x, e.y, - region.getWidth() * Draw.scl * scl, region.getHeight() * Draw.scl * scl, 180f); + region.width * Draw.scl * scl, region.height * Draw.scl * scl, 180f); }), @@ -138,14 +138,15 @@ public class Fx{ stroke(3f * e.fout()); color(e.color, Color.white, e.fin()); - beginLine(); - lines.each(Lines::linePoint); - linePoint(e.x, e.y); - endLine(); + for(int i = 0; i < lines.size - 1; i++){ + Vec2 cur = lines.get(i); + Vec2 next = lines.get(i + 1); + + Lines.line(cur.x, cur.y, next.x, next.y, false); + } - int i = 0; for(Vec2 p : lines){ - Fill.square(p.x, p.y, (5f - (float)i++ / lines.size * 2f) * e.fout(), 45); + Fill.circle(p.x, p.y, Lines.getStroke() / 2f); } }), @@ -290,6 +291,50 @@ public class Fx{ Lines.spikes(e.x, e.y, 1f + e.fin() * 6f, e.fout() * 4f, 6); }), + greenBomb = new Effect(40f, 100f, e -> { + color(Pal.heal); + stroke(e.fout() * 2f); + Lines.circle(e.x, e.y, 4f + e.finpow() * 65f); + + color(Pal.heal); + for(int i = 0; i < 4; i++){ + Drawf.tri(e.x, e.y, 6f, 100f * e.fout(), i*90); + } + + color(); + for(int i = 0; i < 4; i++){ + Drawf.tri(e.x, e.y, 3f, 35f * e.fout(), i*90); + } + }), + + greenLaserCharge = new Effect(80f, 100f, e -> { + color(Pal.heal); + stroke(e.fin() * 2f); + Lines.circle(e.x, e.y, 4f + e.fout() * 100f); + + Fill.circle(e.x, e.y, e.fin() * 20); + + randLenVectors(e.id, 20, 40f * e.fout(), (x, y) -> { + Fill.circle(e.x + x, e.y + y, e.fin() * 5f); + }); + + color(); + + Fill.circle(e.x, e.y, e.fin() * 10); + }), + + greenLaserChargeSmall = new Effect(40f, 100f, e -> { + color(Pal.heal); + stroke(e.fin() * 2f); + Lines.circle(e.x, e.y, e.fout() * 50f); + }), + + healWaveDynamic = new Effect(22, e -> { + color(Pal.heal); + stroke(e.fout() * 2f); + Lines.circle(e.x, e.y, 4f + e.finpow() * e.rotation); + }), + healWave = new Effect(22, e -> { color(Pal.heal); stroke(e.fout() * 2f); @@ -400,6 +445,90 @@ public class Fx{ }), + hitMeltHeal = new Effect(12, e -> { + color(Pal.heal); + stroke(e.fout() * 2f); + + randLenVectors(e.id, 6, e.finpow() * 18f, e.rotation, 360f, (x, y) -> { + float ang = Mathf.angle(x, y); + lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); + }); + + }), + + instBomb = new Effect(15f, 100f, e -> { + color(Pal.bulletYellowBack); + stroke(e.fout() * 4f); + Lines.circle(e.x, e.y, 4f + e.finpow() * 20f); + + for(int i = 0; i < 4; i++){ + Drawf.tri(e.x, e.y, 6f, 80f * e.fout(), i*90 + 45); + } + + color(); + for(int i = 0; i < 4; i++){ + Drawf.tri(e.x, e.y, 3f, 30f * e.fout(), i*90 + 45); + } + }), + + instTrail = new Effect(30, e -> { + for(int i = 0; i < 2; i++){ + color(i == 0 ? Pal.bulletYellowBack : Pal.bulletYellow); + + float m = i == 0 ? 1f : 0.5f; + + float rot = e.rotation + 180f; + float w = 15f * e.fout() * m; + Drawf.tri(e.x, e.y, w, (30f + Mathf.randomSeedRange(e.id, 15f)) * m, rot); + Drawf.tri(e.x, e.y, w, 10f * m, rot + 180f); + } + }), + + instShoot = new Effect(24f, e -> { + e.scaled(10f, b -> { + color(Color.white, Pal.bulletYellowBack, b.fin()); + stroke(b.fout() * 3f + 0.2f); + Lines.circle(b.x, b.y, b.fin() * 50f); + }); + + color(Pal.bulletYellowBack); + + for(int i : Mathf.signs){ + Drawf.tri(e.x, e.y, 13f * e.fout(), 85f, e.rotation + 90f * i); + Drawf.tri(e.x, e.y, 13f * e.fout(), 50f, e.rotation + 20f * i); + } + }), + + instHit = new Effect(20f, 200f, e -> { + color(Pal.bulletYellowBack); + + for(int i = 0; i < 2; i++){ + color(i == 0 ? Pal.bulletYellowBack : Pal.bulletYellow); + + float m = i == 0 ? 1f : 0.5f; + + for(int j = 0; j < 5; j++){ + float rot = e.rotation + Mathf.randomSeedRange(e.id + j, 50f); + float w = 23f * e.fout() * m; + Drawf.tri(e.x, e.y, w, (80f + Mathf.randomSeedRange(e.id + j, 40f)) * m, rot); + Drawf.tri(e.x, e.y, w, 20f * m, rot + 180f); + } + } + + e.scaled(10f, c -> { + color(Pal.bulletYellow); + stroke(c.fout() * 2f + 0.2f); + Lines.circle(e.x, e.y, c.fin() * 30f); + }); + + e.scaled(12f, c -> { + color(Pal.bulletYellowBack); + randLenVectors(e.id, 25, 5f + e.fin() * 80f, e.rotation, 60f, (x, y) -> { + Fill.square(e.x + x, e.y + y, c.fout() * 3f, 45f); + }); + }); + }), + hitLaser = new Effect(8, e -> { color(Color.white, Pal.heal, e.fin()); stroke(0.5f + e.fout()); @@ -686,6 +815,13 @@ public class Fx{ Fill.circle(e.x, e.y, e.fout() * 1f); }), + + muddy = new Effect(80f, e -> { + color(Color.valueOf("432722")); + alpha(Mathf.clamp(e.fin() * 2f)); + + Fill.circle(e.x, e.y, e.fout() * 1f); + }), sapped = new Effect(40f, e -> { color(Pal.sap); @@ -989,6 +1125,36 @@ public class Fx{ }).ground(400f), + railShoot = new Effect(24f, e -> { + e.scaled(10f, b -> { + color(Color.white, Color.lightGray, b.fin()); + stroke(b.fout() * 3f + 0.2f); + Lines.circle(b.x, b.y, b.fin() * 50f); + }); + + color(Pal.orangeSpark); + + for(int i : Mathf.signs){ + Drawf.tri(e.x, e.y, 13f * e.fout(), 85f, e.rotation + 90f * i); + } + }), + + railTrail = new Effect(16f, e -> { + color(Pal.orangeSpark); + + for(int i : Mathf.signs){ + Drawf.tri(e.x, e.y, 10f * e.fout(), 24f, e.rotation + 90 + 90f * i); + } + }), + + railHit = new Effect(18f, 200f, e -> { + color(Pal.orangeSpark); + + for(int i : Mathf.signs){ + Drawf.tri(e.x, e.y, 10f * e.fout(), 60f, e.rotation + 140f * i); + } + }), + lancerLaserShoot = new Effect(21f, e -> { color(Pal.lancerLaser); @@ -1000,7 +1166,7 @@ public class Fx{ lancerLaserShootSmoke = new Effect(26f, e -> { color(Color.white); - float length = e.data == null ? 70f : (Float)e.data; + float length = !(e.data instanceof Float) ? 70f : (Float)e.data; randLenVectors(e.id, 7, length, e.rotation, 0f, (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fout() * 9f); @@ -1070,6 +1236,15 @@ public class Fx{ }); }), + cloudsmoke = new Effect(70, e -> { + randLenVectors(e.id, 12, 15f + e.fin() * 45f, (x, y) -> { + float size = e.fslope() * 2f; + color(Color.gray); + alpha(e.fslope()); + Fill.circle(e.x + x, e.y + y, size); + }); + }), + nuclearcloud = new Effect(90, 200f, e -> { randLenVectors(e.id, 10, e.finpow() * 90f, (x, y) -> { float size = e.fout() * 14f; @@ -1166,6 +1341,14 @@ public class Fx{ Fill.square(e.x + x, e.y + y, 1f + e.fout() * 3f, 45); }); }), + + smokeCloud = new Effect(70, e -> { + randLenVectors(e.id, e.fin(), 30, 30f, (x, y, fin, fout) -> { + color(Color.gray); + alpha((0.5f - Math.abs(fin - 0.5f)) * 2f); + Fill.circle(e.x + x, e.y + y, 0.5f + fout * 4f); + }); + }), smeltsmoke = new Effect(15, e -> { randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> { @@ -1295,10 +1478,11 @@ public class Fx{ }), - //TODO fix false in constructor ripple = new Effect(30, e -> { + e.lifetime = 30f*e.rotation; + color(Tmp.c1.set(e.color).mul(1.5f)); - stroke(e.fout() + 0.4f); + stroke(e.fout() * 1.4f); Lines.circle(e.x, e.y, (2f + e.fin() * 4f) * e.rotation); }).ground(), diff --git a/core/src/mindustry/content/Liquids.java b/core/src/mindustry/content/Liquids.java index aaced53394..91b7186f6b 100644 --- a/core/src/mindustry/content/Liquids.java +++ b/core/src/mindustry/content/Liquids.java @@ -1,8 +1,8 @@ package mindustry.content; -import arc.graphics.Color; -import mindustry.ctype.ContentList; -import mindustry.type.Liquid; +import arc.graphics.*; +import mindustry.ctype.*; +import mindustry.type.*; public class Liquids implements ContentList{ public static Liquid water, slag, oil, cryofluid; diff --git a/core/src/mindustry/content/StatusEffects.java b/core/src/mindustry/content/StatusEffects.java index 06480d9dd6..4cdfadec76 100644 --- a/core/src/mindustry/content/StatusEffects.java +++ b/core/src/mindustry/content/StatusEffects.java @@ -2,14 +2,15 @@ package mindustry.content; import arc.*; import arc.graphics.*; -import arc.math.Mathf; -import mindustry.ctype.ContentList; +import arc.math.*; +import mindustry.ctype.*; import mindustry.game.EventType.*; -import mindustry.type.StatusEffect; +import mindustry.type.*; + import static mindustry.Vars.*; public class StatusEffects implements ContentList{ - public static StatusEffect none, burning, freezing, wet, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed; + public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed; @Override public void load(){ @@ -32,7 +33,7 @@ public class StatusEffects implements ContentList{ freezing = new StatusEffect("freezing"){{ speedMultiplier = 0.6f; - armorMultiplier = 0.8f; + healthMultiplier = 0.8f; effect = Fx.freezing; init(() -> { @@ -45,6 +46,14 @@ public class StatusEffects implements ContentList{ }); }}; + unmoving = new StatusEffect("unmoving"){{ + speedMultiplier = 0.001f; + }}; + + slow = new StatusEffect("slow"){{ + speedMultiplier = 0.4f; + }}; + wet = new StatusEffect("wet"){{ color = Color.royal; speedMultiplier = 0.94f; @@ -53,7 +62,7 @@ public class StatusEffects implements ContentList{ init(() -> { trans(shocked, ((unit, time, newTime, result) -> { - unit.damagePierce(20f); + unit.damagePierce(14f); if(unit.team() == state.rules.waveTeam){ Events.fire(Trigger.shock); } @@ -62,10 +71,17 @@ public class StatusEffects implements ContentList{ opposite(burning); }); }}; + + muddy = new StatusEffect("muddy"){{ + color = Color.valueOf("46382a"); + speedMultiplier = 0.94f; + effect = Fx.muddy; + effectChance = 0.09f; + }}; melting = new StatusEffect("melting"){{ speedMultiplier = 0.8f; - armorMultiplier = 0.8f; + healthMultiplier = 0.8f; damage = 0.3f; effect = Fx.melting; @@ -77,7 +93,7 @@ public class StatusEffects implements ContentList{ sapped = new StatusEffect("sapped"){{ speedMultiplier = 0.7f; - armorMultiplier = 0.8f; + healthMultiplier = 0.8f; effect = Fx.sapped; effectChance = 0.1f; }}; @@ -99,7 +115,7 @@ public class StatusEffects implements ContentList{ }}; overdrive = new StatusEffect("overdrive"){{ - armorMultiplier = 0.95f; + healthMultiplier = 0.95f; speedMultiplier = 1.15f; damageMultiplier = 1.4f; damage = -0.01f; @@ -116,13 +132,13 @@ public class StatusEffects implements ContentList{ }}; shielded = new StatusEffect("shielded"){{ - armorMultiplier = 3f; + healthMultiplier = 3f; }}; boss = new StatusEffect("boss"){{ permanent = true; - damageMultiplier = 1.5f; - armorMultiplier = 1.5f; + damageMultiplier = 2f; + healthMultiplier = 2f; }}; shocked = new StatusEffect("shocked"); diff --git a/core/src/mindustry/content/TechTree.java b/core/src/mindustry/content/TechTree.java index 38e67d0b4e..e9aa178388 100644 --- a/core/src/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -1,23 +1,21 @@ package mindustry.content; import arc.*; -import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; -import mindustry.core.*; +import arc.util.*; import mindustry.ctype.*; import mindustry.game.Objectives.*; import mindustry.type.*; -import mindustry.world.*; import static mindustry.content.Blocks.*; -import static mindustry.content.SectorPresets.*; import static mindustry.content.SectorPresets.craters; +import static mindustry.content.SectorPresets.*; import static mindustry.content.UnitTypes.*; import static mindustry.type.ItemStack.*; public class TechTree implements ContentList{ static ObjectMap map = new ObjectMap<>(); + static TechNode context = null; public static Seq all; public static TechNode root; @@ -112,6 +110,7 @@ public class TechTree implements ContentList{ node(Items.coal, with(Items.lead, 3000), () -> { node(Items.graphite, with(Items.coal, 1000), () -> { + node(graphitePress, () -> { node(Items.titanium, with(Items.graphite, 6000, Items.copper, 10000, Items.lead, 10000), () -> { node(pneumaticDrill, () -> { @@ -208,11 +207,15 @@ public class TechTree implements ContentList{ node(switchBlock, () -> { node(message, () -> { node(logicDisplay, () -> { + node(largeLogicDisplay, () -> { + }); }); node(memoryCell, () -> { + node(memoryBank, () -> { + }); }); }); @@ -225,6 +228,9 @@ public class TechTree implements ContentList{ }); }); }); + + node(illuminator, () -> { + }); }); }); @@ -261,10 +267,10 @@ public class TechTree implements ContentList{ }); }); - node(turbineGenerator, () -> { + node(steamGenerator, () -> { node(thermalGenerator, () -> { node(differentialGenerator, () -> { - node(thoriumReactor, () -> { + node(thoriumReactor, Seq.with(new Research(Liquids.cryofluid)), () -> { node(impactReactor, () -> { }); @@ -343,11 +349,17 @@ public class TechTree implements ContentList{ }); }); + + node(tsunami, () -> { + + }); }); node(lancer, () -> { - node(meltdown, () -> { + node(foreshadow, () -> { + node(meltdown, () -> { + }); }); node(shockMine, () -> { @@ -366,14 +378,22 @@ public class TechTree implements ContentList{ node(dagger, () -> { node(mace, () -> { node(fortress, () -> { + node(scepter, () -> { + node(reign, () -> { + }); + }); }); }); node(nova, () -> { node(pulsar, () -> { node(quasar, () -> { + node(vela, () -> { + node(corvus, () -> { + }); + }); }); }); }); @@ -381,7 +401,11 @@ public class TechTree implements ContentList{ node(crawler, () -> { node(atrax, () -> { node(spiroct, () -> { + node(arkyid, () -> { + node(toxopid, () -> { + }); + }); }); }); }); @@ -402,7 +426,11 @@ public class TechTree implements ContentList{ node(mono, () -> { node(poly, () -> { node(mega, () -> { + node(quad, () -> { + node(oct, () -> { + }); + }); }); }); }); @@ -412,7 +440,11 @@ public class TechTree implements ContentList{ node(risso, () -> { node(minke, () -> { node(bryde, () -> { + node(sei, () -> { + node(omura, () -> { + }); + }); }); }); }); @@ -490,7 +522,7 @@ public class TechTree implements ContentList{ new SectorComplete(frozenForest), new Research(pneumaticDrill), new Research(powerNode), - new Research(turbineGenerator) + new Research(steamGenerator) ), () -> { node(fungalPass, Seq.with( new SectorComplete(stainedMountains), @@ -512,51 +544,47 @@ public class TechTree implements ContentList{ }); } - private static void setup(){ - TechNode.context = null; + public static void setup(){ + context = null; map = new ObjectMap<>(); all = new Seq<>(); } - private static TechNode node(UnlockableContent content, Runnable children){ - ItemStack[] requirements; + //all the "node" methods are hidden, because they are for internal context-dependent use only + //for custom research, just use the TechNode constructor - if(content instanceof Block){ - Block block = (Block)content; + static TechNode node(UnlockableContent content, Runnable children){ + return node(content, content.researchRequirements(), children); + } - requirements = new ItemStack[block.requirements.length]; - for(int i = 0; i < requirements.length; i++){ - int quantity = 40 + Mathf.round(Mathf.pow(block.requirements[i].amount, 1.25f) * 20, 10); + static TechNode node(UnlockableContent content, ItemStack[] requirements, Runnable children){ + return node(content, requirements, null, children); + } - requirements[i] = new ItemStack(block.requirements[i].item, UI.roundAmount(quantity)); - } - }else{ - requirements = ItemStack.empty; + static TechNode node(UnlockableContent content, ItemStack[] requirements, Seq objectives, Runnable children){ + TechNode node = new TechNode(context, content, requirements); + if(objectives != null){ + node.objectives = objectives; } - return node(content, requirements, children); - } + TechNode prev = context; + context = node; + children.run(); + context = prev; - private static TechNode node(UnlockableContent content, ItemStack[] requirements, Runnable children){ - return new TechNode(content, requirements, children); - } - - private static TechNode node(UnlockableContent content, Seq objectives, Runnable children){ - TechNode node = new TechNode(content, empty, children); - node.objectives = objectives; return node; } - private static TechNode node(UnlockableContent block){ + static TechNode node(UnlockableContent content, Seq objectives, Runnable children){ + return node(content, content.researchRequirements(), objectives, children); + } + + static TechNode node(UnlockableContent block){ return node(block, () -> {}); } - public static TechNode create(UnlockableContent parent, UnlockableContent block){ - TechNode.context = all.find(t -> t.content == parent); - return node(block, () -> {}); - } - - public static @Nullable TechNode get(UnlockableContent content){ + @Nullable + public static TechNode get(UnlockableContent content){ return map.get(content); } @@ -565,8 +593,6 @@ public class TechTree implements ContentList{ } public static class TechNode{ - static TechNode context; - /** Depth in tech tree. */ public int depth; /** Requirement node. */ @@ -584,10 +610,10 @@ public class TechTree implements ContentList{ /** Nodes that depend on this node. */ public final Seq children = new Seq<>(); - TechNode(@Nullable TechNode ccontext, UnlockableContent content, ItemStack[] requirements, Runnable children){ - if(ccontext != null) ccontext.children.add(this); + public TechNode(@Nullable TechNode parent, UnlockableContent content, ItemStack[] requirements){ + if(parent != null) parent.children.add(this); - this.parent = ccontext; + this.parent = parent; this.content = content; this.requirements = requirements; this.depth = parent == null ? 0 : parent.depth + 1; @@ -603,14 +629,15 @@ public class TechTree implements ContentList{ content.getDependencies(d -> objectives.add(new Research(d))); map.put(content, this); - context = this; - children.run(); - context = ccontext; all.add(this); } - TechNode(UnlockableContent content, ItemStack[] requirements, Runnable children){ - this(context, content, requirements, children); + /** Removes this node from the tech tree. */ + public void remove(){ + all.remove(this); + if(parent != null){ + parent.children.remove(this); + } } /** Flushes research progress to settings. */ diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 0666abfe9e..9a1b851118 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -11,20 +11,22 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import static mindustry.Vars.*; + public class UnitTypes implements ContentList{ //region definitions - //ground + //mech public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, scepter, reign; - //ground + builder - public static @EntityDef({Unitc.class, Mechc.class, Builderc.class}) UnitType nova; + //mech + builder + miner + public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class}) UnitType nova, pulsar, quasar; - //ground + builder + miner + commander - public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class, Commanderc.class}) UnitType pulsar, quasar; + //mech + public static @EntityDef({Unitc.class, Mechc.class}) UnitType vela; //legs - public static @EntityDef({Unitc.class, Legsc.class}) UnitType atrax; + public static @EntityDef({Unitc.class, Legsc.class}) UnitType corvus, atrax; //legs + building public static @EntityDef({Unitc.class, Legsc.class, Builderc.class}) UnitType spiroct, arkyid, toxopid; @@ -41,11 +43,17 @@ public class UnitTypes implements ContentList{ //air + building + mining + payload public static @EntityDef({Unitc.class, Builderc.class, Minerc.class, Payloadc.class}) UnitType mega; + //air + building + payload + public static @EntityDef({Unitc.class, Builderc.class, Payloadc.class}) UnitType quad; + + //air + building + payload + public static @EntityDef({Unitc.class, Builderc.class, Payloadc.class, AmmoDistributec.class}) UnitType oct; + //air + building + mining public static @EntityDef({Unitc.class, Builderc.class, Minerc.class}) UnitType alpha, beta, gamma; //water - public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType risso, minke, bryde; + public static @EntityDef({Unitc.class, WaterMovec.class}) UnitType risso, minke, bryde, sei, omura; //special block unit type public static @EntityDef({Unitc.class, BlockUnitc.class}) UnitType block; @@ -58,12 +66,13 @@ public class UnitTypes implements ContentList{ dagger = new UnitType("dagger"){{ speed = 0.5f; - hitsize = 8f; + hitSize = 8f; health = 140; weapons.add(new Weapon("large-weapon"){{ reload = 14f; x = 4f; y = 2f; + top = false; ejectEffect = Fx.shellEjectSmall; bullet = Bullets.standardCopper; }}); @@ -71,13 +80,14 @@ public class UnitTypes implements ContentList{ mace = new UnitType("mace"){{ speed = 0.4f; - hitsize = 9f; + hitSize = 9f; health = 500; armor = 4f; immunities.add(StatusEffects.burning); weapons.add(new Weapon("flamethrower"){{ + top = false; shootSound = Sounds.flame; shootY = 2f; reload = 14f; @@ -101,13 +111,15 @@ public class UnitTypes implements ContentList{ fortress = new UnitType("fortress"){{ speed = 0.38f; - hitsize = 13f; + hitSize = 13f; rotateSpeed = 3f; targetAir = false; health = 790; armor = 9f; + mechFrontSway = 0.55f; weapons.add(new Weapon("artillery"){{ + top = false; y = 1f; x = 9f; reload = 60f; @@ -132,20 +144,24 @@ public class UnitTypes implements ContentList{ scepter = new UnitType("scepter"){{ speed = 0.35f; - hitsize = 20f; + hitSize = 20f; rotateSpeed = 2.1f; - targetAir = false; health = 9000; armor = 11f; - mechLegMoveScl = 1.3f; canDrown = false; + mechFrontSway = 1f; + + mechStepParticles = true; + mechStepShake = 0.15f; + singleTarget = true; weapons.add( new Weapon("scepter-weapon"){{ + top = false; y = 1f; x = 16f; shootY = 8f; - reload = 50f; + reload = 45f; recoil = 5f; shake = 2f; ejectEffect = Fx.shellEjectBig; @@ -154,7 +170,7 @@ public class UnitTypes implements ContentList{ inaccuracy = 3f; shotDelay = 4f; - bullet = new BasicBulletType(7f, 40){{ + bullet = new BasicBulletType(7f, 50){{ width = 11f; height = 20f; lifetime = 25f; @@ -163,7 +179,7 @@ public class UnitTypes implements ContentList{ lightningLength = 6; lightningColor = Pal.surge; //standard bullet damage is far too much for lightning - lightningDamage = 17; + lightningDamage = 30; }}; }}, @@ -189,29 +205,33 @@ public class UnitTypes implements ContentList{ reign = new UnitType("reign"){{ speed = 0.35f; - hitsize = 26f; + hitSize = 26f; rotateSpeed = 1.65f; - targetAir = false; health = 24000; armor = 14f; - mechLegMoveScl = 1.75f; + mechStepParticles = true; + mechStepShake = 0.75f; canDrown = false; + mechFrontSway = 1.9f; + mechSideSway = 0.6f; weapons.add( new Weapon("reign-weapon"){{ + top = false; y = 1f; x = 21.5f; shootY = 11f; reload = 9f; recoil = 5f; - shake = 4f; + shake = 2f; ejectEffect = Fx.shellEjectBig; shootSound = Sounds.artillery; - bullet = new BasicBulletType(13f, 55){{ + bullet = new BasicBulletType(13f, 60){{ pierce = true; + pierceCap = 10; width = 14f; - height = 32f; + height = 33f; lifetime = 15f; shootEffect = Fx.shootBig; fragVelocityMin = 0.4f; @@ -228,6 +248,8 @@ public class UnitTypes implements ContentList{ width = 10f; height = 10f; pierce = true; + pierceBuilding = true; + pierceCap = 3; lifetime = 20f; hitEffect = Fx.flakExplosion; @@ -244,18 +266,20 @@ public class UnitTypes implements ContentList{ //region ground support nova = new UnitType("nova"){{ - itemCapacity = 60; canBoost = true; boostMultiplier = 1.5f; - speed = 0.52f; - hitsize = 8f; + speed = 0.55f; + hitSize = 8f; health = 110f; buildSpeed = 0.8f; armor = 1f; + commandLimit = 8; abilities.add(new HealFieldAbility(10f, 60f * 4, 60f)); + ammoType = AmmoTypes.power; weapons.add(new Weapon("heal-weapon"){{ + top = false; shootY = 2f; reload = 24f; x = 4.5f; @@ -268,12 +292,11 @@ public class UnitTypes implements ContentList{ }}; pulsar = new UnitType("pulsar"){{ - itemCapacity = 60; canBoost = true; - boostMultiplier = 1.5f; - speed = 0.48f; - hitsize = 10f; - health = 320f; + boostMultiplier = 1.6f; + speed = 0.7f; + hitSize = 10f; + health = 300f; buildSpeed = 0.9f; armor = 4f; @@ -282,8 +305,10 @@ public class UnitTypes implements ContentList{ commandLimit = 8; abilities.add(new ShieldFieldAbility(20f, 40f, 60f * 5, 60f)); + ammoType = AmmoTypes.power; weapons.add(new Weapon("heal-shotgun-weapon"){{ + top = false; x = 5f; shake = 2.2f; y = 0.5f; @@ -310,26 +335,29 @@ public class UnitTypes implements ContentList{ }}; quasar = new UnitType("quasar"){{ - mineTier = 1; - hitsize = 12f; + mineTier = 3; + hitSize = 12f; boostMultiplier = 2f; - itemCapacity = 80; health = 650f; buildSpeed = 1.7f; canBoost = true; armor = 9f; landShake = 2f; - speed = 0.4f; - hitsize = 10f; + commandLimit = 10; + mechFrontSway = 0.55f; + ammoType = AmmoTypes.power; - mineTier = 2; - mineSpeed = 7f; + speed = 0.4f; + hitSize = 10f; + + mineSpeed = 6f; drawShields = false; abilities.add(new ForceFieldAbility(60f, 0.3f, 400f, 60f * 6)); weapons.add(new Weapon("beam-weapon"){{ + top = false; shake = 2f; shootY = 4f; x = 6.5f; @@ -348,16 +376,148 @@ public class UnitTypes implements ContentList{ }}); }}; + vela = new UnitType("vela"){{ + hitSize = 23f; + + rotateSpeed = 1.6f; + canDrown = false; + mechFrontSway = 1f; + + mechStepParticles = true; + mechStepShake = 0.15f; + ammoType = AmmoTypes.powerHigh; + + speed = 0.35f; + boostMultiplier = 2.1f; + engineOffset = 12f; + engineSize = 6f; + lowAltitude = true; + + health = 7000f; + armor = 7f; + canBoost = true; + landShake = 4f; + + commandLimit = 8; + + weapons.add(new Weapon("vela-weapon"){{ + mirror = false; + top = false; + shake = 4f; + shootY = 13f; + x = y = 0f; + + firstShotDelay = Fx.greenLaserChargeSmall.lifetime - 1f; + + reload = 320f; + recoil = 0f; + shootSound = Sounds.laser; + continuous = true; + cooldownTime = 200f; + + bullet = new ContinuousLaserBulletType(20){{ + length = 150f; + hitEffect = Fx.hitMeltHeal; + drawSize = 420f; + lifetime = 160f; + shake = 1f; + despawnEffect = Fx.smokeCloud; + smokeEffect = Fx.none; + + shootEffect = Fx.greenLaserChargeSmall; + + incendChance = 0.05f; + incendSpread = 5f; + incendAmount = 1; + + colors = new Color[]{Pal.heal.cpy().a(.2f), Pal.heal.cpy().a(.5f), Pal.heal.cpy().mul(1.2f), Color.white}; + }}; + + shootStatus = StatusEffects.slow; + shootStatusDuration = bullet.lifetime + firstShotDelay; + }}); + }}; + + corvus = new UnitType("corvus"){{ + mineTier = 1; + hitSize = 29f; + health = 18000f; + buildSpeed = 1.7f; + armor = 9f; + landShake = 1.5f; + rotateSpeed = 1.5f; + + commandLimit = 8; + + legCount = 4; + legLength = 14f; + legBaseOffset = 11f; + legMoveSpace = 1.5f; + legTrns = 0.58f; + hovering = true; + visualElevation = 0.2f; + allowLegStep = true; + ammoType = AmmoTypes.powerHigh; + groundLayer = Layer.legUnit; + + speed = 0.3f; + + mineTier = 2; + mineSpeed = 7f; + drawShields = false; + + weapons.add(new Weapon("corvus-weapon"){{ + top = false; + mirror = false; + shake = 14f; + shootY = 5f; + x = y = 0; + reload = 350f; + recoil = 0f; + shootSound = Sounds.laser; + + cooldownTime = 350f; + + shootStatusDuration = 60f * 2f; + shootStatus = StatusEffects.unmoving; + firstShotDelay = Fx.greenLaserCharge.lifetime; + + bullet = new LaserBulletType(){{ + length = 460f; + damage = 550f; + width = 75f; + + lifetime = 65f; + + lightningSpacing = 35f; + lightningLength = 5; + lightningDelay = 1.1f; + lightningLengthRand = 15; + lightningDamage = 50; + lightningAngleRand = 40f; + largeHit = true; + lightColor = lightningColor = Pal.heal; + + shootEffect = Fx.greenLaserCharge; + + sideAngle = 15f; + sideWidth = 0f; + sideLength = 0f; + colors = new Color[]{Pal.heal.cpy().a(0.4f), Pal.heal, Color.white}; + }}; + }}); + }}; + //endregion //region ground legs crawler = new UnitType("crawler"){{ defaultController = SuicideAI::new; - speed = 0.85f; - hitsize = 8f; - health = 170; - sway = 0.25f; + speed = 1f; + hitSize = 8f; + health = 180; + mechSideSway = 0.25f; range = 40f; weapons.add(new Weapon(){{ @@ -369,9 +529,9 @@ public class UnitTypes implements ContentList{ hitEffect = Fx.pulverize; lifetime = 10f; speed = 1f; - splashDamageRadius = 55f; + splashDamageRadius = 70f; instantDisappear = true; - splashDamage = 45f; + splashDamage = 80f; killShooter = true; hittable = false; collidesAir = true; @@ -380,14 +540,14 @@ public class UnitTypes implements ContentList{ }}; atrax = new UnitType("atrax"){{ - itemCapacity = 80; speed = 0.5f; drag = 0.4f; - hitsize = 10f; + hitSize = 10f; rotateSpeed = 3f; targetAir = false; health = 600; immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting); + legCount = 4; legLength = 9f; legTrns = 0.6f; @@ -400,6 +560,7 @@ public class UnitTypes implements ContentList{ groundLayer = Layer.legUnit - 1f; weapons.add(new Weapon("eruption"){{ + top = false; shootY = 3f; reload = 10f; ejectEffect = Fx.none; @@ -419,10 +580,9 @@ public class UnitTypes implements ContentList{ }}; spiroct = new UnitType("spiroct"){{ - itemCapacity = 200; speed = 0.4f; drag = 0.4f; - hitsize = 12f; + hitSize = 12f; rotateSpeed = 3f; health = 760; immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting); @@ -433,6 +593,7 @@ public class UnitTypes implements ContentList{ legBaseOffset = 2f; hovering = true; armor = 5f; + ammoType = AmmoTypes.power; buildSpeed = 0.75f; @@ -487,7 +648,7 @@ public class UnitTypes implements ContentList{ arkyid = new UnitType("arkyid"){{ drag = 0.1f; speed = 0.5f; - hitsize = 21f; + hitSize = 21f; health = 8000; armor = 6f; @@ -504,6 +665,7 @@ public class UnitTypes implements ContentList{ legLengthScl = 0.96f; rippleScale = 2f; legSpeed = 0.2f; + ammoType = AmmoTypes.power; legSplashDamage = 32; legSplashRange = 30; @@ -585,9 +747,9 @@ public class UnitTypes implements ContentList{ toxopid = new UnitType("toxopid"){{ drag = 0.1f; speed = 0.5f; - hitsize = 21f; - health = 23000; - armor = 14f; + hitSize = 21f; + health = 22000; + armor = 13f; rotateSpeed = 1.9f; @@ -602,6 +764,7 @@ public class UnitTypes implements ContentList{ legLengthScl = 0.93f; rippleScale = 3f; legSpeed = 0.19f; + ammoType = AmmoTypes.powerHigh; legSplashDamage = 80; legSplashRange = 60; @@ -647,7 +810,7 @@ public class UnitTypes implements ContentList{ x = 0f; shootY = 22f; mirror = false; - reload = 180; + reload = 210; shake = 10f; recoil = 10f; rotateSpeed = 1f; @@ -656,15 +819,15 @@ public class UnitTypes implements ContentList{ rotate = true; occlusion = 30f; - bullet = new ArtilleryBulletType(3f, 70){{ + bullet = new ArtilleryBulletType(3f, 50){{ hitEffect = Fx.sapExplosion; knockback = 0.8f; lifetime = 80f; width = height = 25f; collidesTiles = collides = true; ammoMultiplier = 4f; - splashDamageRadius = 95f; - splashDamage = 90f; + splashDamageRadius = 90f; + splashDamage = 75f; backColor = Pal.sapBulletBack; frontColor = lightningColor = Pal.sapBullet; lightning = 5; @@ -684,8 +847,8 @@ public class UnitTypes implements ContentList{ lifetime = 90f; width = height = 20f; collidesTiles = false; - splashDamageRadius = 90f; - splashDamage = 45f; + splashDamageRadius = 80f; + splashDamage = 40f; backColor = Pal.sapBulletBack; frontColor = lightningColor = Pal.sapBullet; lightning = 2; @@ -712,12 +875,11 @@ public class UnitTypes implements ContentList{ faceTarget = false; engineOffset = 5.5f; range = 140f; - crashDamageMultiplier = 4f; weapons.add(new Weapon(){{ y = 0f; x = 2f; - reload = 15f; + reload = 13f; ejectEffect = Fx.shellEjectSmall; bullet = Bullets.standardCopper; shootSound = Sounds.shoot; @@ -730,6 +892,7 @@ public class UnitTypes implements ContentList{ accel = 0.08f; drag = 0.016f; flying = true; + hitSize = 9f; targetAir = false; engineOffset = 7.8f; range = 140f; @@ -766,7 +929,7 @@ public class UnitTypes implements ContentList{ drag = 0.016f; flying = true; range = 140f; - hitsize = 18f; + hitSize = 20f; lowAltitude = true; armor = 5f; @@ -804,9 +967,9 @@ public class UnitTypes implements ContentList{ }}; antumbra = new UnitType("antumbra"){{ - speed = 1.13f; - accel = 0.035f; - drag = 0.05f; + speed = 0.8f; + accel = 0.04f; + drag = 0.04f; rotateSpeed = 1.9f; flying = true; lowAltitude = true; @@ -814,7 +977,7 @@ public class UnitTypes implements ContentList{ armor = 9f; engineOffset = 21; engineSize = 5.3f; - hitsize = 56f; + hitSize = 56f; BulletType missiles = new MissileBulletType(2.7f, 10){{ width = 8f; @@ -877,16 +1040,16 @@ public class UnitTypes implements ContentList{ }}; eclipse = new UnitType("eclipse"){{ - speed = 1.09f; - accel = 0.02f; - drag = 0.05f; + speed = 0.52f; + accel = 0.04f; + drag = 0.04f; rotateSpeed = 1f; flying = true; lowAltitude = true; health = 20000; engineOffset = 38; engineSize = 7.3f; - hitsize = 58f; + hitSize = 58f; destructibleWreck = false; armor = 13f; @@ -965,10 +1128,11 @@ public class UnitTypes implements ContentList{ health = 100; engineSize = 1.8f; engineOffset = 5.7f; - itemCapacity = 30; range = 50f; isCounted = false; + ammoType = AmmoTypes.powerLow; + mineTier = 1; mineSpeed = 2.5f; }}; @@ -981,21 +1145,23 @@ public class UnitTypes implements ContentList{ speed = 1.9f; rotateSpeed = 15f; accel = 0.1f; - range = 70f; - itemCapacity = 70; + range = 130f; health = 400; buildSpeed = 0.5f; engineOffset = 6.5f; - hitsize = 8f; + hitSize = 8f; lowAltitude = true; isCounted = false; + ammoType = AmmoTypes.power; + mineTier = 2; mineSpeed = 3.5f; abilities.add(new HealFieldAbility(5f, 60f * 5, 50f)); weapons.add(new Weapon("heal-weapon-mount"){{ + top = false; y = -2.5f; x = 3.5f; reload = 30f; @@ -1015,8 +1181,11 @@ public class UnitTypes implements ContentList{ keepVelocity = false; shootEffect = Fx.shootHeal; smokeEffect = Fx.hitLaser; + hitEffect = despawnEffect = Fx.hitLaser; frontColor = Color.white; + healPercent = 5.5f; + collidesTeam = true; backColor = Pal.heal; trailColor = Pal.heal; }}; @@ -1024,8 +1193,12 @@ public class UnitTypes implements ContentList{ }}; mega = new UnitType("mega"){{ + defaultController = RepairAI::new; + mineTier = 3; health = 500; + armor = 2f; + armor = 5f; speed = 1.8f; accel = 0.06f; drag = 0.017f; @@ -1033,9 +1206,12 @@ public class UnitTypes implements ContentList{ flying = true; engineOffset = 10.5f; rotateShooting = false; - hitsize = 15f; + hitSize = 15f; engineSize = 3f; - payloadCapacity = 4 * (8 * 8); + payloadCapacity = (2 * 2) * tilePayload; + buildSpeed = 2.5f; + + ammoType = AmmoTypes.power; weapons.add( new Weapon("heal-weapon-mount"){{ @@ -1054,17 +1230,104 @@ public class UnitTypes implements ContentList{ }}); }}; + quad = new UnitType("quad"){{ + armor = 8f; + health = 6000; + speed = 1.2f; + rotateSpeed = 2f; + accel = 0.05f; + drag = 0.017f; + lowAltitude = false; + flying = true; + engineOffset = 12f; + engineSize = 6f; + rotateShooting = false; + hitSize = 32f; + payloadCapacity = (3 * 3) * tilePayload; + buildSpeed = 2.5f; + range = 140f; + targetAir = false; + + ammoType = AmmoTypes.powerHigh; + + weapons.add( + new Weapon(){{ + x = y = 0f; + mirror = false; + reload = 55f; + minShootVelocity = 0.01f; + + bullet = new BasicBulletType(){{ + sprite = "large-bomb"; + width = height = 120/4f; + + range = 30f; + ignoreRotation = true; + + backColor = Pal.heal; + frontColor = Color.white; + mixColorTo = Color.white; + + shootCone = 180f; + ejectEffect = Fx.none; + shootSound = Sounds.none; + despawnShake = 4f; + + collidesAir = false; + + lifetime = 70f; + + despawnEffect = Fx.greenBomb; + hitEffect = Fx.massiveExplosion; + keepVelocity = false; + spin = 2f; + + shrinkX = shrinkY = 0.7f; + + speed = 0.001f; + collides = false; + + healPercent = 15f; + splashDamage = 320f; + splashDamageRadius = 120f; + }}; + }}); + }}; + + oct = new UnitType("oct"){{ + armor = 16f; + health = 24000; + speed = 0.6f; + rotateSpeed = 1f; + accel = 0.04f; + drag = 0.018f; + flying = true; + engineOffset = 46f; + engineSize = 7.8f; + rotateShooting = false; + hitSize = 60f; + payloadCapacity = (5.3f * 5.3f) * tilePayload; + buildSpeed = 4f; + drawShields = false; + commandLimit = 6; + lowAltitude = true; + + ammoCapacity = 1300; + ammoResupplyAmount = 20; + + abilities.add(new ForceFieldAbility(140f, 4f, 7000f, 60f * 8), new HealFieldAbility(130f, 60f * 2, 140f)); + }}; + //endregion //region naval attack risso = new UnitType("risso"){{ speed = 1.1f; drag = 0.13f; - hitsize = 9f; + hitSize = 9f; health = 280; accel = 0.4f; rotateSpeed = 3.3f; - immunities = ObjectSet.with(StatusEffects.wet); trailLength = 20; rotateShooting = false; @@ -1112,17 +1375,16 @@ public class UnitTypes implements ContentList{ health = 600; speed = 0.9f; drag = 0.15f; - hitsize = 11f; + hitSize = 11f; armor = 4f; accel = 0.3f; rotateSpeed = 2.6f; - immunities = ObjectSet.with(StatusEffects.wet); + rotateShooting = false; trailLength = 20; trailX = 5.5f; trailY = -4f; trailScl = 1.9f; - rotateShooting = false; abilities.add(new StatusFieldAbility(StatusEffects.overclock, 60f * 6, 60f * 6f, 60f)); @@ -1156,9 +1418,8 @@ public class UnitTypes implements ContentList{ accel = 0.2f; rotateSpeed = 1.8f; drag = 0.17f; - hitsize = 14f; - armor = 6f; - immunities = ObjectSet.with(StatusEffects.wet); + hitSize = 16f; + armor = 7f; rotateShooting = false; trailLength = 22; @@ -1166,7 +1427,7 @@ public class UnitTypes implements ContentList{ trailY = -9f; trailScl = 1.5f; - abilities.add(new HealFieldAbility(22f, 60f * 4, 70f), new ShieldFieldAbility(20f, 40f, 60f * 4, 60f)); + abilities.add(new ShieldFieldAbility(20f, 40f, 60f * 4, 60f)); weapons.add(new Weapon("large-artillery"){{ reload = 65f; @@ -1178,7 +1439,7 @@ public class UnitTypes implements ContentList{ shootY = 7f; shake = 5f; recoil = 4f; - occlusion = 17f; + occlusion = 12f; shots = 1; inaccuracy = 3f; @@ -1244,6 +1505,140 @@ public class UnitTypes implements ContentList{ }}); }}; + sei = new UnitType("sei"){{ + health = 10000; + armor = 12f; + + speed = 0.73f; + drag = 0.17f; + hitSize = 39f; + accel = 0.2f; + rotateSpeed = 1.3f; + rotateShooting = false; + + trailLength = 50; + trailX = 18f; + trailY = -21f; + trailScl = 3f; + + weapons.add(new Weapon("sei-launcher"){{ + + x = 0f; + y = 0f; + rotate = true; + rotateSpeed = 4f; + mirror = false; + + occlusion = 20f; + + shootY = 2f; + recoil = 4f; + reload = 45f; + shots = 6; + spacing = 10f; + velocityRnd = 0.4f; + inaccuracy = 7f; + ejectEffect = Fx.none; + shake = 3f; + shootSound = Sounds.shootBig; + xRand = 8f; + shotDelay = 1f; + + bullet = new MissileBulletType(4.2f, 30){{ + homingPower = 0.12f; + width = 8f; + height = 8f; + shrinkX = shrinkY = 0f; + drag = -0.003f; + homingRange = 80f; + keepVelocity = false; + splashDamageRadius = 30f; + splashDamage = 35f; + lifetime = 56f; + trailColor = Pal.bulletYellowBack; + backColor = Pal.bulletYellowBack; + frontColor = Pal.bulletYellow; + hitEffect = Fx.blastExplosion; + despawnEffect = Fx.blastExplosion; + weaveScale = 8f; + weaveMag = 2f; + }}; + }}); + + weapons.add(new Weapon("large-bullet-mount"){{ + reload = 80f; + cooldownTime = 90f; + x = 70f/4f; + y = -66f/4f; + rotateSpeed = 4f; + rotate = true; + shootY = 7f; + shake = 2f; + recoil = 3f; + occlusion = 12f; + ejectEffect = Fx.shellEjectBig; + + shots = 3; + shotDelay = 4f; + inaccuracy = 1f; + bullet = new BasicBulletType(7f, 50){{ + width = 13f; + height = 19f; + shootEffect = Fx.shootBig; + lifetime = 30f; + }}; + }}); + }}; + + omura = new UnitType("omura"){{ + health = 22000; + speed = 0.62f; + drag = 0.18f; + hitSize = 50f; + armor = 16f; + accel = 0.19f; + rotateSpeed = 0.9f; + rotateShooting = false; + + float spawnTime = 60f * 15f; + + abilities.add(new UnitSpawnAbility(flare, spawnTime, 19.25f, -31.75f), new UnitSpawnAbility(flare, spawnTime, -19.25f, -31.75f)); + + trailLength = 70; + trailX = 23f; + trailY = -32f; + trailScl = 3.5f; + + weapons.add(new Weapon("omura-cannon"){{ + reload = 110f; + cooldownTime = 90f; + mirror = false; + x = 0f; + y = -3.5f; + rotateSpeed = 1.4f; + rotate = true; + shootY = 23f; + shake = 6f; + recoil = 10.5f; + occlusion = 50f; + + shots = 1; + ejectEffect = Fx.none; + + bullet = new RailBulletType(){{ + shootEffect = Fx.railShoot; + speed = 67f; + lifetime = 8f; + pierceEffect = Fx.railHit; + updateEffect = Fx.railTrail; + hitEffect = Fx.massiveExplosion; + smokeEffect = Fx.shootBig2; + damage = 1250; + pierceDamageFactor = 0.5f; + }}; + }}); + }}; + //endregion //region core @@ -1256,18 +1651,20 @@ public class UnitTypes implements ContentList{ mineTier = 1; buildSpeed = 0.5f; drag = 0.05f; - speed = 2.6f; + speed = 2.8f; rotateSpeed = 15f; accel = 0.1f; itemCapacity = 30; health = 120f; engineOffset = 6f; - hitsize = 8f; + hitSize = 8f; + commandLimit = 3; weapons.add(new Weapon("small-basic-weapon"){{ reload = 17f; x = 2.75f; y = 1f; + top = false; bullet = new BasicBulletType(2.5f, 9){{ width = 7f; @@ -1289,17 +1686,19 @@ public class UnitTypes implements ContentList{ mineTier = 1; buildSpeed = 0.75f; drag = 0.05f; - speed = 2.9f; + speed = 3f; rotateSpeed = 17f; accel = 0.1f; itemCapacity = 50; health = 150f; engineOffset = 6f; - hitsize = 9f; + hitSize = 9f; rotateShooting = false; lowAltitude = true; + commandLimit = 5; weapons.add(new Weapon("small-mount-weapon"){{ + top = false; reload = 20f; x = 3f; y = 0.5f; @@ -1328,15 +1727,17 @@ public class UnitTypes implements ContentList{ mineTier = 2; buildSpeed = 1f; drag = 0.05f; - speed = 3.4f; + speed = 3.5f; rotateSpeed = 19f; accel = 0.11f; itemCapacity = 70; health = 190f; engineOffset = 6f; - hitsize = 10f; + hitSize = 10f; + commandLimit = 7; weapons.add(new Weapon("small-mount-weapon"){{ + top = false; reload = 15f; x = 1f; y = 2f; @@ -1363,7 +1764,7 @@ public class UnitTypes implements ContentList{ block = new UnitType("block"){ { speed = 0f; - hitsize = 0f; + hitSize = 0f; health = 1; rotateSpeed = 360f; itemCapacity = 0; diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index 56f39995a8..273fdb5899 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -5,7 +5,6 @@ import arc.graphics.*; import arc.graphics.Texture.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.math.geom.*; import arc.util.*; import mindustry.ctype.*; import mindustry.gen.*; @@ -153,7 +152,7 @@ public class Weathers implements ContentList{ if(tile != null && tile.floor().liquidDrop == Liquids.water){ Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.5f).a(state.opacity())); Draw.rect(splashes[(int)(life * (splashes.length - 1))], x, y); - }else{ + }else if(tile != null && tile.floor().liquidDrop == null && !tile.floor().solid){ Draw.color(Color.royal, Color.white, 0.3f); Draw.alpha(Mathf.slope(life) * state.opacity()); @@ -170,13 +169,14 @@ public class Weathers implements ContentList{ sandstorm = new Weather("sandstorm"){ TextureRegion region; - float yspeed = 0.3f, xspeed = 6f, size = 140f, padding = size, invDensity = 1500f; - Vec2 force = new Vec2(0.45f, 0.01f); + float size = 140f, padding = size, invDensity = 1500f, baseSpeed = 6.1f; + float force = 0.4f * 0; Color color = Color.valueOf("f7cba4"); Texture noise; { attrs.set(Attribute.light, -0.1f); + opacityMultiplier = 0.8f; } @Override @@ -194,22 +194,26 @@ public class Weathers implements ContentList{ @Override public void update(WeatherState state){ + float speed = force * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; for(Unit unit : Groups.unit){ - unit.impulse(force.x * state.intensity(), force.y * state.intensity()); + unit.impulse(windx, windy); } } @Override public void drawOver(WeatherState state){ Draw.tint(color); + float speed = baseSpeed * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; float scale = 1f / 2000f; float scroll = Time.time() * scale; - Tmp.tr1.setTexture(noise); + Tmp.tr1.texture = noise; Core.camera.bounds(Tmp.r1); Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll); + Tmp.tr1.scroll(-windx * scroll, windy * scroll); Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); rand.setSeed(0); @@ -224,8 +228,8 @@ public class Weathers implements ContentList{ float scl = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); + float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); float alpha = rand.random(0.2f); x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); @@ -247,16 +251,16 @@ public class Weathers implements ContentList{ sporestorm = new Weather("sporestorm"){ TextureRegion region; - float yspeed = 1f, xspeed = 4f, size = 5f, padding = size, invDensity = 2000f; + float size = 5f, padding = size, invDensity = 2000f, baseSpeed = 4.3f, force = 0.28f * 0; Color color = Color.valueOf("7457ce"); - Vec2 force = new Vec2(0.25f, 0.01f); Texture noise; { - attrs.set(Attribute.spores, 0.5f); - attrs.set(Attribute.light, -0.1f); + attrs.set(Attribute.spores, 1f); + attrs.set(Attribute.light, -0.15f); status = StatusEffects.sporeSlowed; statusGround = false; + opacityMultiplier = 0.85f; } @Override @@ -269,9 +273,11 @@ public class Weathers implements ContentList{ @Override public void update(WeatherState state){ + float speed = force * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; for(Unit unit : Groups.unit){ - unit.impulse(force.x * state.intensity(), force.y * state.intensity()); + unit.impulse(windx, windy); } } @@ -285,12 +291,15 @@ public class Weathers implements ContentList{ Draw.alpha(state.opacity * 0.8f); Draw.tint(color); + float speed = baseSpeed * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; + float scale = 1f / 2000f; float scroll = Time.time() * scale; - Tmp.tr1.setTexture(noise); + Tmp.tr1.texture = noise; Core.camera.bounds(Tmp.r1); Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll); + Tmp.tr1.scroll(-windx * scroll, windy * scroll); Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); rand.setSeed(0); @@ -306,8 +315,8 @@ public class Weathers implements ContentList{ float scl = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); + float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); float alpha = rand.random(0.1f, 0.8f); x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); diff --git a/core/src/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java index 3a3fe0d2a3..975bc4d1f8 100644 --- a/core/src/mindustry/core/ContentLoader.java +++ b/core/src/mindustry/core/ContentLoader.java @@ -1,10 +1,9 @@ package mindustry.core; import arc.files.*; -import arc.struct.*; import arc.func.*; import arc.graphics.*; -import arc.util.ArcAnnotate.*; +import arc.struct.*; import arc.util.*; import mindustry.content.*; import mindustry.ctype.*; @@ -13,8 +12,8 @@ import mindustry.mod.Mods.*; import mindustry.type.*; import mindustry.world.*; -import static arc.Core.files; -import static mindustry.Vars.mods; +import static arc.Core.*; +import static mindustry.Vars.*; /** * Loads all game content. @@ -33,6 +32,7 @@ public class ContentLoader{ new StatusEffects(), new Liquids(), new Bullets(), + new AmmoTypes(), new UnitTypes(), new Blocks(), new Loadouts(), diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 11f0183d48..efe2327074 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -9,7 +9,6 @@ import arc.math.*; import arc.scene.ui.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.audio.*; import mindustry.content.*; @@ -182,7 +181,7 @@ public class Control implements ApplicationListener, Loadable{ app.post(() -> ui.hudfrag.showLand()); renderer.zoomIn(Fx.coreLand.lifetime); - app.post(() -> Fx.coreLand.at(core.getX(), core.getY(), 0, core.block())); + app.post(() -> Fx.coreLand.at(core.getX(), core.getY(), 0, core.block)); Time.run(Fx.coreLand.lifetime, () -> { Fx.launch.at(core); Effect.shake(5f, 5f, core); @@ -193,7 +192,7 @@ public class Control implements ApplicationListener, Loadable{ @Override public void loadAsync(){ - Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth(); + Draw.scl = 1f / Core.atlas.find("scale_marker").width; Core.input.setCatch(KeyCode.back, true); @@ -280,6 +279,7 @@ public class Control implements ApplicationListener, Loadable{ try{ net.reset(); slot.load(); + slot.setAutosave(true); state.rules.sector = sector; //if there is no base, simulate a new game and place the right loadout at the spawn position @@ -317,10 +317,12 @@ public class Control implements ApplicationListener, Loadable{ }else{ net.reset(); logic.reset(); + sector.setSecondsPassed(0); world.loadSector(sector); state.rules.sector = sector; //assign origin when launching state.secinfo.origin = origin; + state.secinfo.destination = origin; logic.play(); control.saves.saveSector(sector); Events.fire(Trigger.newGame); @@ -329,6 +331,7 @@ public class Control implements ApplicationListener, Loadable{ } public void playTutorial(){ + ui.showInfo("@indev.notready"); //TODO implement //ui.showInfo("death"); /* @@ -428,7 +431,7 @@ public class Control implements ApplicationListener, Loadable{ //just a regular reminder if(!OS.prop("user.name").equals("anuke") && !OS.hasEnv("iknowwhatimdoing")){ app.post(() -> app.post(() -> { - ui.showStartupInfo("@indevpopup"); + ui.showStartupInfo("@indev.popup"); })); } @@ -478,7 +481,7 @@ public class Control implements ApplicationListener, Loadable{ @Override public void update(){ - //TODO find out why this happens on Android + //this happens on Android and nobody knows why if(assets == null) return; saves.update(); @@ -516,7 +519,7 @@ public class Control implements ApplicationListener, Loadable{ platform.updateRPC(); } - if(Core.input.keyTap(Binding.pause) && !state.isOutOfTime() && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ + if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ state.set(state.is(State.playing) ? State.paused : State.playing); } diff --git a/core/src/mindustry/core/FileTree.java b/core/src/mindustry/core/FileTree.java index f94c75eeb7..d9ca5694c1 100644 --- a/core/src/mindustry/core/FileTree.java +++ b/core/src/mindustry/core/FileTree.java @@ -2,8 +2,8 @@ package mindustry.core; import arc.*; import arc.assets.loaders.*; -import arc.struct.*; import arc.files.*; +import arc.struct.*; /** Handles files in a modded context. */ public class FileTree implements FileHandleResolver{ diff --git a/core/src/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java index b3f5e49213..949e40d02d 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -1,7 +1,7 @@ package mindustry.core; import arc.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.gen.*; @@ -17,9 +17,9 @@ public class GameState{ /** Wave countdown in ticks. */ public float wavetime; /** Whether the game is in game over state. */ - public boolean gameOver = false, launched = false, serverPaused = false; + public boolean gameOver = false, serverPaused = false, wasTimeout; /** Map that is currently being played on. */ - public @NonNull Map map = emptyMap; + public Map map = emptyMap; /** The current game rules. */ public Rules rules = new Rules(); /** Statistics for this save/game. Displayed after game over. */ @@ -50,11 +50,6 @@ public class GameState{ return rules.sector != null; } - /** @return whether the player is in a campaign and they are out of sector time */ - public boolean isOutOfTime(){ - return isCampaign() && isGame() && getSector().getTimeSpent() >= turnDuration; - } - public boolean hasSector(){ return rules.sector != null; } diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 852e2d9673..df536552df 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -4,13 +4,11 @@ import arc.*; import arc.math.*; import arc.util.*; import mindustry.annotations.Annotations.*; -import mindustry.content.*; import mindustry.core.GameState.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; import mindustry.gen.*; -import mindustry.maps.*; import mindustry.type.*; import mindustry.type.Weather.*; import mindustry.world.*; @@ -90,13 +88,16 @@ public class Logic implements ApplicationListener{ if(state.isCampaign()){ long seconds = state.rules.sector.getSecondsPassed(); CoreBuild core = state.rules.defaultTeam.core(); + //THE WAVES NEVER END + state.rules.waves = true; //apply fractional damage based on how many turns have passed for this sector - float turnsPassed = seconds / (turnDuration / 60f); + //float turnsPassed = seconds / (turnDuration / 60f); - if(state.rules.sector.hasWaves() && turnsPassed > 0 && state.rules.sector.hasBase()){ - SectorDamage.apply(turnsPassed / sectorDestructionTurns); - } + //TODO sector damage disabled for now + //if(state.rules.sector.hasWaves() && turnsPassed > 0 && state.rules.sector.hasBase()){ + // SectorDamage.apply(turnsPassed / sectorDestructionTurns); + //} //add resources based on turns passed if(state.rules.sector.save != null && core != null){ @@ -178,7 +179,7 @@ public class Logic implements ApplicationListener{ public void runWave(){ spawner.spawnEnemies(); state.wave++; - state.wavetime = state.hasSector() && state.getSector().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing; + state.wavetime = state.rules.waveSpacing; Events.fire(new WaveEvent()); } @@ -187,7 +188,7 @@ public class Logic implements ApplicationListener{ //campaign maps do not have a 'win' state! if(state.isCampaign()){ //gameover only when cores are dead - if(!state.rules.attackMode && state.teams.playerCores().size == 0 && !state.gameOver){ + if(state.teams.playerCores().size == 0 && !state.gameOver){ state.gameOver = true; Events.fire(new GameOverEvent(state.rules.waveTeam)); } @@ -198,6 +199,8 @@ public class Logic implements ApplicationListener{ state.rules.waves = false; } + //TODO capturing is disabled + /* //if there's a "win" wave and no enemies are present, win automatically if(state.rules.waves && state.enemies == 0 && state.rules.winWave > 0 && state.wave >= state.rules.winWave && !spawner.isSpawning()){ //the sector has been conquered - waves get disabled @@ -210,7 +213,7 @@ public class Logic implements ApplicationListener{ if(!headless){ control.saves.saveSector(state.rules.sector); } - } + }*/ }else{ if(!state.rules.attackMode && state.teams.playerCores().size == 0 && !state.gameOver){ state.gameOver = true; @@ -245,63 +248,12 @@ public class Logic implements ApplicationListener{ if(entry.cooldown < 0 && !entry.weather.isActive()){ float duration = Mathf.random(entry.minDuration, entry.maxDuration); entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency); - Call.createWeather(entry.weather, entry.intensity, duration); + Tmp.v1.setToRandomDirection(); + Call.createWeather(entry.weather, entry.intensity, duration, Tmp.v1.x, Tmp.v1.y); } } } - @Remote(called = Loc.both) - public static void launchZone(){ - if(!state.isCampaign()) return; - - if(!headless){ - ui.hudfrag.showLaunch(); - } - - //TODO better core launch effect - for(Building tile : state.teams.playerCores()){ - Fx.launch.at(tile); - } - - Sector sector = state.rules.sector; - - //TODO containers must be launched too - Time.runTask(30f, () -> { - Sector origin = sector.save.meta.secinfo.origin; - if(origin != null){ - ItemSeq stacks = origin.getExtraItems(); - - //add up all items into list - for(Building entity : state.teams.playerCores()){ - entity.items.each(stacks::add); - } - - //save received items - origin.setExtraItems(stacks); - } - - //remove all the cores - state.teams.playerCores().each(b -> b.tile.remove()); - - state.launched = true; - state.gameOver = true; - - //save over the data w/o the cores - sector.save.save(); - - //run a turn, since launching takes up a turn - universe.runTurn(); - - //TODO apply extra damage to sector - //sector.setTurnsPassed(sector.getTurnsPassed() + 3); - - //TODO load the sector that was launched from - Events.fire(new LaunchEvent()); - //manually fire game over event now - Events.fire(new GameOverEvent(state.rules.defaultTeam)); - }); - } - @Remote(called = Loc.both) public static void updateGameOver(Team winner){ state.gameOver = true; @@ -334,12 +286,9 @@ public class Logic implements ApplicationListener{ state.enemies = Groups.unit.count(u -> u.team() == state.rules.waveTeam && u.type().isCounted); } - //force pausing when the player is out of sector time - if(state.isOutOfTime()){ - state.set(State.paused); - } - if(!state.isPaused()){ + state.teams.updateTeamStats(); + if(state.isCampaign()){ state.secinfo.update(); } diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index c98f8953cf..ae8c7d9a7c 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -105,12 +105,10 @@ public class NetClient implements ApplicationListener{ Time.runTask(3f, ui.loadfrag::hide); if(packet.reason != null){ - if(packet.reason.equals("closed")){ - ui.showSmall("@disconnect", "@disconnect.closed"); - }else if(packet.reason.equals("timeout")){ - ui.showSmall("@disconnect", "@disconnect.timeout"); - }else if(packet.reason.equals("error")){ - ui.showSmall("@disconnect", "@disconnect.error"); + switch(packet.reason){ + case "closed" -> ui.showSmall("@disconnect", "@disconnect.closed"); + case "timeout" -> ui.showSmall("@disconnect", "@disconnect.timeout"); + case "error" -> ui.showSmall("@disconnect", "@disconnect.error"); } }else{ ui.showErrorMessage("@disconnect"); @@ -440,7 +438,7 @@ public class NetClient implements ApplicationListener{ } @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) - public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, short coreDataLen, byte[] coreData){ + public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, int timeData, short coreDataLen, byte[] coreData){ try{ if(wave > state.wave){ state.wave = wave; @@ -453,6 +451,8 @@ public class NetClient implements ApplicationListener{ state.enemies = enemies; state.serverPaused = paused; + universe.updateNetSeconds(timeData); + netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen)); DataInputStream input = netClient.dataStream; @@ -547,6 +547,10 @@ public class NetClient implements ApplicationListener{ quiet = true; } + public void clearRemovedEntity(int id){ + removed.remove(id); + } + public void addRemovedEntity(int id){ removed.add(id); } diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 74dbf7f0aa..77ab732cf6 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -7,7 +7,6 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.CommandHandler.*; import arc.util.io.*; import arc.util.serialization.*; @@ -131,7 +130,7 @@ public class NetServer implements ApplicationListener{ return; } - if(Time.millis() < info.lastKicked){ + if(Time.millis() < admins.getKickTime(uuid, con.address)){ con.kick(KickReason.recentKick); return; } @@ -250,8 +249,7 @@ public class NetServer implements ApplicationListener{ }catch(ValidateException e){ Log.debug("Validation failed for '@': @", e.player, e.getMessage()); }catch(RuntimeException e){ - if(e.getCause() instanceof ValidateException){ - ValidateException v = (ValidateException)e.getCause(); + if(e.getCause() instanceof ValidateException v){ Log.debug("Validation failed for '@': @", v.player, v.getMessage()); }else{ throw e; @@ -331,8 +329,8 @@ public class NetServer implements ApplicationListener{ votes += d; voted.addAll(player.uuid(), admins.getInfo(player.uuid()).lastIP); - Call.sendMessage(Strings.format("[lightgray]A player has voted on kicking[orange] @[].[accent] (@/@)\n[lightgray]Type[orange] /vote [] to agree.", - target.name, votes, votesRequired())); + Call.sendMessage(Strings.format("[lightgray]@[lightgray] has voted on kicking[orange] @[].[accent] (@/@)\n[lightgray]Type[orange] /vote [] to agree.", + player.name, target.name, votes, votesRequired())); checkPass(); } @@ -485,7 +483,7 @@ public class NetServer implements ApplicationListener{ data.stream = new ByteArrayInputStream(stream.toByteArray()); player.con.sendStream(data); - Log.debug("Packed @ invalid world data.", stream.size()); + Log.debug("Packed @ bytes of world data.", stream.size()); } public void addPacketHandler(String type, Cons2 handler){ @@ -593,38 +591,38 @@ public class NetServer implements ApplicationListener{ if(player.isBuilder()){ player.builder().clearBuilding(); player.builder().updateBuilding(building); + + if(requests != null){ + for(BuildPlan req : requests){ + if(req == null) continue; + Tile tile = world.tile(req.x, req.y); + if(tile == null || (!req.breaking && req.block == null)) continue; + //auto-skip done requests + if(req.breaking && tile.block() == Blocks.air){ + continue; + }else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || (tile.build != null && tile.build.rotation == req.rotation))){ + continue; + }else if(con.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so + continue; + }else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server + action.block = req.block; + action.rotation = req.rotation; + action.config = req.config; + })){ + //force the player to remove this request if that's not the case + Call.removeQueueBlock(player.con, req.x, req.y, req.breaking); + con.rejectedRequests.add(req); + continue; + } + player.builder().plans().addLast(req); + } + } } if(player.isMiner()){ player.miner().mineTile(mining); } - if(requests != null){ - for(BuildPlan req : requests){ - if(req == null) continue; - Tile tile = world.tile(req.x, req.y); - if(tile == null || (!req.breaking && req.block == null)) continue; - //auto-skip done requests - if(req.breaking && tile.block() == Blocks.air){ - continue; - }else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || (tile.build != null && tile.build.rotation == req.rotation))){ - continue; - }else if(con.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so - continue; - }else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server - action.block = req.block; - action.rotation = req.rotation; - action.config = req.config; - })){ - //force the player to remove this request if that's not the case - Call.removeQueueBlock(player.con, req.x, req.y, req.breaking); - con.rejectedRequests.add(req); - continue; - } - player.builder().plans().addLast(req); - } - } - con.rejectedRequests.clear(); if(!player.dead()){ @@ -809,7 +807,7 @@ public class NetServer implements ApplicationListener{ short sent = 0; for(Building entity : Groups.build){ - if(!entity.block().sync) continue; + if(!entity.block.sync) continue; sent ++; dataStream.writeInt(entity.pos()); @@ -838,7 +836,7 @@ public class NetServer implements ApplicationListener{ dataStream.writeByte(cores.size); for(CoreBuild entity : cores){ - dataStream.writeInt(entity.tile().pos()); + dataStream.writeInt(entity.tile.pos()); entity.items.write(Writes.get(dataStream)); } @@ -846,7 +844,7 @@ public class NetServer implements ApplicationListener{ byte[] stateBytes = syncStream.toByteArray(); //write basic state data. - Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, (short)stateBytes.length, net.compressSnapshot(stateBytes)); + Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, universe.seconds(), (short)stateBytes.length, net.compressSnapshot(stateBytes)); viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY); diff --git a/core/src/mindustry/core/Platform.java b/core/src/mindustry/core/Platform.java index ff7d44ec88..7eae8136c0 100644 --- a/core/src/mindustry/core/Platform.java +++ b/core/src/mindustry/core/Platform.java @@ -14,10 +14,18 @@ import mindustry.type.*; import mindustry.ui.dialogs.*; import rhino.*; +import java.net.*; + import static mindustry.Vars.*; public interface Platform{ + /** Dynamically loads a jar file. */ + default Class loadJar(Fi jar, String mainClass) throws Exception{ + URLClassLoader classLoader = new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); + return classLoader.loadClass(mainClass); + } + /** Steam: Update lobby visibility.*/ default void updateLobby(){} @@ -121,7 +129,7 @@ public interface Platform{ } /** - * Show a file chooser for multiple file types. Only supported on desktop. + * Show a file chooser for multiple file types. * @param cons Selection listener * @param extensions File extensions to filter */ diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index e04aef622d..47b7500e10 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -28,6 +28,8 @@ public class Renderer implements ApplicationListener{ public PlanetRenderer planets; public FrameBuffer effectBuffer = new FrameBuffer(); + public float laserOpacity = 1f; + private Bloom bloom; private FxProcessor fx = new FxProcessor(); private Color clearColor = new Color(0f, 0f, 0f, 1f); @@ -59,8 +61,12 @@ public class Renderer implements ApplicationListener{ @Override public void update(){ Color.white.set(1f, 1f, 1f, 1f); + Gl.clear(Gl.stencilBufferBit); - camerascale = Mathf.lerpDelta(camerascale, targetscale, 0.1f); + float dest = Mathf.round(targetscale, 0.5f); + camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f); + if(Mathf.within(camerascale, dest, 0.001f)) camerascale = dest; + laserOpacity = Core.settings.getInt("lasersopacity") / 100f; if(landTime > 0){ landTime -= Time.delta; @@ -213,8 +219,6 @@ public class Renderer implements ApplicationListener{ pixelator.register(); } - //TODO fx - Draw.draw(Layer.background, this::drawBackground); Draw.draw(Layer.floor, blocks.floor::drawFloor); Draw.draw(Layer.block - 1, blocks::drawShadows); @@ -271,9 +275,9 @@ public class Renderer implements ApplicationListener{ float fract = landTime / Fx.coreLand.lifetime; Building entity = player.closestCore(); - TextureRegion reg = entity.block().icon(Cicon.full); + TextureRegion reg = entity.block.icon(Cicon.full); float scl = Scl.scl(4f) / camerascale; - float s = reg.getWidth() * Draw.scl * scl * 4f * fract; + float s = reg.width * Draw.scl * scl * 4f * fract; Draw.color(Pal.lightTrail); Draw.rect("circle-shadow", entity.getX(), entity.getY(), s, s); @@ -285,7 +289,7 @@ public class Renderer implements ApplicationListener{ Draw.color(); Draw.mixcol(Color.white, fract); - Draw.rect(reg, entity.getX(), entity.getY(), reg.getWidth() * Draw.scl * scl, reg.getHeight() * Draw.scl * scl, fract * 135f); + Draw.rect(reg, entity.getX(), entity.getY(), reg.width * Draw.scl * scl, reg.height * Draw.scl * scl, fract * 135f); Draw.reset(); } @@ -301,6 +305,10 @@ public class Renderer implements ApplicationListener{ targetscale = Mathf.clamp(targetscale, minScale(), Math.round(s * 6)); } + public float getDisplayScale(){ + return camerascale; + } + public float minScale(){ return Scl.scl(1.5f); } diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index 783cb89cf8..f0a4757966 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -24,7 +24,7 @@ import mindustry.editor.*; import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.logic.LogicDialog; +import mindustry.logic.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; import mindustry.ui.fragments.*; @@ -491,7 +491,7 @@ public class UI implements ApplicationListener, Loadable{ Table t = new Table(); t.touchable = Touchable.disabled; t.background(Styles.black3).margin(8f) - .add(text).style(Styles.outlineLabel); + .add(text).style(Styles.outlineLabel).labelAlign(Align.center); t.update(() -> t.setPosition(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f, Align.center)); t.actions(Actions.fadeOut(3, Interp.pow4In), Actions.remove()); Core.scene.add(t); diff --git a/core/src/mindustry/core/Version.java b/core/src/mindustry/core/Version.java index 08a105d8fb..c2744700a4 100644 --- a/core/src/mindustry/core/Version.java +++ b/core/src/mindustry/core/Version.java @@ -2,8 +2,8 @@ package mindustry.core; import arc.*; import arc.Files.*; -import arc.struct.*; import arc.files.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; @@ -45,4 +45,12 @@ public class Version{ build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; } } + + /** get menu version without colors */ + public static String combined(){ + if(build == -1){ + return "custom build"; + } + return (type.equals("official") ? modifier : type) + " build " + build + (revision == 0 ? "" : "." + revision); + } } diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index 52fdbecd9b..03a18c01ed 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -5,11 +5,12 @@ import arc.func.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.struct.ObjectIntMap.*; import arc.util.*; import arc.util.noise.*; import mindustry.content.*; import mindustry.core.GameState.*; +import mindustry.ctype.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; @@ -19,7 +20,6 @@ import mindustry.maps.*; import mindustry.maps.filters.*; import mindustry.maps.filters.GenerateFilter.*; import mindustry.type.*; -import mindustry.type.Sector.*; import mindustry.type.Weather.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; @@ -30,14 +30,20 @@ import static mindustry.Vars.*; public class World{ public final Context context = new Context(); - public @NonNull Tiles tiles = new Tiles(0, 0); + public Tiles tiles = new Tiles(0, 0); private boolean generating, invalidMap; + private ObjectMap customMapLoaders = new ObjectMap<>(); public World(){ } + /** Adds a custom handler function for loading a custom map - usually a generated one. */ + public void addMapLoader(Map map, Runnable loader){ + customMapLoaders.put(map, loader); + } + public boolean isInvalidMap(){ return invalidMap; } @@ -59,6 +65,11 @@ public class World{ return tile == null || tile.block().solid; } + public boolean wallSolidFull(int x, int y){ + Tile tile = tile(x, y); + return tile == null || (tile.block().solid && tile.block().fillsTile); + } + public boolean isAccessible(int x, int y){ return !wallSolid(x, y - 1) || !wallSolid(x, y + 1) || !wallSolid(x - 1, y) || !wallSolid(x + 1, y); } @@ -79,13 +90,11 @@ public class World{ return height()*tilesize; } - @NonNull public Floor floor(int x, int y){ Tile tile = tile(x, y); return tile == null ? Blocks.air.asFloor() : tile.floor(); } - @NonNull public Floor floorWorld(float x, float y){ Tile tile = tileWorld(x, y); return tile == null ? Blocks.air.asFloor() : tile.floor(); @@ -105,7 +114,9 @@ public class World{ public Tile tileBuilding(int x, int y){ Tile tile = tiles.get(x, y); if(tile == null) return null; - if(tile.build != null) return tile.build.tile(); + if(tile.build != null){ + return tile.build.tile(); + } return tile; } @@ -123,7 +134,6 @@ public class World{ return tile.build; } - @NonNull public Tile rawTile(int x, int y){ return tiles.getn(x, y); } @@ -253,9 +263,71 @@ public class World{ state.rules.weather.clear(); - if(sector.is(SectorAttribute.rainy)) state.rules.weather.add(new WeatherEntry(Weathers.rain)); - if(sector.is(SectorAttribute.snowy)) state.rules.weather.add(new WeatherEntry(Weathers.snow)); - if(sector.is(SectorAttribute.desert)) state.rules.weather.add(new WeatherEntry(Weathers.sandstorm)); + //apply weather based on terrain + ObjectIntMap floorc = new ObjectIntMap<>(); + ObjectSet content = new ObjectSet<>(); + + float waterFloors = 0, totalFloors = 0; + + for(Tile tile : world.tiles){ + if(world.getDarkness(tile.x, tile.y) >= 3){ + continue; + } + + Liquid liquid = tile.floor().liquidDrop; + if(tile.floor().itemDrop != null) content.add(tile.floor().itemDrop); + if(tile.overlay().itemDrop != null) content.add(tile.overlay().itemDrop); + if(liquid != null) content.add(liquid); + + if(!tile.block().isStatic()){ + totalFloors ++; + if(liquid == Liquids.water){ + waterFloors += tile.floor().isDeep() ? 1f : 0.7f; + } + floorc.increment(tile.floor()); + if(tile.overlay() != Blocks.air){ + floorc.increment(tile.overlay()); + } + } + } + + //sort counts in descending order + Seq> entries = floorc.entries().toArray(); + entries.sort(e -> -e.value); + //remove all blocks occuring < 30 times - unimportant + entries.removeAll(e -> e.value < 30); + + Block[] floors = new Block[entries.size]; + int[] floorCounts = new int[entries.size]; + for(int i = 0; i < entries.size; i++){ + floorCounts[i] = entries.get(i).value; + floors[i] = entries.get(i).key; + } + + //TODO bad code + boolean hasSnow = floors[0].name.contains("ice") || floors[0].name.contains("snow"); + boolean hasRain = !hasSnow && floors[0].name.contains("water"); + boolean hasDesert = !hasSnow && !hasRain && floors[0].name.contains("sand"); + boolean hasSpores = floors[0].name.contains("spore") || floors[0].name.contains("moss") || floors[0].name.contains("tainted"); + + if(hasSnow){ + state.rules.weather.add(new WeatherEntry(Weathers.snow)); + } + + if(hasRain){ + state.rules.weather.add(new WeatherEntry(Weathers.rain)); + } + + if(hasDesert){ + state.rules.weather.add(new WeatherEntry(Weathers.sandstorm)); + } + + if(hasSpores){ + state.rules.weather.add(new WeatherEntry(Weathers.sporestorm)); + } + + state.secinfo.resources = content.asArray(); + state.secinfo.resources.sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))); } @@ -268,6 +340,12 @@ public class World{ } public void loadMap(Map map, Rules checkRules){ + //load using custom loader if possible + if(customMapLoaders.containsKey(map)){ + customMapLoaders.get(map).run(); + return; + } + try{ SaveIO.load(map.file, new FilterContext(map)); }catch(Throwable e){ @@ -442,7 +520,7 @@ public class World{ dark = Math.max((edgeBlend - edgeDst) * (4f / edgeBlend), dark); } - if(state.hasSector()){ + if(state.hasSector() && state.getSector().preset == null){ int circleBlend = 14; //quantized angle float offset = state.getSector().rect.rotation + 90; diff --git a/core/src/mindustry/ctype/Content.java b/core/src/mindustry/ctype/Content.java index 7565dc88b0..c56f465824 100644 --- a/core/src/mindustry/ctype/Content.java +++ b/core/src/mindustry/ctype/Content.java @@ -2,7 +2,6 @@ package mindustry.ctype; import arc.files.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.mod.Mods.*; @@ -10,8 +9,7 @@ import mindustry.mod.Mods.*; public abstract class Content implements Comparable, Disposable{ public final short id; /** Info on which mod this content was loaded from. */ - public @NonNull ModContentInfo minfo = new ModContentInfo(); - + public ModContentInfo minfo = new ModContentInfo(); public Content(){ this.id = (short)Vars.content.getBy(getContentType()).size; diff --git a/core/src/mindustry/ctype/ContentType.java b/core/src/mindustry/ctype/ContentType.java index bc147d8c81..e62377628c 100644 --- a/core/src/mindustry/ctype/ContentType.java +++ b/core/src/mindustry/ctype/ContentType.java @@ -15,7 +15,8 @@ public enum ContentType{ loadout_UNUSED, typeid_UNUSED, error, - planet; + planet, + ammo; public static final ContentType[] all = values(); } diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index 65e168c54a..f6e6d0a2dc 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -4,10 +4,11 @@ import arc.*; import arc.func.*; import arc.graphics.g2d.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.game.EventType.*; import mindustry.graphics.*; +import mindustry.type.*; import mindustry.ui.*; import static mindustry.Vars.*; @@ -21,7 +22,7 @@ public abstract class UnlockableContent extends MappableContent{ /** Whether this content is always unlocked in the tech tree. */ public boolean alwaysUnlocked = false; /** Icons by Cicon ID.*/ - protected TextureRegion[] cicons = new TextureRegion[mindustry.ui.Cicon.all.length]; + protected TextureRegion[] cicons = new TextureRegion[Cicon.all.length]; /** Unlock state. Loaded from settings. Do not modify outside of the constructor. */ protected boolean unlocked; @@ -30,7 +31,7 @@ public abstract class UnlockableContent extends MappableContent{ this.localizedName = Core.bundle.get(getContentType() + "." + this.name + ".name", this.name); this.description = Core.bundle.getOrNull(getContentType() + "." + this.name + ".description"); - this.unlocked = Core.settings != null && Core.settings.getBool(name + "-unlocked", false); + this.unlocked = Core.settings != null && Core.settings.getBool(this.name + "-unlocked", false); } public String displayDescription(){ @@ -43,6 +44,11 @@ public abstract class UnlockableContent extends MappableContent{ } + /** @return items needed to research this content */ + public ItemStack[] researchRequirements(){ + return ItemStack.empty; + } + public String emoji(){ return Fonts.getUnicodeStr(name); } diff --git a/core/src/mindustry/editor/DrawOperation.java b/core/src/mindustry/editor/DrawOperation.java index 77162fe2a5..7910de4892 100755 --- a/core/src/mindustry/editor/DrawOperation.java +++ b/core/src/mindustry/editor/DrawOperation.java @@ -1,14 +1,13 @@ package mindustry.editor; +import arc.struct.*; import mindustry.annotations.Annotations.*; -import arc.struct.LongSeq; -import mindustry.game.Team; -import mindustry.gen.TileOp; -import mindustry.world.Block; -import mindustry.world.Tile; -import mindustry.world.blocks.environment.Floor; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.world.*; +import mindustry.world.blocks.environment.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class DrawOperation{ private MapEditor editor; @@ -64,8 +63,12 @@ public class DrawOperation{ if(type == OpType.floor.ordinal()){ tile.setFloor((Floor)content.block(to)); }else if(type == OpType.block.ordinal()){ + tile.getLinkedTiles(t -> editor.renderer.updatePoint(t.x, t.y)); + Block block = content.block(to); tile.setBlock(block, tile.team(), tile.build == null ? 0 : tile.build.rotation); + + tile.getLinkedTiles(t -> editor.renderer.updatePoint(t.x, t.y)); }else if(type == OpType.rotation.ordinal()){ if(tile.build != null) tile.build.rotation = to; }else if(type == OpType.team.ordinal()){ @@ -74,7 +77,7 @@ public class DrawOperation{ tile.setOverlayID(to); } }); - editor.renderer().updatePoint(tile.x, tile.y); + editor.renderer.updatePoint(tile.x, tile.y); } @Struct diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index feb53f2f09..5ff533325d 100644 --- a/core/src/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -1,7 +1,6 @@ package mindustry.editor; import arc.func.*; -import arc.util.ArcAnnotate.*; import mindustry.content.*; import mindustry.editor.DrawOperation.*; import mindustry.game.*; @@ -19,15 +18,15 @@ public class EditorTile extends Tile{ } @Override - public void setFloor(@NonNull Floor type){ - if(state.isGame()){ + public void setFloor(Floor type){ + if(skip()){ super.setFloor(type); return; } if(type instanceof OverlayFloor){ //don't place on liquids - if(!floor.isLiquid){ + if(floor.hasSurface()){ setOverlayID(type.id); } return; @@ -41,20 +40,25 @@ public class EditorTile extends Tile{ @Override public void setBlock(Block type, Team team, int rotation){ - if(state.isGame()){ + if(skip()){ super.setBlock(type, team, rotation); return; } + if(this.block == type && (build == null || build.rotation == rotation)){ + update(); + return; + } + op(OpType.block, block.id); if(rotation != 0) op(OpType.rotation, (byte)rotation); - if(team() != Team.derelict) op(OpType.team, (byte)team().id); + if(team != Team.derelict) op(OpType.team, (byte)team.id); super.setBlock(type, team, rotation); } @Override public void setTeam(Team team){ - if(state.isGame()){ + if(skip()){ super.setTeam(team); return; } @@ -66,7 +70,7 @@ public class EditorTile extends Tile{ @Override public void setOverlay(Block overlay){ - if(state.isGame()){ + if(skip()){ super.setOverlay(overlay); return; } @@ -79,23 +83,30 @@ public class EditorTile extends Tile{ @Override protected void fireChanged(){ - if(state.isGame()){ + if(skip()){ super.fireChanged(); }else{ - ui.editor.editor.renderer().updatePoint(x, y); + update(); } } @Override public void recache(){ - if(state.isGame()){ + if(skip()){ super.recache(); } } - + + @Override + protected void changed(){ + if(state.isGame()){ + super.changed(); + } + } + @Override protected void changeEntity(Team team, Prov entityprov, int rotation){ - if(state.isGame()){ + if(skip()){ super.changeEntity(team, entityprov, rotation); return; } @@ -107,15 +118,23 @@ public class EditorTile extends Tile{ Block block = block(); - if(block.hasEntity()){ + if(block.hasBuilding()){ build = entityprov.get().init(this, team, false, rotation); - build.cons(new ConsumeModule(build)); + build.cons = new ConsumeModule(build); if(block.hasItems) build.items = new ItemModule(); if(block.hasLiquids) build.liquids(new LiquidModule()); if(block.hasPower) build.power(new PowerModule()); } } + private void update(){ + ui.editor.editor.renderer.updatePoint(x, y); + } + + private boolean skip(){ + return state.isGame() || ui.editor.editor.isLoading(); + } + private void op(OpType type, short value){ ui.editor.editor.addTileOp(TileOp.get(x, y, (byte)type.ordinal(), value)); } diff --git a/core/src/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java index 47053049e2..194ec97e4c 100644 --- a/core/src/mindustry/editor/EditorTool.java +++ b/core/src/mindustry/editor/EditorTool.java @@ -1,6 +1,7 @@ package mindustry.editor; import arc.func.*; +import arc.input.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; @@ -10,16 +11,16 @@ import mindustry.game.*; import mindustry.world.*; public enum EditorTool{ - zoom, - pick{ + zoom(KeyCode.v), + pick(KeyCode.i){ public void touched(MapEditor editor, int x, int y){ if(!Structs.inBounds(x, y, editor.width(), editor.height())) return; Tile tile = editor.tile(x, y); - editor.drawBlock = tile.block() == Blocks.air ? tile.overlay() == Blocks.air ? tile.floor() : tile.overlay() : tile.block(); + editor.drawBlock = tile.block() == Blocks.air || !tile.block().inEditor ? tile.overlay() == Blocks.air ? tile.floor() : tile.overlay() : tile.block(); } }, - line("replace", "orthogonal"){ + line(KeyCode.l, "replace", "orthogonal"){ @Override public void touchedLine(MapEditor editor, int x1, int y1, int x2, int y2){ @@ -43,7 +44,7 @@ public enum EditorTool{ }); } }, - pencil("replace", "square", "drawteams"){ + pencil(KeyCode.b, "replace", "square", "drawteams"){ { edit = true; draggable = true; @@ -67,7 +68,7 @@ public enum EditorTool{ } }, - eraser("eraseores"){ + eraser(KeyCode.e, "eraseores"){ { edit = true; draggable = true; @@ -86,7 +87,7 @@ public enum EditorTool{ }); } }, - fill("replaceall", "fillteams"){ + fill(KeyCode.g, "replaceall", "fillteams"){ { edit = true; } @@ -117,7 +118,7 @@ public enum EditorTool{ if(editor.drawBlock.isOverlay()){ Block dest = tile.overlay(); if(dest == editor.drawBlock) return; - tester = t -> t.overlay() == dest && !t.floor().isLiquid; + tester = t -> t.overlay() == dest && t.floor().hasSurface(); setter = t -> t.setOverlay(editor.drawBlock); }else if(editor.drawBlock.isFloor()){ Block dest = tile.floor(); @@ -205,7 +206,7 @@ public enum EditorTool{ } } }, - spray("replace"){ + spray(KeyCode.r, "replace"){ final double chance = 0.012; { @@ -231,8 +232,12 @@ public enum EditorTool{ } }; + public static final EditorTool[] all = values(); + /** All the internal alternate placement modes of this tool. */ public final String[] altModes; + /** Key to activate this tool. */ + public KeyCode key = KeyCode.unset; /** The current alternate placement mode. -1 is the standard mode, no changes.*/ public int mode = -1; /** Whether this tool causes canvas changes when touched.*/ @@ -244,10 +249,20 @@ public enum EditorTool{ this(new String[]{}); } + EditorTool(KeyCode code){ + this(new String[]{}); + this.key = code; + } + EditorTool(String... altModes){ this.altModes = altModes; } + EditorTool(KeyCode code, String... altModes){ + this.altModes = altModes; + this.key = code; + } + public void touched(MapEditor editor, int x, int y){} public void touchedLine(MapEditor editor, int x1, int y1, int x2, int y2){} diff --git a/core/src/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java index bbef2125ed..49d174779b 100644 --- a/core/src/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -18,10 +18,10 @@ import static mindustry.Vars.*; public class MapEditor{ public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15, 20}; - private final Context context = new Context(); - private StringMap tags = new StringMap(); - private MapRenderer renderer = new MapRenderer(this); + public StringMap tags = new StringMap(); + public MapRenderer renderer = new MapRenderer(this); + private final Context context = new Context(); private OperationStack stack = new OperationStack(); private DrawOperation currentOp; private boolean loading; @@ -31,8 +31,8 @@ public class MapEditor{ public Block drawBlock = Blocks.stone; public Team drawTeam = Team.sharded; - public StringMap getTags(){ - return tags; + public boolean isLoading(){ + return loading; } public void beginEdit(int width, int height){ @@ -52,7 +52,7 @@ public class MapEditor{ if(map.file.parent().parent().name().equals("1127400") && steam){ tags.put("steamid", map.file.parent().name()); } - MapIO.loadMap(map, context); + load(() -> MapIO.loadMap(map, context)); renderer.resize(width(), height()); loading = false; } @@ -210,10 +210,6 @@ public class MapEditor{ } } - public MapRenderer renderer(){ - return renderer; - } - public void resize(int width, int height){ clearOp(); @@ -227,8 +223,14 @@ public class MapEditor{ int px = offsetX + x, py = offsetY + y; if(previous.in(px, py)){ tiles.set(x, y, previous.getn(px, py)); - tiles.getn(x, y).x = (short)x; - tiles.getn(x, y).y = (short)y; + Tile tile = tiles.getn(x, y); + tile.x = (short)x; + tile.y = (short)y; + + if(tile.build != null && tile.isCenter()){ + tile.build.x = x * tilesize + tile.block().offset; + tile.build.y = y * tilesize + tile.block().offset; + } }else{ tiles.set(x, y, new EditorTile(x, y, Blocks.stone.id, (short)0, (short)0)); } diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 1805df28d0..4f7eb008fd 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -1,7 +1,6 @@ package mindustry.editor; import arc.*; -import arc.struct.*; import arc.files.*; import arc.func.*; import arc.graphics.*; @@ -14,8 +13,8 @@ import arc.scene.event.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.content.*; import mindustry.core.GameState.*; @@ -116,9 +115,9 @@ public class MapEditorDialog extends Dialog implements Disposable{ t.button("@editor.export", Icon.upload, () -> createDialog("@editor.export", "@editor.exportfile", "@editor.exportfile.description", Icon.file, - (Runnable)() -> platform.export(editor.getTags().get("name", "unknown"), mapExtension, file -> MapIO.writeMap(file, editor.createMap(file))), + (Runnable)() -> platform.export(editor.tags.get("name", "unknown"), mapExtension, file -> MapIO.writeMap(file, editor.createMap(file))), "@editor.exportimage", "@editor.exportimage.description", Icon.fileImage, - (Runnable)() -> platform.export(editor.getTags().get("name", "unknown"), "png", file -> { + (Runnable)() -> platform.export(editor.tags.get("name", "unknown"), "png", file -> { Pixmap out = MapIO.writeImage(editor.tiles()); file.writePNG(out); out.dispose(); @@ -129,16 +128,16 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(steam){ menu.cont.button("@editor.publish.workshop", Icon.link, () -> { - Map builtin = maps.all().find(m -> m.name().equals(editor.getTags().get("name", "").trim())); + Map builtin = maps.all().find(m -> m.name().equals(editor.tags.get("name", "").trim())); - if(editor.getTags().containsKey("steamid") && builtin != null && !builtin.custom){ - platform.viewListingID(editor.getTags().get("steamid")); + if(editor.tags.containsKey("steamid") && builtin != null && !builtin.custom){ + platform.viewListingID(editor.tags.get("steamid")); return; } Map map = save(); - if(editor.getTags().containsKey("steamid") && map != null){ + if(editor.tags.containsKey("steamid") && map != null){ platform.viewListing(map); return; } @@ -156,7 +155,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ } platform.publish(map); - }).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.getTags().containsKey("steamid") ? editor.getTags().get("author").equals(player.name) ? "@workshop.listing" : "@view.workshop" : "@editor.publish.workshop")); + }).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.tags.containsKey("steamid") ? editor.tags.get("author").equals(player.name) ? "@workshop.listing" : "@view.workshop" : "@editor.publish.workshop")); menu.cont.row(); } @@ -235,7 +234,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ state.rules = (lastSavedRules == null ? new Rules() : lastSavedRules); lastSavedRules = null; saved = false; - editor.renderer().updateAll(); + editor.renderer.updateAll(); } private void playtest(){ @@ -254,14 +253,10 @@ public class MapEditorDialog extends Dialog implements Disposable{ "height", editor.height() )); world.endMapLoad(); - //add entities so they update. is this really needed? - for(Tile tile : world.tiles){ - if(tile.build != null){ - tile.build.add(); - } - } player.set(world.width() * tilesize/2f, world.height() * tilesize/2f); player.clearUnit(); + Groups.unit.clear(); + Groups.build.clear(); logic.play(); }); } @@ -269,10 +264,10 @@ public class MapEditorDialog extends Dialog implements Disposable{ public @Nullable Map save(){ boolean isEditor = state.rules.editor; state.rules.editor = false; - String name = editor.getTags().get("name", "").trim(); - editor.getTags().put("rules", JsonIO.write(state.rules)); - editor.getTags().remove("width"); - editor.getTags().remove("height"); + String name = editor.tags.get("name", "").trim(); + editor.tags.put("rules", JsonIO.write(state.rules)); + editor.tags.remove("width"); + editor.tags.remove("height"); player.clearUnit(); @@ -286,7 +281,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(map != null && !map.custom){ handleSaveBuiltin(map); }else{ - returned = maps.saveMap(editor.getTags()); + returned = maps.saveMap(editor.tags); ui.showInfoFade("@editor.saved"); } } @@ -357,7 +352,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ @Override public void dispose(){ - editor.renderer().dispose(); + editor.renderer.dispose(); } public void beginEditMap(Fi file){ @@ -562,6 +557,12 @@ public class MapEditorDialog extends Dialog implements Disposable{ t.add(slider).width(size * 3f - 20).padTop(4f); }).padTop(5).growX().top(); + mid.row(); + + mid.table(t -> { + t.button("@editor.center", Icon.move, Styles.cleart, () -> view.center()).growX().margin(9f); + }).growX().top(); + }).margin(0).left().growY(); @@ -576,22 +577,20 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(Core.input.ctrl()){ //alt mode select - for(int i = 0; i < view.getTool().altModes.length + 1; i++){ - if(Core.input.keyTap(KeyCode.valueOf("num" + (i + 1)))){ - view.getTool().mode = i - 1; + for(int i = 0; i < view.getTool().altModes.length; i++){ + if(i + 1 < KeyCode.numbers.length && Core.input.keyTap(KeyCode.numbers[i + 1])){ + view.getTool().mode = i; } } }else{ - //tool select - for(int i = 0; i < EditorTool.values().length; i++){ - if(Core.input.keyTap(KeyCode.valueOf("num" + (i + 1)))){ - view.setTool(EditorTool.values()[i]); + for(EditorTool tool : EditorTool.all){ + if(Core.input.keyTap(tool.key)){ + view.setTool(tool); break; } } } - if(Core.input.keyTap(KeyCode.escape)){ if(!menu.isShown()){ menu.show(); @@ -619,14 +618,14 @@ public class MapEditorDialog extends Dialog implements Disposable{ for(int x = 0; x < editor.width(); x++){ for(int y = 0; y < editor.height(); y++){ Tile tile = editor.tile(x, y); - if(tile.block().breakable && tile.block() instanceof Rock){ + if(tile.block().breakable && tile.block() instanceof Boulder){ tile.setBlock(Blocks.air); - editor.renderer().updatePoint(x, y); + editor.renderer.updatePoint(x, y); } if(tile.overlay() != Blocks.air && tile.overlay() != Blocks.spawn){ tile.setOverlay(Blocks.air); - editor.renderer().updatePoint(x, y); + editor.renderer.updatePoint(x, y); } } } diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index 7f540750d9..fae31dc7d5 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -144,7 +144,7 @@ public class MapGenerateDialog extends BaseDialog{ } //reset undo stack as generation... messes things up - editor.renderer().updateAll(); + editor.renderer.updateAll(); editor.clearOp(); } @@ -275,6 +275,8 @@ public class MapGenerateDialog extends BaseDialog{ } }).grow().left().pad(6).top(); }).width(280f).pad(3).top().left().fillY(); + + if(++i % cols == 0){ filterTable.row(); } @@ -415,7 +417,7 @@ public class MapGenerateDialog extends BaseDialog{ public void set(Block floor, Block wall, Block ore, Team team){ this.floor = floor.id; this.block = wall.id; - this.ore = ore.id; + this.ore = !floor.asFloor().hasSurface() ? 0 : ore.id; this.team = (byte)team.id; } diff --git a/core/src/mindustry/editor/MapInfoDialog.java b/core/src/mindustry/editor/MapInfoDialog.java index 9e217c335f..dd9959b199 100644 --- a/core/src/mindustry/editor/MapInfoDialog.java +++ b/core/src/mindustry/editor/MapInfoDialog.java @@ -1,8 +1,8 @@ package mindustry.editor; import arc.*; -import arc.struct.*; import arc.scene.ui.*; +import arc.struct.*; import mindustry.*; import mindustry.game.*; import mindustry.io.*; @@ -29,7 +29,7 @@ public class MapInfoDialog extends BaseDialog{ private void setup(){ cont.clear(); - ObjectMap tags = editor.getTags(); + ObjectMap tags = editor.tags; cont.pane(t -> { t.add("@editor.mapname").padRight(8).left(); @@ -73,8 +73,8 @@ public class MapInfoDialog extends BaseDialog{ t.row(); t.add("@editor.generation").padRight(8).left(); t.button("@edit", () -> { - generate.show(Vars.maps.readFilters(editor.getTags().get("genfilters", "")), - filters -> editor.getTags().put("genfilters", JsonIO.write(filters))); + generate.show(Vars.maps.readFilters(editor.tags.get("genfilters", "")), + filters -> editor.tags.put("genfilters", JsonIO.write(filters))); hide(); }).left().width(200f); diff --git a/core/src/mindustry/editor/MapLoadDialog.java b/core/src/mindustry/editor/MapLoadDialog.java index 53673ae9d2..4ed63a1a7f 100644 --- a/core/src/mindustry/editor/MapLoadDialog.java +++ b/core/src/mindustry/editor/MapLoadDialog.java @@ -8,7 +8,7 @@ import mindustry.maps.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; -import static mindustry.Vars.maps; +import static mindustry.Vars.*; public class MapLoadDialog extends BaseDialog{ private Map selected = null; diff --git a/core/src/mindustry/editor/MapRenderer.java b/core/src/mindustry/editor/MapRenderer.java index f926da9903..919c534128 100644 --- a/core/src/mindustry/editor/MapRenderer.java +++ b/core/src/mindustry/editor/MapRenderer.java @@ -24,7 +24,7 @@ public class MapRenderer implements Disposable{ public MapRenderer(MapEditor editor){ this.editor = editor; - this.texture = Core.atlas.find("clear-editor").getTexture(); + this.texture = Core.atlas.find("clear-editor").texture; } public void resize(int width, int height){ @@ -110,13 +110,13 @@ public class MapRenderer implements Disposable{ if(wall != Blocks.air && wall.synthetic()){ region = !Core.atlas.isFound(wall.editorIcon()) || !center ? Core.atlas.find("clear-editor") : wall.editorIcon(); - float width = region.getWidth() * Draw.scl, height = region.getHeight() * Draw.scl; + float width = region.width * Draw.scl, height = region.height * Draw.scl; mesh.draw(idxWall, region, wx * tilesize + wall.offset + (tilesize - width) / 2f, wy * tilesize + wall.offset + (tilesize - height) / 2f, width, height, - tile.build == null || !wall.rotate ? 0 : tile.build.rotdeg() - 90); + tile.build == null || !wall.rotate ? 0 : tile.build.rotdeg()); }else{ region = floor.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, floor.editorVariantRegions().length - 1)]; @@ -130,15 +130,15 @@ public class MapRenderer implements Disposable{ region = Core.atlas.find("block-border-editor"); }else if(!wall.synthetic() && wall != Blocks.air && center){ region = !Core.atlas.isFound(wall.editorIcon()) ? Core.atlas.find("clear-editor") : wall.editorIcon(); - offsetX = tilesize / 2f - region.getWidth() / 2f * Draw.scl; - offsetY = tilesize / 2f - region.getHeight() / 2f * Draw.scl; + offsetX = tilesize / 2f - region.width / 2f * Draw.scl; + offsetY = tilesize / 2f - region.height / 2f * Draw.scl; }else if(wall == Blocks.air && !tile.overlay().isAir()){ region = tile.overlay().editorVariantRegions()[Mathf.randomSeed(idxWall, 0, tile.overlay().editorVariantRegions().length - 1)]; }else{ region = Core.atlas.find("clear-editor"); } - float width = region.getWidth() * Draw.scl, height = region.getHeight() * Draw.scl; + float width = region.width * Draw.scl, height = region.height * Draw.scl; if(!wall.synthetic() && wall != Blocks.air && !wall.isMultiblock()){ offsetX = 0; offsetY = 0; diff --git a/core/src/mindustry/editor/MapView.java b/core/src/mindustry/editor/MapView.java index 7689e7aa48..a54c0f49b8 100644 --- a/core/src/mindustry/editor/MapView.java +++ b/core/src/mindustry/editor/MapView.java @@ -1,24 +1,22 @@ package mindustry.editor; -import arc.Core; -import arc.graphics.Color; +import arc.*; +import arc.graphics.*; import arc.graphics.g2d.*; -import arc.input.GestureDetector; -import arc.input.GestureDetector.GestureListener; -import arc.input.KeyCode; -import arc.math.Mathf; +import arc.input.*; +import arc.input.GestureDetector.*; +import arc.math.*; import arc.math.geom.*; -import arc.scene.Element; +import arc.scene.*; import arc.scene.event.*; -import arc.scene.ui.TextField; -import arc.scene.ui.layout.Scl; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; import arc.util.*; -import mindustry.graphics.Pal; -import mindustry.input.Binding; -import mindustry.ui.GridImage; +import mindustry.graphics.*; +import mindustry.input.*; +import mindustry.ui.*; -import static mindustry.Vars.mobile; -import static mindustry.Vars.ui; +import static mindustry.Vars.*; public class MapView extends Element implements GestureListener{ private MapEditor editor; @@ -173,6 +171,10 @@ public class MapView extends Element implements GestureListener{ this.grid = grid; } + public void center(){ + offsetx = offsety = 0; + } + @Override public void act(float delta){ super.act(delta); @@ -248,14 +250,20 @@ public class MapView extends Element implements GestureListener{ Draw.color(Pal.remove); Lines.stroke(2f); Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2); - editor.renderer().draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); + editor.renderer.draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); Draw.reset(); if(grid){ Draw.color(Color.gray); image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); image.draw(); - Draw.color(); + + Lines.stroke(3f); + Draw.color(Pal.accent); + Lines.line(centerx - sclwidth/2f, centery, centerx + sclwidth/2f, centery); + Lines.line(centerx, centery - sclheight/2f, centerx, centery + sclheight/2f); + + Draw.reset(); } int index = 0; diff --git a/core/src/mindustry/editor/OperationStack.java b/core/src/mindustry/editor/OperationStack.java index 0558de14bc..91bb183457 100755 --- a/core/src/mindustry/editor/OperationStack.java +++ b/core/src/mindustry/editor/OperationStack.java @@ -1,6 +1,6 @@ package mindustry.editor; -import arc.struct.Seq; +import arc.struct.*; public class OperationStack{ private static final int maxSize = 10; diff --git a/core/src/mindustry/editor/WaveGraph.java b/core/src/mindustry/editor/WaveGraph.java index f71a5e6f7d..14b2416085 100644 --- a/core/src/mindustry/editor/WaveGraph.java +++ b/core/src/mindustry/editor/WaveGraph.java @@ -32,7 +32,6 @@ public class WaveGraph extends Table{ rect((x, y, width, height) -> { Lines.stroke(Scl.scl(3f)); - Lines.precise(true); GlyphLayout lay = Pools.obtain(GlyphLayout.class, GlyphLayout::new); Font font = Fonts.outline; @@ -122,7 +121,6 @@ public class WaveGraph extends Table{ Pools.free(lay); - Lines.precise(false); Draw.reset(); }).pad(4).padBottom(10).grow(); diff --git a/core/src/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java index 5ff4bee8a6..e22891eba5 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -77,19 +77,24 @@ public class Damage{ } } - /** Collides a bullet with blocks in a laser, taking into account absorption blocks. Resulting length is stored in the bullet's fdata. */ - public static float collideLaser(Bullet b, float length){ + public static float findLaserLength(Bullet b, float length){ Tmp.v1.trns(b.rotation(), length); furthest = null; - world.raycast(b.tileX(), b.tileY(), world.toTile(b.x + Tmp.v1.x), world.toTile(b.y + Tmp.v1.y), + boolean found = world.raycast(b.tileX(), b.tileY(), world.toTile(b.x + Tmp.v1.x), world.toTile(b.y + Tmp.v1.y), (x, y) -> (furthest = world.tile(x, y)) != null && furthest.team() != b.team && furthest.block().absorbLasers); - float resultLength = furthest != null ? Math.max(6f, b.dst(furthest.worldx(), furthest.worldy())) : length; + return found && furthest != null ? Math.max(6f, b.dst(furthest.worldx(), furthest.worldy())) : length; + } - Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), resultLength); - b.fdata = furthest != null ? resultLength : length; + /** Collides a bullet with blocks in a laser, taking into account absorption blocks. Resulting length is stored in the bullet's fdata. */ + public static float collideLaser(Bullet b, float length, boolean large){ + float resultLength = findLaserLength(b, length); + + collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), resultLength, large); + + b.fdata = resultLength; return resultLength; } @@ -103,6 +108,8 @@ public class Damage{ * Only enemies of the specified team are damaged. */ public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){ + length = findLaserLength(hitter, length); + collidedBlocks.clear(); tr.trns(angle, length); Intc2 collider = (cx, cy) -> { @@ -150,13 +157,8 @@ public class Damage{ if(!e.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)) return; e.hitbox(hitrect); - Rect other = hitrect; - other.y -= expand; - other.x -= expand; - other.width += expand * 2; - other.height += expand * 2; - Vec2 vec = Geometry.raycastRect(x, y, x2, y2, other); + Vec2 vec = Geometry.raycastRect(x, y, x2, y2, hitrect.grow(expand * 2)); if(vec != null){ effect.at(vec.x, vec.y); @@ -182,7 +184,6 @@ public class Damage{ Building tile = world.build(cx, cy); if(tile != null && tile.team != hitter.team){ tmpBuilding = tile; - //TODO return tile return true; } return false; diff --git a/core/src/mindustry/entities/Effect.java b/core/src/mindustry/entities/Effect.java index 62ebe99d32..920729e608 100644 --- a/core/src/mindustry/entities/Effect.java +++ b/core/src/mindustry/entities/Effect.java @@ -8,7 +8,6 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.content.*; import mindustry.gen.*; @@ -40,7 +39,7 @@ public class Effect{ } public Effect(float life, Cons renderer){ - this(life, 32f, renderer); + this(life,50f, renderer); } public Effect ground(){ @@ -86,12 +85,14 @@ public class Effect{ create(this, x, y, rotation, Color.white, data); } - public void render(int id, Color color, float life, float rotation, float x, float y, Object data){ + public float render(int id, Color color, float life, float lifetime, float rotation, float x, float y, Object data){ container.set(id, color, life, lifetime, rotation, x, y, data); Draw.z(ground ? Layer.debris : Layer.effect); Draw.reset(); renderer.get(container); Draw.reset(); + + return container.lifetime; } public static @Nullable Effect get(int id){ @@ -125,13 +126,13 @@ public class Effect{ if(view.overlaps(pos)){ EffectState entity = EffectState.create(); - entity.effect(effect); - entity.rotation(rotation); - entity.data(data); - entity.lifetime(effect.lifetime); + entity.effect = effect; + entity.rotation = rotation; + entity.data = (data); + entity.lifetime = (effect.lifetime); entity.set(x, y); - entity.color().set(color); - if(data instanceof Posc) entity.parent((Posc)data); + entity.color.set(color); + if(data instanceof Posc) entity.parent = ((Posc)data); entity.add(); } } @@ -145,7 +146,7 @@ public class Effect{ if(headless || region == null || !Core.atlas.isFound(region)) return; Tile tile = world.tileWorld(x, y); - if(tile == null || tile.floor().isLiquid) return; + if(tile == null || !tile.floor().hasSurface()) return; Decal decal = Decal.create(); decal.set(x, y); diff --git a/core/src/mindustry/entities/EntityCollisions.java b/core/src/mindustry/entities/EntityCollisions.java index 2d8402e92c..b4139991a4 100644 --- a/core/src/mindustry/entities/EntityCollisions.java +++ b/core/src/mindustry/entities/EntityCollisions.java @@ -127,7 +127,7 @@ public class EntityCollisions{ public static boolean legsSolid(int x, int y){ Tile tile = world.tile(x, y); - return tile == null || tile.staticDarkness() >= 2; + return tile == null || tile.staticDarkness() >= 2 || tile.floor().solid; } public static boolean waterSolid(int x, int y){ diff --git a/core/src/mindustry/entities/EntityGroup.java b/core/src/mindustry/entities/EntityGroup.java index 5a1be4bdc3..2135d9d6aa 100644 --- a/core/src/mindustry/entities/EntityGroup.java +++ b/core/src/mindustry/entities/EntityGroup.java @@ -8,7 +8,7 @@ import mindustry.gen.*; import java.util.*; -import static mindustry.Vars.collisions; +import static mindustry.Vars.*; /** Represents a group of a certain type of entity.*/ @SuppressWarnings("unchecked") @@ -57,8 +57,9 @@ public class EntityGroup implements Iterable{ each(Entityc::update); } - public void copy(Seq arr){ + public Seq copy(Seq arr){ arr.addAll(array); + return arr; } public void each(Cons cons){ diff --git a/core/src/mindustry/entities/Lightning.java b/core/src/mindustry/entities/Lightning.java index dbc7f616c9..738bfa1f1e 100644 --- a/core/src/mindustry/entities/Lightning.java +++ b/core/src/mindustry/entities/Lightning.java @@ -24,17 +24,15 @@ public class Lightning{ /** Create a lighting branch at a location. Use Team.derelict to damage everyone. */ public static void create(Team team, Color color, float damage, float x, float y, float targetAngle, int length){ - createLightingInternal(null, lastSeed++, team, color, damage, x, y, targetAngle, length); + createLightningInternal(null, lastSeed++, team, color, damage, x, y, targetAngle, length); } /** Create a lighting branch at a location. Uses bullet parameters. */ public static void create(Bullet bullet, Color color, float damage, float x, float y, float targetAngle, int length){ - createLightingInternal(bullet, lastSeed++, bullet.team, color, damage, x, y, targetAngle, length); + createLightningInternal(bullet, lastSeed++, bullet.team, color, damage, x, y, targetAngle, length); } - //TODO remote method - //@Remote(called = Loc.server, unreliable = true) - private static void createLightingInternal(Bullet hitter, int seed, Team team, Color color, float damage, float x, float y, float rotation, int length){ + private static void createLightningInternal(Bullet hitter, int seed, Team team, Color color, float damage, float x, float y, float rotation, int length){ random.setSeed(seed); hit.clear(); diff --git a/core/src/mindustry/entities/Puddles.java b/core/src/mindustry/entities/Puddles.java index 461e486001..0abdae4928 100644 --- a/core/src/mindustry/entities/Puddles.java +++ b/core/src/mindustry/entities/Puddles.java @@ -45,6 +45,10 @@ public class Puddles{ return; } + if(tile.floor().solid){ + return; + } + Puddle p = map.get(tile.pos()); if(p == null){ Puddle puddle = Puddle.create(); diff --git a/core/src/mindustry/entities/Units.java b/core/src/mindustry/entities/Units.java index c93ecaffce..c6f592f30f 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -1,5 +1,6 @@ package mindustry.entities; +import arc.*; import arc.func.*; import arc.math.geom.*; import mindustry.annotations.Annotations.*; @@ -18,6 +19,15 @@ public class Units{ private static float cdist; private static boolean boolResult; + @Remote(called = Loc.server) + public static void unitCapDeath(Unit unit){ + if(unit != null){ + unit.dead = true; + Fx.unitCapKill.at(unit); + Core.app.post(() -> Call.unitDestroy(unit.id)); + } + } + @Remote(called = Loc.server) public static void unitDeath(int uid){ Unit unit = Groups.unit.getByID(uid); @@ -32,6 +42,21 @@ public class Units{ } } + //destroys immediately + @Remote(called = Loc.server) + public static void unitDestroy(int uid){ + Unit unit = Groups.unit.getByID(uid); + + //if there's no unit don't add it later and get it stuck as a ghost + if(netClient != null){ + netClient.addRemovedEntity(uid); + } + + if(unit != null){ + unit.destroy(); + } + } + @Remote(called = Loc.server) public static void unitDespawn(Unit unit){ Fx.unitDespawn.at(unit.x, unit.y, 0, unit); @@ -40,7 +65,7 @@ public class Units{ /** @return whether a new instance of a unit of this team can be created. */ public static boolean canCreate(Team team, UnitType type){ - return teamIndex.countType(team, type) < getCap(team); + return team.data().countType(type) < getCap(team); } public static int getCap(Team team){ @@ -99,7 +124,7 @@ public class Units{ nearby(x, y, width, height, unit -> { if(boolResult) return; - if(unit.isGrounded() == ground){ + if((unit.isGrounded() && !unit.type().hovering) == ground){ unit.hitbox(hitrect); if(hitrect.overlaps(x, y, width, height)){ @@ -150,6 +175,18 @@ public class Units{ } } + /** Returns the closest target enemy. First, units are checked, then tile entities. */ + public static Teamc bestTarget(Team team, float x, float y, float range, Boolf unitPred, Boolf tilePred, Sortf sort){ + if(team == Team.derelict) return null; + + Unit unit = bestEnemy(team, x, y, range, unitPred, sort); + if(unit != null){ + return unit; + }else{ + return findEnemyTile(team, x, y, range, tilePred); + } + } + /** Returns the closest enemy of this team. Filter by predicate. */ public static Unit closestEnemy(Team team, float x, float y, float range, Boolf predicate){ if(team == Team.derelict) return null; @@ -170,6 +207,26 @@ public class Units{ return result; } + /** Returns the closest enemy of this team using a custom comparison function. Filter by predicate. */ + public static Unit bestEnemy(Team team, float x, float y, float range, Boolf predicate, Sortf sort){ + if(team == Team.derelict) return null; + + result = null; + cdist = 0f; + + nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> { + if(e.dead() || !predicate.get(e) || !e.within(x, y, range)) return; + + float cost = sort.cost(e, x, y); + if(result == null || cost < cdist){ + result = e; + cdist = cost; + } + }); + + return result; + } + /** Returns the closest ally of this team. Filter by predicate. No range. */ public static Unit closest(Team team, float x, float y, Boolf predicate){ result = null; @@ -227,7 +284,7 @@ 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){ - teamIndex.tree(team).intersect(x, y, width, height, cons); + team.data().tree().intersect(x, y, width, height, cons); } /** Iterates over all units in a circle around this position. */ @@ -259,7 +316,7 @@ public class Units{ //inactive teams have no cache, check everything //TODO cache all teams with units OR blocks for(Team other : Team.all){ - if(other != team && teamIndex.count(other) > 0){ + if(other != team && other.data().unitCount > 0){ nearby(other, x, y, width, height, cons); } } @@ -272,4 +329,7 @@ public class Units{ nearbyEnemies(team, rect.x, rect.y, rect.width, rect.height, cons); } + public interface Sortf{ + float cost(Unit unit, float x, float y); + } } diff --git a/core/src/mindustry/entities/abilities/Ability.java b/core/src/mindustry/entities/abilities/Ability.java index d8aed57239..466bfc1980 100644 --- a/core/src/mindustry/entities/abilities/Ability.java +++ b/core/src/mindustry/entities/abilities/Ability.java @@ -2,7 +2,16 @@ package mindustry.entities.abilities; import mindustry.gen.*; -public interface Ability{ - default void update(Unit unit){} - default void draw(Unit unit){} +public abstract class Ability implements Cloneable{ + public void update(Unit unit){} + public void draw(Unit unit){} + + public Ability copy(){ + try{ + return (Ability)clone(); + }catch(CloneNotSupportedException e){ + //I am disgusted + throw new RuntimeException("java sucks", e); + } + } } diff --git a/core/src/mindustry/entities/abilities/ForceFieldAbility.java b/core/src/mindustry/entities/abilities/ForceFieldAbility.java index 33aa408602..fa9fa5e2c8 100644 --- a/core/src/mindustry/entities/abilities/ForceFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ForceFieldAbility.java @@ -11,7 +11,7 @@ import mindustry.content.*; import mindustry.gen.*; import mindustry.graphics.*; -public class ForceFieldAbility implements Ability{ +public class ForceFieldAbility extends Ability{ /** Shield radius. */ public float radius = 60f; /** Shield regen speed in damage/tick. */ @@ -21,22 +21,26 @@ public class ForceFieldAbility implements Ability{ /** Cooldown after the shield is broken, in ticks. */ public float cooldown = 60f * 5; - private float realRad; - private Unit paramUnit; - private final Cons shieldConsumer = trait -> { - if(trait.team() != paramUnit.team && Intersector.isInsideHexagon(paramUnit.x, paramUnit.y, realRad * 2f, trait.x(), trait.y()) && paramUnit.shield > 0){ + /** State. */ + protected float radiusScale, alpha; + + private static float realRad; + private static Unit paramUnit; + private static ForceFieldAbility paramField; + private static final Cons shieldConsumer = trait -> { + if(trait.team != paramUnit.team && trait.type.absorbable && Intersector.isInsideHexagon(paramUnit.x, paramUnit.y, realRad * 2f, trait.x(), trait.y()) && paramUnit.shield > 0){ trait.absorb(); Fx.absorb.at(trait); //break shield if(paramUnit.shield <= trait.damage()){ - paramUnit.shield -= cooldown * regen; + paramUnit.shield -= paramField.cooldown * paramField.regen; - Fx.shieldBreak.at(paramUnit.x, paramUnit.y, radius, paramUnit.team.color); + Fx.shieldBreak.at(paramUnit.x, paramUnit.y, paramField.radius, paramUnit.team.color); } paramUnit.shield -= trait.damage(); - paramUnit.shieldAlpha = 1f; + paramField.alpha = 1f; } }; @@ -55,14 +59,17 @@ public class ForceFieldAbility implements Ability{ unit.shield += Time.delta * regen; } + alpha = Math.max(alpha - Time.delta/10f, 0f); + if(unit.shield > 0){ - unit.timer2 = Mathf.lerpDelta(unit.timer2, 1f, 0.06f); + radiusScale = Mathf.lerpDelta(radiusScale, 1f, 0.06f); paramUnit = unit; + paramField = this; checkRadius(unit); Groups.bullet.intersect(unit.x - realRad, unit.y - realRad, realRad * 2f, realRad * 2f, shieldConsumer); }else{ - unit.timer2 = 0f; + radiusScale = 0f; } } @@ -73,7 +80,7 @@ public class ForceFieldAbility implements Ability{ if(unit.shield > 0){ Draw.z(Layer.shields); - Draw.color(unit.team.color, Color.white, Mathf.clamp(unit.shieldAlpha)); + Draw.color(unit.team.color, Color.white, Mathf.clamp(alpha)); if(Core.settings.getBool("animatedshields")){ Fill.poly(unit.x, unit.y, 6, realRad); @@ -89,6 +96,6 @@ public class ForceFieldAbility implements Ability{ private void checkRadius(Unit unit){ //timer2 is used to store radius scale as an effect - realRad = unit.timer2 * radius; + realRad = radiusScale * radius; } } diff --git a/core/src/mindustry/entities/abilities/HealFieldAbility.java b/core/src/mindustry/entities/abilities/HealFieldAbility.java index 3e12e96963..90f800ec84 100644 --- a/core/src/mindustry/entities/abilities/HealFieldAbility.java +++ b/core/src/mindustry/entities/abilities/HealFieldAbility.java @@ -5,12 +5,13 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; -public class HealFieldAbility implements Ability{ +public class HealFieldAbility extends Ability{ public float amount = 1, reload = 100, range = 60; public Effect healEffect = Fx.heal; - public Effect activeEffect = Fx.healWave; + public Effect activeEffect = Fx.healWaveDynamic; - private boolean wasHealed = false; + protected float timer; + protected boolean wasHealed = false; HealFieldAbility(){} @@ -22,9 +23,9 @@ public class HealFieldAbility implements Ability{ @Override public void update(Unit unit){ - unit.timer1 += Time.delta; + timer += Time.delta; - if(unit.timer1 >= reload){ + if(timer >= reload){ wasHealed = false; Units.nearby(unit.team, unit.x, unit.y, range, other -> { @@ -36,10 +37,10 @@ public class HealFieldAbility implements Ability{ }); if(wasHealed){ - activeEffect.at(unit); + activeEffect.at(unit, range); } - unit.timer1 = 0f; + timer = 0f; } } } diff --git a/core/src/mindustry/entities/abilities/ShieldFieldAbility.java b/core/src/mindustry/entities/abilities/ShieldFieldAbility.java index f7726e8e92..739751f6c1 100644 --- a/core/src/mindustry/entities/abilities/ShieldFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ShieldFieldAbility.java @@ -5,12 +5,13 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; -public class ShieldFieldAbility implements Ability{ +public class ShieldFieldAbility extends Ability{ public float amount = 1, max = 100f, reload = 100, range = 60; public Effect applyEffect = Fx.shieldApply; public Effect activeEffect = Fx.shieldWave; - private boolean applied = false; + protected float timer; + protected boolean applied = false; ShieldFieldAbility(){} @@ -23,9 +24,9 @@ public class ShieldFieldAbility implements Ability{ @Override public void update(Unit unit){ - unit.timer1 += Time.delta; + timer += Time.delta; - if(unit.timer1 >= reload){ + if(timer >= reload){ applied = false; Units.nearby(unit.team, unit.x, unit.y, range, other -> { @@ -41,7 +42,7 @@ public class ShieldFieldAbility implements Ability{ activeEffect.at(unit); } - unit.timer1 = 0f; + timer = 0f; } } } diff --git a/core/src/mindustry/entities/abilities/StatusFieldAbility.java b/core/src/mindustry/entities/abilities/StatusFieldAbility.java index 641e068a0f..857cfde5cf 100644 --- a/core/src/mindustry/entities/abilities/StatusFieldAbility.java +++ b/core/src/mindustry/entities/abilities/StatusFieldAbility.java @@ -1,21 +1,22 @@ package mindustry.entities.abilities; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.type.*; -public class StatusFieldAbility implements Ability{ - public @NonNull StatusEffect effect; +public class StatusFieldAbility extends Ability{ + public StatusEffect effect; public float duration = 60, reload = 100, range = 20; public Effect applyEffect = Fx.heal; public Effect activeEffect = Fx.overdriveWave; + protected float timer; + StatusFieldAbility(){} - public StatusFieldAbility(@NonNull StatusEffect effect, float duration, float reload, float range){ + public StatusFieldAbility(StatusEffect effect, float duration, float reload, float range){ this.duration = duration; this.reload = reload; this.range = range; @@ -24,9 +25,9 @@ public class StatusFieldAbility implements Ability{ @Override public void update(Unit unit){ - unit.timer2 += Time.delta; + timer += Time.delta; - if(unit.timer2 >= reload){ + if(timer >= reload){ Units.nearby(unit.team, unit.x, unit.y, range, other -> { other.apply(effect, duration); @@ -34,7 +35,7 @@ public class StatusFieldAbility implements Ability{ activeEffect.at(unit); - unit.timer2 = 0f; + timer = 0f; } } } diff --git a/core/src/mindustry/entities/abilities/UnitSpawnAbility.java b/core/src/mindustry/entities/abilities/UnitSpawnAbility.java new file mode 100644 index 0000000000..74140114d9 --- /dev/null +++ b/core/src/mindustry/entities/abilities/UnitSpawnAbility.java @@ -0,0 +1,59 @@ +package mindustry.entities.abilities; + +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; + +public class UnitSpawnAbility extends Ability{ + public UnitType type; + public float spawnTime = 60f, spawnX, spawnY; + public Effect spawnEffect = Fx.spawn; + + protected float timer; + + public UnitSpawnAbility(UnitType type, float spawnTime, float spawnX, float spawnY){ + this.type = type; + this.spawnTime = spawnTime; + this.spawnX = spawnX; + this.spawnY = spawnY; + } + + public UnitSpawnAbility(){ + } + + @Override + public void update(Unit unit){ + timer += Time.delta; + + if(timer >= spawnTime && Units.canCreate(unit.team, type)){ + + float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX); + spawnEffect.at(x, y); + Unit u = type.create(unit.team); + u.set(x, y); + u.rotation = unit.rotation; + if(!Vars.net.client()){ + u.add(); + } + + timer = 0f; + } + } + + @Override + public void draw(Unit unit){ + if(Units.canCreate(unit.team, type)){ + Draw.draw(Draw.z(), () -> { + float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX); + Drawf.construct(x, y, type.icon(Cicon.full), unit.rotation - 90, timer / spawnTime, 1f, timer); + }); + } + } +} diff --git a/core/src/mindustry/entities/bullet/BasicBulletType.java b/core/src/mindustry/entities/bullet/BasicBulletType.java index e2a829e966..ac33c28868 100644 --- a/core/src/mindustry/entities/bullet/BasicBulletType.java +++ b/core/src/mindustry/entities/bullet/BasicBulletType.java @@ -1,16 +1,17 @@ package mindustry.entities.bullet; -import arc.Core; -import arc.graphics.Color; -import arc.graphics.g2d.Draw; -import arc.graphics.g2d.TextureRegion; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; import arc.math.*; +import arc.util.*; import mindustry.gen.*; -import mindustry.graphics.Pal; +import mindustry.graphics.*; /** An extended BulletType for most ammo-based bullets shot from turrets and units. */ public class BasicBulletType extends BulletType{ public Color backColor = Pal.bulletYellowBack, frontColor = Pal.bulletYellow; + public Color mixColorFrom = new Color(1f, 1f, 1f, 0f), mixColorTo = new Color(1f, 1f, 1f, 0f); public float width = 5f, height = 7f; public float shrinkX = 0f, shrinkY = 0.5f; public float spin = 0; @@ -45,10 +46,15 @@ public class BasicBulletType extends BulletType{ float width = this.width * ((1f - shrinkX) + shrinkX * b.fout()); float offset = -90 + (spin != 0 ? Mathf.randomSeed(b.id, 360f) + b.time * spin : 0f); + Color mix = Tmp.c1.set(mixColorFrom).lerp(mixColorTo, b.fin()); + + Draw.mixcol(mix, mix.a); + Draw.color(backColor); Draw.rect(backRegion, b.x, b.y, width, height, b.rotation() + offset); Draw.color(frontColor); Draw.rect(frontRegion, b.x, b.y, width, height, b.rotation() + offset); - Draw.color(); + + Draw.reset(); } } diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 908621e508..0c3a605f1b 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -3,7 +3,6 @@ package mindustry.entities.bullet; import arc.audio.*; import arc.graphics.*; import arc.math.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -14,6 +13,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.*; import static mindustry.Vars.*; @@ -24,7 +24,8 @@ public abstract class BulletType extends Content{ public float hitSize = 4; public float drawSize = 40f; public float drag = 0f; - public boolean pierce; + public boolean pierce, pierceBuilding; + public int pierceCap = -1; public Effect hitEffect, despawnEffect; /** Effect created when shooting. */ @@ -69,13 +70,25 @@ public abstract class BulletType extends Content{ public boolean scaleVelocity; /** Whether this bullet can be hit by point defense. */ public boolean hittable = true; + /** Whether this bullet can be reflected. */ + public boolean reflectable = true; + /** Whether this projectile can be absorbed by shields. */ + public boolean absorbable = true; + /** Whether to move the bullet back depending on delta to fix some delta-time realted issues. + * Do not change unless you know what you're doing. */ + public boolean backMove = true; + /** Bullet range override. */ + public float range = -1f; + /** Heal Bullet Percent **/ + public float healPercent = 0f; //additional effects public float fragCone = 360f; + public float fragAngle = 0f; public int fragBullets = 9; public float fragVelocityMin = 0.2f, fragVelocityMax = 1f, fragLifeMin = 1f, fragLifeMax = 1f; - public BulletType fragBullet = null; + public @Nullable BulletType fragBullet = null; public Color hitColor = Color.white; public Color trailColor = Pal.missileYellowBack; @@ -94,13 +107,15 @@ public abstract class BulletType extends Content{ public Color lightningColor = Pal.surge; public int lightning; - public int lightningLength = 5; + public int lightningLength = 5, lightningLengthRand = 0; /** Use a negative value to use default bullet damage. */ public float lightningDamage = -1; + public float lightningCone = 360f; + public float lightningAngle = 0f; public float weaveScale = 1f; public float weaveMag = -1f; - public float hitShake = 0f; + public float hitShake = 0f, despawnShake = 0f; public int puddles; public float puddleRange; @@ -124,15 +139,27 @@ public abstract class BulletType extends Content{ /** Returns maximum distance the bullet this bullet type has can travel. */ public float range(){ - return speed * lifetime * (1f - drag); + return Math.max(speed * lifetime * (1f - drag), range); } public boolean collides(Bullet bullet, Building tile){ - return true; + return healPercent <= 0.001f || tile.team != bullet.team || tile.healthf() < 1f; } - public void hitTile(Bullet b, Building tile){ + public void hitTile(Bullet b, Building tile, float initialHealth){ + if(status == StatusEffects.burning) { + Fires.create(tile.tile); + } hit(b); + + if(healPercent > 0f && tile.team == b.team && !(tile.block instanceof ConstructBlock)){ + Fx.healBlockFull.at(tile.x, tile.y, tile.block.size, Pal.heal); + tile.heal(healPercent / 100f * tile.maxHealth()); + } + } + + public void hitEntity(Bullet b, Hitboxc other, float initialHealth){ + } public void hit(Bullet b){ @@ -148,7 +175,7 @@ public abstract class BulletType extends Content{ if(fragBullet != null){ for(int i = 0; i < fragBullets; i++){ float len = Mathf.random(1f, 7f); - float a = b.rotation() + Mathf.range(fragCone/2); + float a = b.rotation() + Mathf.range(fragCone/2) + fragAngle; fragBullet.create(b, x + Angles.trnsx(a, len), y + Angles.trnsy(a, len), a, Mathf.random(fragVelocityMin, fragVelocityMax), Mathf.random(fragLifeMin, fragLifeMax)); } } @@ -170,10 +197,23 @@ public abstract class BulletType extends Content{ if(status != StatusEffects.none){ Damage.status(b.team, x, y, splashDamageRadius, status, statusDuration, collidesAir, collidesGround); } + + if(healPercent > 0f) { + indexer.eachBlock(b.team, x, y, splashDamageRadius, other -> other.damaged(), other -> { + Fx.healBlockFull.at(other.x, other.y, other.block.size, Pal.heal); + other.heal(healPercent / 100f * other.maxHealth()); + }); + } + + if(status == StatusEffects.burning) { + indexer.eachBlock(null, x, y, splashDamageRadius, other -> other.team != b.team, other -> { + Fires.create(other.tile); + }); + } } for(int i = 0; i < lightning; i++){ - Lightning.create(b, lightningColor, lightningDamage < 0 ? damage : lightningDamage, b.x, b.y, Mathf.random(360f), lightningLength); + Lightning.create(b, lightningColor, lightningDamage < 0 ? damage : lightningDamage, b.x, b.y, b.rotation() + Mathf.range(lightningCone/2) + lightningAngle, lightningLength + Mathf.random(lightningLengthRand)); } } @@ -181,6 +221,8 @@ public abstract class BulletType extends Content{ despawnEffect.at(b.x, b.y, b.rotation(), hitColor); hitSound.at(b); + Effect.shake(despawnShake, despawnShake, b); + if(fragBullet != null || splashDamageRadius > 0 || lightning > 0){ hit(b); } @@ -194,12 +236,17 @@ public abstract class BulletType extends Content{ } public void init(Bullet b){ + if(pierceCap >= 1) { + pierce = true; + //pierceBuilding is not enabled by default, because a bullet may want to *not* pierce buildings + } + if(killShooter && b.owner() instanceof Healthc){ ((Healthc)b.owner()).kill(); } if(instantDisappear){ - b.time(lifetime); + b.time = lifetime; } } @@ -261,17 +308,20 @@ public abstract class BulletType extends Content{ bullet.owner = owner; bullet.team = team; bullet.vel.trns(angle, speed * velocityScl); - bullet.set(x - bullet.vel.x * Time.delta, y - bullet.vel.y * Time.delta); + if(backMove){ + bullet.set(x - bullet.vel.x * Time.delta, y - bullet.vel.y * Time.delta); + }else{ + bullet.set(x, y); + } bullet.lifetime = lifetime * lifetimeScl; bullet.data = data; bullet.drag = drag; bullet.hitSize = hitSize; - bullet.damage = damage < 0 ? this.damage : damage; + bullet.damage = (damage < 0 ? this.damage : damage) * bullet.damageMultiplier(); bullet.add(); - if(keepVelocity && owner instanceof Hitboxc) bullet.vel.add(((Hitboxc)owner).deltaX() / Time.delta, ((Hitboxc)owner).deltaY() / Time.delta); + if(keepVelocity && owner instanceof Velc) bullet.vel.add(((Velc)owner).vel().x, ((Velc)owner).vel().y); return bullet; - } public void createNet(Team team, float x, float y, float angle, float damage, float velocityScl, float lifetimeScl){ diff --git a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java index 1962b97615..a862671040 100644 --- a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java +++ b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java @@ -12,10 +12,13 @@ import mindustry.graphics.*; public class ContinuousLaserBulletType extends BulletType{ public float length = 220f; public float shake = 1f; + public float fadeTime = 16f; public Color[] colors = {Color.valueOf("ec745855"), Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white}; public float[] tscales = {1f, 0.7f, 0.5f, 0.2f}; public float[] strokes = {2f, 1.5f, 1f, 0.3f}; public float[] lenscales = {1f, 1.12f, 1.15f, 1.17f}; + public float width = 9f, oscScl = 0.8f, oscMag = 1.5f; + public boolean largeHit = true; public ContinuousLaserBulletType(float damage){ super(0.001f, damage); @@ -25,6 +28,7 @@ public class ContinuousLaserBulletType extends BulletType{ hitSize = 4; drawSize = 420f; lifetime = 16f; + keepVelocity = false; pierce = true; hittable = false; hitColor = colors[2]; @@ -32,6 +36,8 @@ public class ContinuousLaserBulletType extends BulletType{ incendAmount = 1; incendSpread = 5; incendChance = 0.4f; + lightColor = Color.orange; + absorbable = false; } protected ContinuousLaserBulletType(){ @@ -43,13 +49,19 @@ public class ContinuousLaserBulletType extends BulletType{ return length; } + @Override + public void init(){ + super.init(); + + drawSize = Math.max(drawSize, length*2f); + } + @Override public void update(Bullet b){ - //TODO possible laser absorption from blocks //damage every 5 ticks if(b.timer(1, 5f)){ - Damage.collideLine(b, b.team, hitEffect, b.x, b.y, b.rotation(), length, true); + Damage.collideLine(b, b.team, hitEffect, b.x, b.y, b.rotation(), length, largeHit); } if(shake > 0){ @@ -59,21 +71,23 @@ public class ContinuousLaserBulletType extends BulletType{ @Override public void draw(Bullet b){ - float baseLen = length * b.fout(); + float realLength = Damage.findLaserLength(b, length); + float fout = Mathf.clamp(b.time > b.lifetime - fadeTime ? 1f - (b.time - (lifetime - fadeTime)) / fadeTime : 1f); + float baseLen = realLength * fout; Lines.lineAngle(b.x, b.y, b.rotation(), baseLen); for(int s = 0; s < colors.length; s++){ Draw.color(Tmp.c1.set(colors[s]).mul(1f + Mathf.absin(Time.time(), 1f, 0.1f))); for(int i = 0; i < tscales.length; i++){ Tmp.v1.trns(b.rotation() + 180f, (lenscales[i] - 1f) * 35f); - Lines.stroke((9f + Mathf.absin(Time.time(), 0.8f, 1.5f)) * b.fout() * strokes[s] * tscales[i]); + Lines.stroke((width + Mathf.absin(Time.time(), oscScl, oscMag)) * fout * strokes[s] * tscales[i]); Lines.lineAngle(b.x + Tmp.v1.x, b.y + Tmp.v1.y, b.rotation(), baseLen * lenscales[i], false); } } Tmp.v1.trns(b.rotation(), baseLen * 1.1f); - Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, 40, Color.orange, 0.7f); + Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, 40, lightColor, 0.7f); Draw.reset(); } diff --git a/core/src/mindustry/entities/bullet/HealBulletType.java b/core/src/mindustry/entities/bullet/HealBulletType.java deleted file mode 100644 index 135a7fe14a..0000000000 --- a/core/src/mindustry/entities/bullet/HealBulletType.java +++ /dev/null @@ -1,54 +0,0 @@ -package mindustry.entities.bullet; - -import arc.graphics.*; -import arc.graphics.g2d.*; -import mindustry.content.*; -import mindustry.gen.*; -import mindustry.graphics.*; -import mindustry.world.blocks.*; - -public class HealBulletType extends BulletType{ - protected float healPercent = 3f; - protected float height = 7f, width = 2f; - protected Color backColor = Pal.heal, frontColor = Color.white; - - public HealBulletType(float speed, float damage){ - super(speed, damage); - - shootEffect = Fx.shootHeal; - smokeEffect = Fx.hitLaser; - hitEffect = Fx.hitLaser; - despawnEffect = Fx.hitLaser; - collidesTeam = true; - hittable = false; - } - - public HealBulletType(){ - this(1f, 1f); - } - - @Override - public boolean collides(Bullet b, Building tile){ - return tile.team != b.team || tile.healthf() < 1f; - } - - @Override - public void draw(Bullet b){ - Draw.color(backColor); - Lines.stroke(width); - Lines.lineAngleCenter(b.x, b.y, b.rotation(), height); - Draw.color(frontColor); - Lines.lineAngleCenter(b.x, b.y, b.rotation(), height / 2f); - Draw.reset(); - } - - @Override - public void hitTile(Bullet b, Building tile){ - super.hit(b); - - if(tile.team == b.team && !(tile.block() instanceof ConstructBlock)){ - Fx.healBlockFull.at(tile.x, tile.y, tile.block().size, Pal.heal); - tile.heal(healPercent / 100f * tile.maxHealth()); - } - } -} diff --git a/core/src/mindustry/entities/bullet/LaserBoltBulletType.java b/core/src/mindustry/entities/bullet/LaserBoltBulletType.java new file mode 100644 index 0000000000..bd1332443f --- /dev/null +++ b/core/src/mindustry/entities/bullet/LaserBoltBulletType.java @@ -0,0 +1,34 @@ +package mindustry.entities.bullet; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import mindustry.gen.*; +import mindustry.content.*; + +public class LaserBoltBulletType extends BasicBulletType{ + protected float height = 7f, width = 2f; + + public LaserBoltBulletType(float speed, float damage){ + super(speed, damage); + + smokeEffect = Fx.hitLaser; + hitEffect = Fx.hitLaser; + despawnEffect = Fx.hitLaser; + hittable = false; + reflectable = false; + } + + public LaserBoltBulletType(){ + this(1f, 1f); + } + + @Override + public void draw(Bullet b){ + Draw.color(backColor); + Lines.stroke(width); + Lines.lineAngleCenter(b.x, b.y, b.rotation(), height); + Draw.color(frontColor); + Lines.lineAngleCenter(b.x, b.y, b.rotation(), height / 2f); + Draw.reset(); + } +} diff --git a/core/src/mindustry/entities/bullet/LaserBulletType.java b/core/src/mindustry/entities/bullet/LaserBulletType.java index 5fd96f6cc6..ad5965f3b8 100644 --- a/core/src/mindustry/entities/bullet/LaserBulletType.java +++ b/core/src/mindustry/entities/bullet/LaserBulletType.java @@ -8,18 +8,17 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.world.*; public class LaserBulletType extends BulletType{ - protected static Tile furthest; - - protected Color[] colors = {Pal.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Pal.lancerLaser, Color.white}; - protected Effect laserEffect = Fx.lancerLaserShootSmoke; - protected float length = 160f; - protected float width = 15f; - protected float lengthFalloff = 0.5f; - protected float sideLength = 29f, sideWidth = 0.7f; - protected float sideAngle = 90f; + public Color[] colors = {Pal.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Pal.lancerLaser, Color.white}; + public Effect laserEffect = Fx.lancerLaserShootSmoke; + public float length = 160f; + public float width = 15f; + public float lengthFalloff = 0.5f; + public float sideLength = 29f, sideWidth = 0.7f; + public float sideAngle = 90f; + public float lightningSpacing = -1, lightningDelay = 0.1f, lightningAngleRand; + public boolean largeHit = false; public LaserBulletType(float damage){ super(0.01f, damage); @@ -40,6 +39,13 @@ public class LaserBulletType extends BulletType{ this(1f); } + @Override + public void init(){ + super.init(); + + drawSize = Math.max(drawSize, length*2f); + } + @Override public float range(){ return length; @@ -47,8 +53,30 @@ public class LaserBulletType extends BulletType{ @Override public void init(Bullet b){ - float resultLength = Damage.collideLaser(b, length); - laserEffect.at(b.x, b.y, b.rotation(), resultLength * 0.75f); + float resultLength = Damage.collideLaser(b, length, largeHit), rot = b.rotation(); + + laserEffect.at(b.x, b.y, rot, resultLength * 0.75f); + + if(lightningSpacing > 0){ + int idx = 0; + for(float i = 0; i <= resultLength; i += lightningSpacing){ + float cx = b.x + Angles.trnsx(rot, i), + cy = b.y + Angles.trnsy(rot, i); + + int f = idx++; + + for(int s : Mathf.signs){ + Time.run(f * lightningDelay, () -> { + if(b.isAdded() && b.type == this){ + Lightning.create(b, lightningColor, + lightningDamage < 0 ? damage : lightningDamage, + cx, cy, rot + 90*s + Mathf.range(lightningAngleRand), + lightningLength + Mathf.random(lightningLengthRand)); + } + }); + } + } + } } @Override @@ -61,7 +89,6 @@ public class LaserBulletType extends BulletType{ float compound = 1f; Lines.lineAngle(b.x, b.y, b.rotation(), baseLen); - Lines.precise(true); for(Color color : colors){ Draw.color(color); Lines.stroke((cwidth *= lengthFalloff) * b.fout()); @@ -76,7 +103,6 @@ public class LaserBulletType extends BulletType{ compound *= lengthFalloff; } - Lines.precise(false); Draw.reset(); Tmp.v1.trns(b.rotation(), baseLen * 1.1f); diff --git a/core/src/mindustry/entities/bullet/LiquidBulletType.java b/core/src/mindustry/entities/bullet/LiquidBulletType.java index 45ae536668..2d3de79977 100644 --- a/core/src/mindustry/entities/bullet/LiquidBulletType.java +++ b/core/src/mindustry/entities/bullet/LiquidBulletType.java @@ -3,7 +3,7 @@ package mindustry.entities.bullet; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; @@ -13,7 +13,7 @@ import mindustry.world.*; import static mindustry.Vars.*; public class LiquidBulletType extends BulletType{ - public @NonNull Liquid liquid; + public Liquid liquid; public float puddleSize = 6f; public LiquidBulletType(@Nullable Liquid liquid){ @@ -24,7 +24,8 @@ public class LiquidBulletType extends BulletType{ this.status = liquid.effect; } - lifetime = 74f; + ammoMultiplier = 1f; + lifetime = 34f; statusDuration = 60f * 2f; despawnEffect = Fx.none; hitEffect = Fx.hitLiquid; @@ -61,7 +62,7 @@ public class LiquidBulletType extends BulletType{ public void draw(Bullet b){ Draw.color(liquid.color, Color.white, b.fout() / 100f); - Fill.circle(b.x, b.y, 3f); + Fill.circle(b.x, b.y, puddleSize / 2); } @Override @@ -78,7 +79,7 @@ public class LiquidBulletType extends BulletType{ Puddles.deposit(world.tileWorld(hitx, hity), liquid, puddleSize); if(liquid.temperature <= 0.5f && liquid.flammability < 0.3f){ - float intensity = 400f; + float intensity = 400f * puddleSize/6f; Fires.extinguish(world.tileWorld(hitx, hity), intensity); for(Point2 p : Geometry.d4){ Fires.extinguish(world.tileWorld(hitx + p.x * tilesize, hity + p.y * tilesize), intensity); diff --git a/core/src/mindustry/entities/bullet/MassDriverBolt.java b/core/src/mindustry/entities/bullet/MassDriverBolt.java index 70d3c6de9b..91dae839a8 100644 --- a/core/src/mindustry/entities/bullet/MassDriverBolt.java +++ b/core/src/mindustry/entities/bullet/MassDriverBolt.java @@ -1,15 +1,14 @@ package mindustry.entities.bullet; -import arc.graphics.Color; -import arc.graphics.g2d.Draw; -import arc.math.Angles; -import arc.math.Mathf; -import mindustry.content.Fx; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.content.*; import mindustry.gen.*; -import mindustry.graphics.Pal; -import mindustry.world.blocks.distribution.MassDriver.DriverBulletData; +import mindustry.graphics.*; +import mindustry.world.blocks.distribution.MassDriver.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class MassDriverBolt extends BulletType{ @@ -37,15 +36,13 @@ public class MassDriverBolt extends BulletType{ @Override public void update(Bullet b){ //data MUST be an instance of DriverBulletData - if(!(b.data() instanceof DriverBulletData)){ + if(!(b.data() instanceof DriverBulletData data)){ hit(b); return; } float hitDst = 7f; - DriverBulletData data = (DriverBulletData)b.data(); - //if the target is dead, just keep flying until the bullet explodes if(data.to.dead()){ return; @@ -84,9 +81,7 @@ public class MassDriverBolt extends BulletType{ public void despawned(Bullet b){ super.despawned(b); - if(!(b.data() instanceof DriverBulletData)) return; - - DriverBulletData data = (DriverBulletData)b.data(); + if(!(b.data() instanceof DriverBulletData data)) return; for(int i = 0; i < data.items.length; i++){ int amountDropped = Mathf.random(0, data.items[i]); diff --git a/core/src/mindustry/entities/bullet/PointBulletType.java b/core/src/mindustry/entities/bullet/PointBulletType.java new file mode 100644 index 0000000000..920e6e5b51 --- /dev/null +++ b/core/src/mindustry/entities/bullet/PointBulletType.java @@ -0,0 +1,70 @@ +package mindustry.entities.bullet; + +import arc.math.geom.*; +import arc.util.*; +import mindustry.*; +import mindustry.entities.*; +import mindustry.gen.*; + +public class PointBulletType extends BulletType{ + private static float cdist = 0f; + private static Unit result; + + public float trailSpacing = 10f; + + public PointBulletType(){ + scaleVelocity = true; + lifetime = 100f; + collides = false; + keepVelocity = false; + backMove = false; + } + + @Override + public void init(Bullet b){ + super.init(b); + + float px = b.x + b.lifetime * b.vel.x, + py = b.y + b.lifetime * b.vel.y, + rot = b.rotation(); + + Geometry.iterateLine(0f, b.x, b.y, px, py, trailSpacing, (x, y) -> { + trailEffect.at(x, y, rot); + }); + + b.time = b.lifetime; + b.set(px, py); + + //calculate hit entity + + cdist = 0f; + result = null; + float range = 1f; + + Units.nearbyEnemies(b.team, px - range, py - range, range*2f, range*2f, e -> { + if(e.dead()) return; + + e.hitbox(Tmp.r1); + if(!Tmp.r1.contains(px, py)) return; + + float dst = e.dst(px, py) - e.hitSize; + if((result == null || dst < cdist)){ + result = e; + cdist = dst; + } + }); + + if(result != null){ + b.collision(result, px, py); + }else{ + Building build = Vars.world.buildWorld(px, py); + if(build != null && build.team != b.team){ + build.collision(b); + } + } + + b.remove(); + + b.vel.setZero(); + } +} diff --git a/core/src/mindustry/entities/bullet/RailBulletType.java b/core/src/mindustry/entities/bullet/RailBulletType.java new file mode 100644 index 0000000000..8265f35e8b --- /dev/null +++ b/core/src/mindustry/entities/bullet/RailBulletType.java @@ -0,0 +1,60 @@ +package mindustry.entities.bullet; + +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; + +//TODO this class is bad for multiple reasons, remove/replace it. +//- effects unreliable +//- not really hitscan but works like it +//- buggy trails +//- looks bad +//- generally unreliable +public class RailBulletType extends BulletType{ + public Effect pierceEffect = Fx.hitBulletSmall, updateEffect = Fx.none; + /** Multiplier of damage decreased per health pierced. */ + public float pierceDamageFactor = 1f; + + public RailBulletType(){ + pierceBuilding = true; + pierce = true; + reflectable = false; + hitEffect = Fx.none; + despawnEffect = Fx.none; + } + + void handle(Bullet b, Posc pos, float initialHealth){ + float sub = initialHealth*pierceDamageFactor; + + if(sub >= b.damage){ + //cause a despawn + b.remove(); + } + + //subtract health from each consecutive pierce + b.damage -= Math.min(b.damage, sub); + + if(b.damage > 0){ + pierceEffect.at(pos.getX(), pos.getY(), b.rotation()); + } + + hitEffect.at(pos.getX(), pos.getY()); + } + + @Override + public void update(Bullet b){ + if(b.timer(1, 0.9f)){ + updateEffect.at(b.x, b.y, b.rotation()); + } + } + + @Override + public void hitEntity(Bullet b, Hitboxc entity, float initialHealth){ + handle(b, entity, initialHealth); + } + + @Override + public void hitTile(Bullet b, Building tile, float initialHealth){ + handle(b, tile, initialHealth); + } +} diff --git a/core/src/mindustry/entities/bullet/SapBulletType.java b/core/src/mindustry/entities/bullet/SapBulletType.java index 6dab6ce13c..5eb1d1e294 100644 --- a/core/src/mindustry/entities/bullet/SapBulletType.java +++ b/core/src/mindustry/entities/bullet/SapBulletType.java @@ -29,8 +29,7 @@ public class SapBulletType extends BulletType{ @Override public void draw(Bullet b){ - if(b.data instanceof Position){ - Position data = (Position)b.data; + if(b.data instanceof Position data){ Tmp.v1.set(data).lerp(b, b.fin()); Draw.color(color); @@ -39,10 +38,15 @@ public class SapBulletType extends BulletType{ Draw.reset(); - Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, 15f * b.fout(), lightColor, 0.6f); + Drawf.light(b.team, b.x, b.y, Tmp.v1.x, Tmp.v1.y, 15f * b.fout(), lightColor, 0.6f); } } + @Override + public void drawLight(Bullet b){ + + } + @Override public float range(){ return length; @@ -63,13 +67,11 @@ public class SapBulletType extends BulletType{ } } - if(target instanceof Hitboxc){ - Hitboxc hit = (Hitboxc)target; + if(target instanceof Hitboxc hit){ hit.collision(b, hit.x(), hit.y()); b.collision(hit, hit.x(), hit.y()); - }else if(target instanceof Building){ - Building tile = (Building)target; + }else if(target instanceof Building tile){ if(tile.collide(b)){ tile.collision(b); diff --git a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java index a6a9ca6be0..01a7ad2d7e 100644 --- a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java +++ b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java @@ -13,6 +13,7 @@ public class ShrapnelBulletType extends BulletType{ public float length = 100f; public float width = 20f; public Color fromColor = Color.white, toColor = Pal.lancerLaser; + public boolean hitLarge = false; public int serrations = 7; public float serrationLenScl = 10f, serrationWidth = 4f, serrationSpacing = 8f, serrationSpaceOffset = 80f, serrationFadeOffset = 0.5f; @@ -25,11 +26,19 @@ public class ShrapnelBulletType extends BulletType{ despawnEffect = Fx.none; pierce = true; keepVelocity = false; + hittable = false; } @Override public void init(Bullet b){ - Damage.collideLaser(b, length); + Damage.collideLaser(b, length, hitLarge); + } + + @Override + public void init(){ + super.init(); + + drawSize = Math.max(drawSize, length*2f); } @Override diff --git a/core/src/mindustry/entities/comp/AmmoDistributeComp.java b/core/src/mindustry/entities/comp/AmmoDistributeComp.java new file mode 100644 index 0000000000..96e10a9ce0 --- /dev/null +++ b/core/src/mindustry/entities/comp/AmmoDistributeComp.java @@ -0,0 +1,28 @@ +package mindustry.entities.comp; + +import arc.util.*; +import mindustry.annotations.Annotations.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.blocks.units.*; + +@Component +abstract class AmmoDistributeComp implements Unitc{ + @Import float x, y; + @Import UnitType type; + @Import Team team; + @Import float ammo; + + private transient float ammoCooldown; + + @Override + public void update(){ + if(ammoCooldown > 0f) ammoCooldown -= Time.delta; + + if(ammo > 0 && ammoCooldown <= 0f && ResupplyPoint.resupply(team, x, y, type.ammoResupplyRange, Math.min(type.ammoResupplyAmount, ammo), type.ammoType.color, u -> u != self())){ + ammo -= Math.min(type.ammoResupplyAmount, ammo); + ammoCooldown = 5f; + } + } +} diff --git a/core/src/mindustry/entities/comp/BlockUnitComp.java b/core/src/mindustry/entities/comp/BlockUnitComp.java index 39bfb85b97..d0ec5b9a32 100644 --- a/core/src/mindustry/entities/comp/BlockUnitComp.java +++ b/core/src/mindustry/entities/comp/BlockUnitComp.java @@ -18,9 +18,9 @@ abstract class BlockUnitComp implements Unitc{ this.tile = tile; //sets up block stats - maxHealth(tile.block().health); + maxHealth(tile.block.health); health(tile.health()); - hitSize(tile.block().size * tilesize * 0.7f); + hitSize(tile.block.size * tilesize * 0.7f); set(tile); } diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index 815f81773f..0aafd4d0c0 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -5,7 +5,6 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.struct.Queue; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; import mindustry.annotations.Annotations.*; @@ -71,7 +70,7 @@ abstract class BuilderComp implements Unitc{ Tile tile = world.tile(current.x, current.y); if(within(tile, finalPlaceDst)){ - rotation = Mathf.slerpDelta(rotation, angleTo(tile), 0.4f); + lookAt(angleTo(tile)); } if(!(tile.block() instanceof ConstructBlock)){ @@ -108,16 +107,15 @@ abstract class BuilderComp implements Unitc{ ConstructBuild entity = tile.bc(); if(current.breaking){ - entity.deconstruct(base(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier); + entity.deconstruct(self(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier); }else{ - entity.construct(base(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier, current.config); + entity.construct(self(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier, current.config); } current.stuck = Mathf.equal(current.progress, entity.progress); current.progress = entity.progress; } - /** Draw all current build requests. Does not draw the beam effect, only the positions. */ void drawBuildRequests(){ @@ -209,7 +207,7 @@ abstract class BuilderComp implements Unitc{ BuildPlan plan = buildPlan(); Tile tile = world.tile(plan.x, plan.y); - if(dst(tile) > buildingRange && !state.isEditor()){ + if((!within(tile, buildingRange) && !state.isEditor()) || tile == null){ return; } diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index f310844566..15d79a8942 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -13,7 +13,6 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.audio.*; @@ -47,17 +46,18 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, static final Seq tempTiles = new Seq<>(); static int sleepingEntities = 0; - @Import float x, y, health; + @Import float x, y, health, maxHealth; @Import Team team; transient Tile tile; transient Block block; transient Seq proximity = new Seq<>(8); transient boolean updateFlow; - transient byte dump; + transient byte cdump; transient int rotation; transient boolean enabled = true; transient float enabledControlTime; + transient String lastAccessed; PowerModule power; ItemModule items; @@ -76,6 +76,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public Building init(Tile tile, Team team, boolean shouldAdd, int rotation){ if(!initialized){ create(tile.block(), team); + }else{ + if(block.hasPower){ + //reinit power graph + power.graph = new PowerGraph(); + power.graph.add(self()); + } } this.rotation = rotation; this.tile = tile; @@ -88,7 +94,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, created(); - return base(); + return self(); } /** Sets up all the necessary variables, but does not add this entity anywhere. */ @@ -105,17 +111,17 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, maxHealth(block.health); timer(new Interval(block.timers)); - cons = new ConsumeModule(base()); + cons = new ConsumeModule(self()); if(block.hasItems) items = new ItemModule(); if(block.hasLiquids) liquids = new LiquidModule(); if(block.hasPower){ power = new PowerModule(); - power.graph.add(base()); + power.graph.add(self()); } initialized = true; - return base(); + return self(); } @Override @@ -189,17 +195,17 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public void configure(Object value){ //save last used config block.lastConfig = value; - Call.tileConfig(player, base(), value); + Call.tileConfig(player, self(), value); } /** Configure from a server. */ public void configureAny(Object value){ - Call.tileConfig(null, base(), value); + Call.tileConfig(null, self(), value); } /** Deselect this tile from configuration. */ public void deselect(){ - if(!headless && control.input.frag.config.getSelectedTile() == base()){ + if(!headless && control.input.frag.config.getSelectedTile() == self()){ control.input.frag.config.hideConfig(); } } @@ -210,9 +216,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return true; } - public void applyBoost(float intensity, float duration){ + public void applyBoost(float intensity, float duration){ + //do not refresh time scale when getting a weaker intensity + if(intensity >= this.timeScale){ + timeScaleDuration = Math.max(timeScaleDuration, duration); + } timeScale = Math.max(timeScale, intensity); - timeScaleDuration = Math.max(timeScaleDuration, duration); } public Building nearby(int dx, int dy){ @@ -340,6 +349,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //endregion //region handler methods + /** Called when an unloader takes an item. */ + public void itemTaken(Item item){ + + } + /** Called when this block is dropped as a payload. */ public void dropped(){ @@ -366,7 +380,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Returns the amount of items this block can accept. */ public int acceptStack(Item item, int amount, Teamc source){ - if(acceptItem(base(), item) && block.hasItems && (source == null || source.team() == team)){ + if(acceptItem(self(), item) && block.hasItems && (source == null || source.team() == team)){ return Math.min(getMaximumAccepted(item) - items.get(item), amount); }else{ return 0; @@ -415,12 +429,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * @param todump payload to dump. * @return whether the payload was moved successfully */ - public boolean movePayload(@NonNull Payload todump){ + public boolean movePayload(Payload todump){ int trns = block.size/2 + 1; Tile next = tile.getNearby(Geometry.d4(rotation).x * trns, Geometry.d4(rotation).y * trns); - if(next != null && next.build != null && next.build.team == team && next.build.acceptPayload(base(), todump)){ - next.build.handlePayload(base(), todump); + if(next != null && next.build != null && next.build.team == team && next.build.acceptPayload(self(), todump)){ + next.build.handlePayload(self(), todump); return true; } @@ -432,16 +446,16 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * @param todump payload to dump. * @return whether the payload was moved successfully */ - public boolean dumpPayload(@NonNull Payload todump){ + public boolean dumpPayload(Payload todump){ if(proximity.size == 0) return false; - int dump = this.dump; + int dump = this.cdump; for(int i = 0; i < proximity.size; i++){ Building other = proximity.get((i + dump) % proximity.size); - if(other.team == team && other.acceptPayload(base(), todump)){ - other.handlePayload(base(), todump); + if(other.team == team && other.acceptPayload(self(), todump)){ + other.handlePayload(self(), todump); incrementDump(proximity.size); return true; } @@ -460,8 +474,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return block.consumes.itemFilters.get(item.id) && items.get(item) < getMaximumAccepted(item); } - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ - return block.hasLiquids && liquids.get(liquid) + amount < block.liquidCapacity && block.consumes.liquidfilters.get(liquid.id); + public boolean acceptLiquid(Building source, Liquid liquid){ + return block.hasLiquids && block.consumes.liquidfilters.get(liquid.id); } public void handleLiquid(Building source, Liquid liquid, float amount){ @@ -469,12 +483,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public void dumpLiquid(Liquid liquid){ - int dump = this.dump; + int dump = this.cdump; for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); Building other = proximity.get((i + dump) % proximity.size); - other = other.getLiquidDestination(base(), liquid); + other = other.getLiquidDestination(self(), liquid); if(other != null && other.team == team && other.block.hasLiquids && canDumpLiquid(other, liquid) && other.liquids != null){ float ofract = other.liquids.get(liquid) / other.block.liquidCapacity; @@ -491,23 +505,23 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public void transferLiquid(Building next, float amount, Liquid liquid){ - float flow = Math.min(next.block.liquidCapacity - next.liquids.get(liquid) - 0.001f, amount); + float flow = Math.min(next.block.liquidCapacity - next.liquids.get(liquid), amount); - if(next.acceptLiquid(base(), liquid, flow)){ - next.handleLiquid(base(), liquid, flow); + if(next.acceptLiquid(self(), liquid)){ + next.handleLiquid(self(), liquid, flow); liquids.remove(liquid, flow); } } - public float moveLiquidForward(float leakResistance, Liquid liquid){ + public float moveLiquidForward(boolean leaks, Liquid liquid){ Tile next = tile.getNearby(rotation); if(next == null) return 0; if(next.build != null){ return moveLiquid(next.build, liquid); - }else if(leakResistance != 100f && !next.block().solid && !next.block().hasLiquids){ - float leakAmount = liquids.get(liquid) / leakResistance; + }else if(leaks && !next.block().solid && !next.block().hasLiquids){ + float leakAmount = liquids.get(liquid) / 1.5f; Puddles.deposit(next, tile, liquid, leakAmount); liquids.remove(liquid, leakAmount); } @@ -517,16 +531,16 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public float moveLiquid(Building next, Liquid liquid){ if(next == null) return 0; - next = next.getLiquidDestination(base(), liquid); + next = next.getLiquidDestination(self(), liquid); if(next.team == team && next.block.hasLiquids && liquids.get(liquid) > 0f){ float ofract = next.liquids.get(liquid) / next.block.liquidCapacity; float fract = liquids.get(liquid) / block.liquidCapacity * block.liquidPressure; float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (block.liquidCapacity), liquids.get(liquid)); - flow = Math.min(flow, next.block.liquidCapacity - next.liquids.get(liquid) - 0.001f); + flow = Math.min(flow, next.block.liquidCapacity - next.liquids.get(liquid)); - if(flow > 0f && ofract <= fract && next.acceptLiquid(base(), liquid, flow)){ - next.handleLiquid(base(), liquid, flow); + if(flow > 0f && ofract <= fract && next.acceptLiquid(self(), liquid)){ + next.handleLiquid(self(), liquid, flow); liquids.remove(liquid, flow); return flow; }else if(next.liquids.currentAmount() / next.block.liquidCapacity > 0.1f && fract > 0.1f){ @@ -552,7 +566,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public Building getLiquidDestination(Building from, Liquid liquid){ - return base(); + return self(); } public @Nullable Payload getPayload(){ @@ -569,31 +583,31 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * containers, it gets added to the block's inventory. */ public void offload(Item item){ - int dump = this.dump; + int dump = this.cdump; for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); Building other = proximity.get((i + dump) % proximity.size); - if(other.team == team && other.acceptItem(base(), item) && canDump(other, item)){ - other.handleItem(base(), item); + if(other.team == team && other.acceptItem(self(), item) && canDump(other, item)){ + other.handleItem(self(), item); return; } } - handleItem(base(), item); + handleItem(self(), item); } /** * Tries to put this item into a nearby container. Returns success. Unlike #offload(), this method does not change the block inventory. */ public boolean put(Item item){ - int dump = this.dump; + int dump = this.cdump; for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); Building other = proximity.get((i + dump) % proximity.size); - if(other.team == team && other.acceptItem(base(), item) && canDump(other, item)){ - other.handleItem(base(), item); + if(other.team == team && other.acceptItem(self(), item) && canDump(other, item)){ + other.handleItem(self(), item); return true; } } @@ -613,7 +627,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public boolean dump(Item todump){ if(!block.hasItems || items.total() == 0 || (todump != null && !items.has(todump))) return false; - int dump = this.dump; + int dump = this.cdump; if(proximity.size == 0) return false; @@ -625,16 +639,16 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, for(int ii = 0; ii < content.items().size; ii++){ Item item = content.item(ii); - if(other.team == team && items.has(item) && other.acceptItem(base(), item) && canDump(other, item)){ - other.handleItem(base(), item); + if(other.team == team && items.has(item) && other.acceptItem(self(), item) && canDump(other, item)){ + other.handleItem(self(), item); items.remove(item, 1); incrementDump(proximity.size); return true; } } }else{ - if(other.team == team && other.acceptItem(base(), todump) && canDump(other, todump)){ - other.handleItem(base(), todump); + if(other.team == team && other.acceptItem(self(), todump) && canDump(other, todump)){ + other.handleItem(self(), todump); items.remove(todump, 1); incrementDump(proximity.size); return true; @@ -648,7 +662,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public void incrementDump(int prox){ - dump = (byte)((dump + 1) % prox); + cdump = (byte)((cdump + 1) % prox); } /** Used for dumping items. */ @@ -659,8 +673,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Try offloading an item to a nearby container in its facing direction. Returns true if success. */ public boolean moveForward(Item item){ Building other = front(); - if(other != null && other.team == team && other.acceptItem(base(), item)){ - other.handleItem(base(), item); + if(other != null && other.team == team && other.acceptItem(self(), item)){ + other.handleItem(self(), item); return true; } return false; @@ -690,13 +704,14 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return; } - power.graph.remove(base()); + power.graph.remove(self()); for(int i = 0; i < power.links.size; i++){ Tile other = world.tile(power.links.get(i)); if(other != null && other.build != null && other.build.power != null){ other.build.power.links.removeValue(pos()); } } + power.links.clear(); } public Seq getPowerConnections(Seq out){ @@ -812,7 +827,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Called after the block is placed by this client. */ @CallSuper - public void playerPlaced(){ + public void playerPlaced(Object config){ } @@ -826,10 +841,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, tempTiles.clear(); Geometry.circle(tileX(), tileY(), range, (x, y) -> { Building other = world.build(x, y); - if(other != null && other.block instanceof PowerNode && ((PowerNode)other.block).linkValid(other, base()) && !PowerNode.insulated(other, base()) - && !other.proximity().contains(this.base()) && + if(other != null && other.block instanceof PowerNode && ((PowerNode)other.block).linkValid(other, self()) && !PowerNode.insulated(other, self()) + && !other.proximity().contains(this.self()) && !(block.outputsPower && proximity.contains(p -> p.power != null && p.power.graph == other.power.graph))){ - tempTiles.add(other.tile()); + tempTiles.add(other.tile); } }); tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); @@ -842,6 +857,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + /** + * Called when a block is placed over some other blocks. This seq will always have at least one item. + * Should load some previous state, if necessary. */ + public void overwrote(Seq previous){ + + } + public void onRemoved(){ } @@ -858,6 +880,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //null is of type void.class; anonymous classes use their superclass. Class type = value == null ? void.class : value.getClass().isAnonymousClass() ? value.getClass().getSuperclass() : value.getClass(); + if(builder != null && builder.isPlayer()){ + lastAccessed = builder.getPlayer().name; + } + if(block.configurations.containsKey(type)){ block.configurations.get(type).get(this, value); } @@ -1022,6 +1048,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + if(net.active() && lastAccessed != null){ + table.row(); + table.add(Core.bundle.format("lastaccessed", lastAccessed)).growX().wrap().left(); + } + table.marginBottom(-5); } } @@ -1030,13 +1061,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, table.left(); for(Consume cons : block.consumes.all()){ if(cons.isOptional() && cons.isBoost()) continue; - cons.build(base(), table); + cons.build(self(), table); } } public void displayBars(Table table){ for(Func bar : block.bars.list()){ - table.add(bar.get(base())).growX(); + table.add(bar.get(self())).growX(); table.row(); } } @@ -1062,7 +1093,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * @return whether or not this block should be deselected. */ public boolean onConfigureTileTapped(Building other){ - return base() != other; + return self() != other; } /** Returns whether this config menu should show when the specified player taps it. */ @@ -1121,7 +1152,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } for(Building other : tmpTiles){ - other.proximity.remove(base(), true); + other.proximity.remove(self(), true); other.onProximityUpdate(); } } @@ -1137,8 +1168,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, if(other == null || !(other.tile.interactable(team))) continue; //add this tile to proximity of nearby tiles - if(!other.proximity.contains(base(), true)){ - other.proximity.add(base()); + if(!other.proximity.contains(self(), true)){ + other.proximity.add(self()); } tmpTiles.add(other); @@ -1149,10 +1180,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, proximity.add(tile); } - for(Building other : tmpTiles){ - other.onProximityUpdate(); - } - onProximityAdded(); onProximityUpdate(); @@ -1177,13 +1204,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, @Replace @Override public boolean isValid(){ - return tile.build == base() && !dead(); + return tile.build == self() && !dead(); } @Replace @Override public void kill(){ - Call.tileDestroyed(base()); + Call.tileDestroyed(self()); } @Replace @@ -1197,32 +1224,49 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, damage /= state.rules.blockHealthMultiplier; } - Call.tileDamage(base(), health - handleDamage(damage)); + Call.tileDamage(self(), health - handleDamage(damage)); if(health <= 0){ - Call.tileDestroyed(base()); + Call.tileDestroyed(self()); } } @Override public double sense(LAccess sensor){ - if(sensor == LAccess.x) return x; - if(sensor == LAccess.y) return y; - if(sensor == LAccess.team) return team.id; - if(sensor == LAccess.health) return health; - if(sensor == LAccess.efficiency) return efficiency(); - if(sensor == LAccess.rotation) return rotation; - if(sensor == LAccess.totalItems && items != null) return items.total(); - if(sensor == LAccess.totalLiquids && liquids != null) return liquids.total(); - if(sensor == LAccess.totalPower && power != null && block.consumes.hasPower()) return power.status * (block.consumes.getPower().buffered ? block.consumes.getPower().capacity : 1f); - if(sensor == LAccess.itemCapacity) return block.itemCapacity; - if(sensor == LAccess.liquidCapacity) return block.liquidCapacity; - if(sensor == LAccess.powerCapacity) return block.consumes.hasPower() ? block.consumes.getPower().capacity : 0f; - if(sensor == LAccess.powerNetIn && power != null) return power.graph.getPowerProduced(); - if(sensor == LAccess.powerNetOut && power != null) return power.graph.getPowerNeeded(); - if(sensor == LAccess.powerNetStored && power != null) return power.graph.getLastPowerStored(); - if(sensor == LAccess.powerNetCapacity && power != null) return power.graph.getBatteryCapacity(); - return 0; + return switch(sensor){ + case x -> x; + case y -> y; + case team -> team.id; + case health -> health; + case maxHealth -> maxHealth; + case efficiency -> efficiency(); + case rotation -> rotation; + case totalItems -> items == null ? 0 : items.total(); + case totalLiquids -> liquids == null ? 0 : liquids.total(); + case totalPower -> power == null || !block.consumes.hasPower() ? 0 : power.status * (block.consumes.getPower().buffered ? block.consumes.getPower().capacity : 1f); + case itemCapacity -> block.itemCapacity; + case liquidCapacity -> block.liquidCapacity; + case powerCapacity -> block.consumes.hasPower() ? block.consumes.getPower().capacity : 0f; + case powerNetIn -> power == null ? 0 : power.graph.getLastScaledPowerIn() * 60; + case powerNetOut -> power == null ? 0 : power.graph.getLastScaledPowerOut() * 60; + case powerNetStored -> power == null ? 0 : power.graph.getLastPowerStored(); + case powerNetCapacity -> power == null ? 0 : power.graph.getLastCapacity(); + case enabled -> enabled ? 1 : 0; + case payloadCount -> getPayload() != null ? 1 : 0; + default -> 0; + }; + } + + @Override + public Object senseObject(LAccess sensor){ + return switch(sensor){ + case type -> block; + case firstItem -> items == null ? null : items.first(); + case config -> block.configurations.containsKey(Item.class) || block.configurations.containsKey(Liquid.class) ? config() : null; + case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type() : getPayload() instanceof BuildPayload p2 ? p2.block() : null; + default -> noSensed; + }; + } @Override @@ -1240,6 +1284,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } + @Override + public void control(LAccess type, Object p1, double p2, double p3, double p4){ + + } + @Override public void remove(){ if(sound != null){ @@ -1277,7 +1326,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } if(block.idleSound != Sounds.none && shouldIdleSound()){ - loops.play(block.idleSound, base(), block.idleSoundVolume); + loops.play(block.idleSound, self(), block.idleSoundVolume); } if(enabled || !block.noUpdateDisabled){ diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index 2f46261be8..4deb7cc9dc 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -19,24 +19,23 @@ import static mindustry.Vars.*; abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Drawc, Shielderc, Ownerc, Velc, Bulletc, Timerc{ @Import Team team; @Import Entityc owner; - @Import float x,y; + @Import float x, y, damage; IntSeq collided = new IntSeq(6); Object data; BulletType type; - float damage; float fdata; @Override public void getCollisions(Cons consumer){ if(team.active()){ for(Team team : team.enemies()){ - consumer.get(teamIndex.tree(team)); + consumer.get(team.data().tree()); } }else{ for(Team other : Team.all){ - if(other != team && teamIndex.count(other) > 0){ - consumer.get(teamIndex.tree(other)); + if(other != team && team.data().unitCount > 0){ + consumer.get(team.data().tree()); } } } @@ -44,17 +43,17 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw @Override public void drawBullets(){ - type.draw(base()); + type.draw(self()); } @Override public void add(){ - type.init(base()); + type.init(self()); } @Override public void remove(){ - type.despawned(base()); + type.despawned(self()); collided.clear(); } @@ -76,11 +75,6 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw return type.drawSize; } - @Override - public float damage(){ - return damage * damageMultiplier(); - } - @Replace @Override public boolean collides(Hitboxc other){ @@ -92,15 +86,15 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw @MethodPriority(100) @Override public void collision(Hitboxc other, float x, float y){ - type.hit(base(), x, y); + type.hit(self(), x, y); + float health = 0f; - if(other instanceof Healthc){ - Healthc h = (Healthc)other; + if(other instanceof Healthc h){ + health = h.health(); h.damage(damage); } - if(other instanceof Unit){ - Unit unit = (Unit)other; + if(other instanceof Unit unit){ unit.impulse(Tmp.v3.set(unit).sub(this.x, this.y).nor().scl(type.knockback * 80f)); unit.apply(type.status, type.statusDuration); } @@ -111,43 +105,57 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw }else{ collided.add(other.id()); } + + type.hitEntity(self(), other, health); } @Override public void update(){ - type.update(base()); + type.update(self()); if(type.collidesTiles && type.collides && type.collidesGround){ world.raycastEach(world.toTile(lastX()), world.toTile(lastY()), tileX(), tileY(), (x, y) -> { Building tile = world.build(x, y); - if(tile == null) return false; + if(tile == null || !isAdded()) return false; - if(tile.collide(base()) && type.collides(base(), tile) && !tile.dead() && (type.collidesTeam || tile.team != team)){ + if(tile.collide(self()) && type.collides(self(), tile) && !tile.dead() && (type.collidesTeam || tile.team != team) && !(type.pierceBuilding && collided.contains(tile.id))){ boolean remove = false; + float health = tile.health; + if(tile.team != team){ - remove = tile.collision(base()); + remove = tile.collision(self()); } if(remove || type.collidesTeam){ - type.hitTile(base(), tile); - remove(); + if(!type.pierceBuilding){ + remove(); + }else{ + collided.add(tile.id); + } } - return true; + + type.hitTile(self(), tile, health); + + return !type.pierceBuilding; } return false; }); } + + if(type.pierceCap != -1 && collided.size >= type.pierceCap) { + remove(); + } } @Override public void draw(){ Draw.z(Layer.bullet); - type.draw(base()); - type.drawLight(base()); + type.draw(self()); + type.drawLight(self()); } /** Sets the bullet's rotation in degrees. */ diff --git a/core/src/mindustry/entities/comp/ChildComp.java b/core/src/mindustry/entities/comp/ChildComp.java index be8fafb0aa..dae0c98814 100644 --- a/core/src/mindustry/entities/comp/ChildComp.java +++ b/core/src/mindustry/entities/comp/ChildComp.java @@ -1,6 +1,6 @@ package mindustry.entities.comp; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; diff --git a/core/src/mindustry/entities/comp/CommanderComp.java b/core/src/mindustry/entities/comp/CommanderComp.java index 39fdda447f..b0fbddcf85 100644 --- a/core/src/mindustry/entities/comp/CommanderComp.java +++ b/core/src/mindustry/entities/comp/CommanderComp.java @@ -3,47 +3,47 @@ package mindustry.entities.comp; import arc.func.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.ai.formations.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.entities.units.*; +import mindustry.game.*; import mindustry.gen.*; +import mindustry.type.*; /** A unit that can command other units. */ @Component -abstract class CommanderComp implements Unitc{ +abstract class CommanderComp implements Entityc, Posc{ private static final Seq members = new Seq<>(); private static final Seq units = new Seq<>(); - @Import float x, y, rotation; + @Import float x, y, rotation, hitSize; + @Import Team team; + @Import UnitType type; transient @Nullable Formation formation; - transient Seq controlling = new Seq<>(); + transient Seq controlling = new Seq<>(10); /** minimum speed of any unit in the formation. */ transient float minFormationSpeed; - @Override public void update(){ if(formation != null){ - formation.anchor.set(x, y, rotation); + formation.anchor.set(x, y, /*rotation*/ 0); //TODO rotation set to 0 because rotating is pointless formation.updateSlots(); } } - @Override public void remove(){ clearCommand(); } - @Override public void killed(){ clearCommand(); } //make sure to reset command state when the controller is switched - @Override public void controller(UnitController next){ clearCommand(); } @@ -58,14 +58,15 @@ abstract class CommanderComp implements Unitc{ units.clear(); - Units.nearby(team(), x, y, 200f, u -> { - if(u.isAI() && include.get(u) && u != base()){ + Units.nearby(team, x, y, 150f, u -> { + if(u.isAI() && include.get(u) && u != self() && u.type().flying == type.flying && u.hitSize <= hitSize * 1.1f){ units.add(u); } }); - units.sort(u -> u.dst2(this)); - units.truncate(type().commandLimit); + //sort by hitbox size, then by distance + units.sort(Structs.comps(Structs.comparingFloat(u -> -u.hitSize), Structs.comparingFloat(u -> u.dst2(this)))); + units.truncate(type.commandLimit); command(formation, units); } @@ -73,13 +74,13 @@ abstract class CommanderComp implements Unitc{ void command(Formation formation, Seq units){ clearCommand(); - float spacing = hitSize() * 1.7f; - minFormationSpeed = type().speed; + float spacing = hitSize * 0.65f; + minFormationSpeed = type.speed; controlling.addAll(units); for(Unit unit : units){ FormationAI ai; - unit.controller(ai = new FormationAI(base(), formation)); + unit.controller(ai = new FormationAI(self(), formation)); spacing = Math.max(spacing, ai.formationSize()); minFormationSpeed = Math.min(minFormationSpeed, unit.type().speed); } @@ -104,7 +105,7 @@ abstract class CommanderComp implements Unitc{ void clearCommand(){ //reset controlled units for(Unit unit : controlling){ - if(unit.controller().isBeingControlled(base())){ + if(unit.controller().isBeingControlled(self())){ unit.controller(unit.type().createController()); } } diff --git a/core/src/mindustry/entities/comp/DamageComp.java b/core/src/mindustry/entities/comp/DamageComp.java index e46a7ec87c..d9b6105352 100644 --- a/core/src/mindustry/entities/comp/DamageComp.java +++ b/core/src/mindustry/entities/comp/DamageComp.java @@ -4,5 +4,5 @@ import mindustry.annotations.Annotations.*; @Component abstract class DamageComp{ - abstract float damage(); + float damage; } diff --git a/core/src/mindustry/entities/comp/DecalComp.java b/core/src/mindustry/entities/comp/DecalComp.java index 6db6b58f53..33ce6d406c 100644 --- a/core/src/mindustry/entities/comp/DecalComp.java +++ b/core/src/mindustry/entities/comp/DecalComp.java @@ -27,7 +27,7 @@ abstract class DecalComp implements Drawc, Timedc, Rotc, Posc{ @Replace public float clipSize(){ - return region.getWidth()*2; + return region.width *2; } } diff --git a/core/src/mindustry/entities/comp/EffectStateComp.java b/core/src/mindustry/entities/comp/EffectStateComp.java index 3ad57d5d19..776a696049 100644 --- a/core/src/mindustry/entities/comp/EffectStateComp.java +++ b/core/src/mindustry/entities/comp/EffectStateComp.java @@ -8,13 +8,16 @@ import mindustry.gen.*; @EntityDef(value = {EffectStatec.class, Childc.class}, pooled = true, serialize = false) @Component(base = true) abstract class EffectStateComp implements Posc, Drawc, Timedc, Rotc, Childc{ + @Import float time, lifetime, rotation, x, y; + @Import int id; + Color color = new Color(Color.white); Effect effect; Object data; @Override public void draw(){ - effect.render(id(), color, time(), rotation(), x(), y(), data); + lifetime = effect.render(id, color, time, lifetime, rotation, x, y, data); } @Replace diff --git a/core/src/mindustry/entities/comp/ElevationMoveComp.java b/core/src/mindustry/entities/comp/ElevationMoveComp.java index 07eae31a6c..f87bc1de0f 100644 --- a/core/src/mindustry/entities/comp/ElevationMoveComp.java +++ b/core/src/mindustry/entities/comp/ElevationMoveComp.java @@ -1,23 +1,18 @@ package mindustry.entities.comp; import mindustry.annotations.Annotations.*; +import mindustry.entities.*; +import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; -import static mindustry.Vars.*; - @Component abstract class ElevationMoveComp implements Velc, Posc, Flyingc, Hitboxc{ @Import float x, y; @Replace @Override - public void move(float cx, float cy){ - if(isFlying()){ - x += cx; - y += cy; - }else{ - collisions.move(this, cx, cy); - } + public SolidPred solidity(){ + return isFlying() ? null : EntityCollisions::solid; } } diff --git a/core/src/mindustry/entities/comp/EntityComp.java b/core/src/mindustry/entities/comp/EntityComp.java index 3e49ea01ce..a97a2e0cc3 100644 --- a/core/src/mindustry/entities/comp/EntityComp.java +++ b/core/src/mindustry/entities/comp/EntityComp.java @@ -6,7 +6,7 @@ import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.gen.*; -import static mindustry.Vars.player; +import static mindustry.Vars.*; @Component @BaseComponent @@ -40,7 +40,7 @@ abstract class EntityComp{ return false; } - T base(){ + T self(){ return (T)this; } diff --git a/core/src/mindustry/entities/comp/FireComp.java b/core/src/mindustry/entities/comp/FireComp.java index e3b066a60f..ea67ca9e19 100644 --- a/core/src/mindustry/entities/comp/FireComp.java +++ b/core/src/mindustry/entities/comp/FireComp.java @@ -97,11 +97,11 @@ abstract class FireComp implements Timedc, Posc, Firec, Syncc{ @Override public void afterRead(){ - Fires.register(base()); + Fires.register(self()); } @Override public void afterSync(){ - Fires.register(base()); + Fires.register(self()); } } diff --git a/core/src/mindustry/entities/comp/FlyingComp.java b/core/src/mindustry/entities/comp/FlyingComp.java index 415337622b..0c8c2f0277 100644 --- a/core/src/mindustry/entities/comp/FlyingComp.java +++ b/core/src/mindustry/entities/comp/FlyingComp.java @@ -1,14 +1,16 @@ package mindustry.entities.comp; +import arc.*; import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.world.blocks.environment.*; -import static mindustry.Vars.net; +import static mindustry.Vars.*; @Component abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ @@ -74,7 +76,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ } if(!hovering && isGrounded() && floor.isLiquid){ - if((splashTimer += Mathf.dst(deltaX(), deltaY())) >= 7f){ + if((splashTimer += Mathf.dst(deltaX(), deltaY())) >= (7f + hitSize()/8f)){ floor.walkEffect.at(x, y, hitSize() / 8f, floor.mapColor); splashTimer = 0f; } @@ -90,7 +92,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ //TODO is the netClient check necessary? if(drownTime >= 0.999f && !net.client()){ kill(); - //TODO drown event! + Events.fire(new UnitDrownEvent(self())); } }else{ drownTime = Mathf.lerpDelta(drownTime, 0f, 0.03f); diff --git a/core/src/mindustry/entities/comp/HitboxComp.java b/core/src/mindustry/entities/comp/HitboxComp.java index f92948af41..f44270ebed 100644 --- a/core/src/mindustry/entities/comp/HitboxComp.java +++ b/core/src/mindustry/entities/comp/HitboxComp.java @@ -2,8 +2,8 @@ package mindustry.entities.comp; import arc.func.*; import arc.math.*; -import arc.math.geom.QuadTree.*; import arc.math.geom.*; +import arc.math.geom.QuadTree.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; @@ -61,7 +61,8 @@ abstract class HitboxComp implements Posc, QuadTreeObject{ } public void hitboxTile(Rect rect){ - float scale = 0.66f; - rect.setCentered(x, y, hitSize * scale, hitSize * scale); + //tile hitboxes are never bigger than a tile, otherwise units get stuck + float size = Math.min(hitSize * 0.66f, 7.9f); + rect.setCentered(x, y, size, size); } } diff --git a/core/src/mindustry/entities/comp/LaunchCoreComp.java b/core/src/mindustry/entities/comp/LaunchCoreComp.java index 186cff2b2e..7283a9e220 100644 --- a/core/src/mindustry/entities/comp/LaunchCoreComp.java +++ b/core/src/mindustry/entities/comp/LaunchCoreComp.java @@ -44,7 +44,7 @@ abstract class LaunchCoreComp implements Drawc, Timedc{ Draw.z(Layer.weather - 1); TextureRegion region = block.icon(Cicon.full); - float rw = region.getWidth() * Draw.scl * scale, rh = region.getHeight() * Draw.scl * scale; + float rw = region.width * Draw.scl * scale, rh = region.height * Draw.scl * scale; Draw.alpha(alpha); Draw.rect(region, cx, cy, rw, rh, rotation - 45); diff --git a/core/src/mindustry/entities/comp/LegsComp.java b/core/src/mindustry/entities/comp/LegsComp.java index 9cc5d876e2..e6022ed91e 100644 --- a/core/src/mindustry/entities/comp/LegsComp.java +++ b/core/src/mindustry/entities/comp/LegsComp.java @@ -4,16 +4,16 @@ import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.*; +import mindustry.ai.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.blocks.environment.*; -import static mindustry.Vars.*; - @Component abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ @Import float x, y; @@ -26,8 +26,38 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ @Replace @Override - public void move(float cx, float cy){ - collisions.moveCheck(this, cx, cy, !type.allowLegStep ? EntityCollisions::solid : EntityCollisions::legsSolid); + public SolidPred solidity(){ + return !type.allowLegStep ? EntityCollisions::solid : EntityCollisions::legsSolid; + } + + @Override + @Replace + public int pathType(){ + return Pathfinder.costLegs; + } + + @Override + public void add(){ + resetLegs(); + } + + public void resetLegs(){ + float rot = baseRotation; + int count = type.legCount; + float legLength = type.legLength; + + this.legs = new Leg[count]; + + float spacing = 360f / count; + + for(int i = 0; i < legs.length; i++){ + Leg l = new Leg(); + + l.joint.trns(i * spacing + rot, legLength/2f + type.legBaseOffset).add(x, y); + l.base.trns(i * spacing + rot, legLength + type.legBaseOffset).add(x, y); + + legs[i] = l; + } } @Override @@ -37,23 +67,11 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ } float rot = baseRotation; - int count = type.legCount; float legLength = type.legLength; //set up initial leg positions if(legs.length != type.legCount){ - this.legs = new Leg[count]; - - float spacing = 360f / count; - - for(int i = 0; i < legs.length; i++){ - Leg l = new Leg(); - - l.joint.trns(i * spacing + rot, legLength/2f + type.legBaseOffset).add(x, y); - l.base.trns(i * spacing + rot, legLength + type.legBaseOffset).add(x, y); - - legs[i] = l; - } + resetLegs(); } float moveSpeed = type.legSpeed; diff --git a/core/src/mindustry/entities/comp/MechComp.java b/core/src/mindustry/entities/comp/MechComp.java index d258e75406..94bb380c96 100644 --- a/core/src/mindustry/entities/comp/MechComp.java +++ b/core/src/mindustry/entities/comp/MechComp.java @@ -1,19 +1,86 @@ package mindustry.entities.comp; +import arc.graphics.*; import arc.math.*; +import arc.math.geom.*; import arc.util.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.entities.*; import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; + +import static mindustry.Vars.*; @Component abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, ElevationMovec{ + @Import float x, y, hitSize; + @Import UnitType type; + @SyncField(false) @SyncLocal float baseRotation; - transient float walkTime; + transient float walkTime, walkExtension; + transient private boolean walked; @Override public void update(){ - float len = deltaLen(); - baseRotation = Angles.moveToward(baseRotation, deltaAngle(), type().baseRotateSpeed * Mathf.clamp(len / type().speed / Time.delta) * Time.delta); - walkTime += len; + //trigger animation only when walking manually + if(walked || net.client()){ + float len = deltaLen(); + baseRotation = Angles.moveToward(baseRotation, deltaAngle(), type().baseRotateSpeed * Mathf.clamp(len / type().speed / Time.delta) * Time.delta); + walkTime += len; + walked = false; + } + + //update mech effects + float extend = walkExtend(false); + float base = walkExtend(true); + float extendScl = base % 1f; + + float lastExtend = walkExtension; + + if(extendScl < lastExtend && base % 2f > 1f){ + int side = -Mathf.sign(extend); + float width = hitSize / 2f * side, length = type.mechStride * 1.35f; + + float cx = x + Angles.trnsx(baseRotation, length, width), + cy = y + Angles.trnsy(baseRotation, length, width); + + if(type.mechStepShake > 0){ + Effect.shake(type.mechStepShake, type.mechStepShake, cx, cy); + } + + if(type.mechStepParticles){ + Tile tile = world.tileWorld(cx, cy); + if(tile != null){ + Color color = tile.floor().mapColor; + Fx.unitLand.at(cx, cy, hitSize/8f, color); + } + } + } + + walkExtension = extendScl; + } + + public float walkExtend(boolean scaled){ + + //now ranges from -maxExtension to maxExtension*3 + float raw = walkTime % (type.mechStride * 4); + + if(scaled) return raw / type.mechStride; + + if(raw > type.mechStride*3) raw = raw - type.mechStride * 4; + else if(raw > type.mechStride*2) raw = type.mechStride * 2 - raw; + else if(raw > type.mechStride) raw = type.mechStride * 2 - raw; + + return raw; + } + + @Override + public void moveAt(Vec2 vector, float acceleration){ + if(!vector.isZero()){ + //mark walking state when moving in a controlled manner + walked = true; + } } } diff --git a/core/src/mindustry/entities/comp/MinerComp.java b/core/src/mindustry/entities/comp/MinerComp.java index 1ec4794ca2..6bac9dbd60 100644 --- a/core/src/mindustry/entities/comp/MinerComp.java +++ b/core/src/mindustry/entities/comp/MinerComp.java @@ -5,7 +5,6 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.gen.*; @@ -33,7 +32,12 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ } boolean mining(){ - return mineTile != null; + return mineTile != null && !(((Object)this) instanceof Builderc && ((Builderc)(Object)this).activelyBuilding()); + } + + public boolean validMine(Tile tile){ + return !(tile == null || tile.block() != Blocks.air || !within(tile.worldx(), tile.worldy(), miningRange) + || tile.drop() == null || !canMine(tile.drop())); } @Override @@ -50,21 +54,19 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ } } - if(mineTile == null || core == null || mineTile.block() != Blocks.air || dst(mineTile.worldx(), mineTile.worldy()) > miningRange - || (((Object)this) instanceof Builderc && ((Builderc)(Object)this).activelyBuilding()) - || mineTile.drop() == null || !canMine(mineTile.drop())){ + if(core == null || !validMine(mineTile)){ mineTile = null; mineTimer = 0f; - }else{ + }else if(mining()){ Item item = mineTile.drop(); - rotation(Mathf.slerpDelta(rotation(), angleTo(mineTile.worldx(), mineTile.worldy()), 0.4f)); + lookAt(angleTo(mineTile.worldx(), mineTile.worldy())); mineTimer += Time.delta *type.mineSpeed; if(Mathf.chance(0.06 * Time.delta)){ Fx.pulverizeSmall.at(mineTile.worldx() + Mathf.range(tilesize / 2f), mineTile.worldy() + Mathf.range(tilesize / 2f), 0f, item.color); } - if(mineTimer >= 50f + item.hardness*10f){ + if(mineTimer >= 50f + item.hardness*15f){ mineTimer = 0; if(within(core, mineTransferRange) && core.acceptStack(item, 1, this) == 1 && offloadImmediately()){ @@ -106,7 +108,6 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ Drawf.laser(team(), Core.atlas.find("minelaser"), Core.atlas.find("minelaser-end"), px, py, ex, ey, 0.75f); - //TODO hack? if(isLocal()){ Lines.stroke(1f, Pal.accent); Lines.poly(mineTile.worldx(), mineTile.worldy(), 4, tilesize / 2f * Mathf.sqrt2, Time.time()); diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index eb1c253f23..ac1f4fa323 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -25,15 +25,15 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ } boolean canPickup(Unit unit){ - return payloadUsed() + unit.hitSize * unit.hitSize <= type.payloadCapacity; + return payloadUsed() + unit.hitSize * unit.hitSize <= type.payloadCapacity + 0.001f && unit.team == team() && unit.isAI(); } boolean canPickup(Building build){ - return payloadUsed() + build.block.size * build.block.size * Vars.tilesize * Vars.tilesize <= type.payloadCapacity; + return payloadUsed() + build.block.size * build.block.size * Vars.tilesize * Vars.tilesize <= type.payloadCapacity + 0.001f && build.canPickup(); } boolean canPickupPayload(Payload pay){ - return payloadUsed() + pay.size()*pay.size() <= type.payloadCapacity; + return payloadUsed() + pay.size()*pay.size() <= type.payloadCapacity + 0.001f; } boolean hasPayload(){ @@ -48,11 +48,14 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ unit.remove(); payloads.add(new UnitPayload(unit)); Fx.unitPickup.at(unit); + if(Vars.net.client()){ + Vars.netClient.clearRemovedEntity(unit.id); + } } void pickup(Building tile){ - tile.tile().remove(); - payloads.add(new BlockPayload(tile)); + tile.tile.remove(); + payloads.add(new BuildPayload(tile)); Fx.unitPickup.at(tile); } @@ -71,6 +74,11 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ boolean tryDropPayload(Payload payload){ Tile on = tileOn(); + //clear removed state of unit so it can be synced + if(Vars.net.client() && payload instanceof UnitPayload){ + Vars.netClient.clearRemovedEntity(((UnitPayload)payload).unit.id); + } + //drop off payload on an acceptor if possible if(on != null && on.build != null && on.build.acceptPayload(on.build, payload)){ Fx.unitDrop.at(on.build); @@ -78,10 +86,10 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ return true; } - if(payload instanceof BlockPayload){ - return dropBlock((BlockPayload)payload); - }else if(payload instanceof UnitPayload){ - return dropUnit((UnitPayload)payload); + if(payload instanceof BuildPayload b){ + return dropBlock(b); + }else if(payload instanceof UnitPayload p){ + return dropUnit(p); } return false; } @@ -90,7 +98,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ Unit u = payload.unit; //can't drop ground units - if(((tileOn() == null || tileOn().solid()) && u.elevation < 0.1f) || (!floorOn().isLiquid && u instanceof WaterMovec)){ + if(!u.canPass(tileX(), tileY())){ return false; } @@ -110,14 +118,16 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ } /** @return whether the tile has been successfully placed. */ - boolean dropBlock(BlockPayload payload){ - Building tile = payload.entity; - int tx = Vars.world.toTile(x - tile.block().offset), ty = Vars.world.toTile(y - tile.block().offset); + boolean dropBlock(BuildPayload payload){ + Building tile = payload.build; + int tx = Vars.world.toTile(x - tile.block.offset), ty = Vars.world.toTile(y - tile.block.offset); Tile on = Vars.world.tile(tx, ty); - if(on != null && Build.validPlace(tile.block(), tile.team, tx, ty, tile.rotation)){ + if(on != null && Build.validPlace(tile.block, tile.team, tx, ty, tile.rotation, false)){ int rot = (int)((rotation + 45f) / 90f) % 4; payload.place(on, rot); + if(isPlayer()) payload.build.lastAccessed = getPlayer().name; + Fx.unitDrop.at(tile); Fx.placeBlock.at(on.drawx(), on.drawy(), on.block().size); return true; diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index 8b35ac83d8..4ee481b032 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -6,7 +6,6 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.scene.ui.layout.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.pooling.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -33,7 +32,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra @Import float x, y; - @NonNull @ReadOnly Unit unit = Nulls.unit; + @ReadOnly Unit unit = Nulls.unit; transient private Unit lastReadUnit = Nulls.unit; transient @Nullable NetConnection con; @@ -71,6 +70,10 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra return unit.icon(); } + public boolean displayAmmo(){ + return unit instanceof BlockUnitc || state.rules.unitAmmo; + } + public void reset(){ team = state.rules.defaultTeam; admin = typing = false; @@ -88,7 +91,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra @Replace public float clipSize(){ - return unit.isNull() ? 20 : unit.type().hitsize * 2f; + return unit.isNull() ? 20 : unit.type().hitSize * 2f; } @Override @@ -130,7 +133,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra deathTimer += Time.delta; if(deathTimer >= deathDelay){ //request spawn - this happens serverside only - core.requestSpawn(base()); + core.requestSpawn(self()); deathTimer = 0; } } @@ -185,9 +188,14 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra if(unit.isRemote()){ unit.snapInterpolation(); } + + //reset selected block when switching units + if(!headless && isLocal()){ + control.input.block = null; + } } - Events.fire(new UnitChangeEvent(base(), unit)); + Events.fire(new UnitChangeEvent(self(), unit)); } boolean dead(){ diff --git a/core/src/mindustry/entities/comp/PosComp.java b/core/src/mindustry/entities/comp/PosComp.java index d43d097bac..15c665739e 100644 --- a/core/src/mindustry/entities/comp/PosComp.java +++ b/core/src/mindustry/entities/comp/PosComp.java @@ -1,14 +1,14 @@ package mindustry.entities.comp; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; @Component abstract class PosComp implements Position{ @@ -52,10 +52,11 @@ abstract class PosComp implements Position{ boolean onSolid(){ Tile tile = tileOn(); - return tile != null && tile.solid(); + return tile == null || tile.solid(); } - @Nullable Tile tileOn(){ + @Nullable + Tile tileOn(){ return world.tileWorld(x, y); } diff --git a/core/src/mindustry/entities/comp/PosTeamDef.java b/core/src/mindustry/entities/comp/PosTeamDef.java new file mode 100644 index 0000000000..0157200d66 --- /dev/null +++ b/core/src/mindustry/entities/comp/PosTeamDef.java @@ -0,0 +1,9 @@ +package mindustry.entities.comp; + +import mindustry.annotations.Annotations.*; +import mindustry.gen.*; + +//dummy target definition +@EntityDef(value = Teamc.class, genio = false, isFinal = false) +public class PosTeamDef{ +} diff --git a/core/src/mindustry/entities/comp/PuddleComp.java b/core/src/mindustry/entities/comp/PuddleComp.java index 35ab03416c..669ee7e1f2 100644 --- a/core/src/mindustry/entities/comp/PuddleComp.java +++ b/core/src/mindustry/entities/comp/PuddleComp.java @@ -128,6 +128,6 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ @Override public void afterRead(){ - Puddles.register(base()); + Puddles.register(self()); } } diff --git a/core/src/mindustry/entities/comp/ShieldComp.java b/core/src/mindustry/entities/comp/ShieldComp.java index 5125faa96e..274286b801 100644 --- a/core/src/mindustry/entities/comp/ShieldComp.java +++ b/core/src/mindustry/entities/comp/ShieldComp.java @@ -5,11 +5,11 @@ import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.gen.*; -import static mindustry.Vars.minArmorDamage; +import static mindustry.Vars.*; @Component abstract class ShieldComp implements Healthc, Posc{ - @Import float health, hitTime, x, y; + @Import float health, hitTime, x, y, healthMultiplier; @Import boolean dead; /** Absorbs health damage. */ @@ -22,8 +22,8 @@ abstract class ShieldComp implements Healthc, Posc{ @Replace @Override public void damage(float amount){ + amount /= healthMultiplier; //apply armor - //TODO balancing of armor stats & minArmorDamage amount = Math.max(amount - armor, minArmorDamage * amount); hitTime = 1f; diff --git a/core/src/mindustry/entities/comp/StatusComp.java b/core/src/mindustry/entities/comp/StatusComp.java index bf61535026..fcce0d0a02 100644 --- a/core/src/mindustry/entities/comp/StatusComp.java +++ b/core/src/mindustry/entities/comp/StatusComp.java @@ -1,7 +1,6 @@ package mindustry.entities.comp; import arc.graphics.*; -import arc.math.*; import arc.struct.*; import arc.util.*; import arc.util.pooling.*; @@ -20,12 +19,9 @@ abstract class StatusComp implements Posc, Flyingc{ private Seq statuses = new Seq<>(); private transient Bits applied = new Bits(content.getBy(ContentType.status).size); - @ReadOnly transient float speedMultiplier = 1, damageMultiplier = 1, armorMultiplier = 1, reloadMultiplier = 1; + @ReadOnly transient float speedMultiplier = 1, damageMultiplier = 1, healthMultiplier = 1, reloadMultiplier = 1; - /** @return damage taken based on status armor multipliers */ - float getShieldDamage(float amount){ - return amount * Mathf.clamp(1f - armorMultiplier / 100f); - } + @Import UnitType type; /** Apply a status effect for 1 tick (for permanent effects) **/ void apply(StatusEffect effect){ @@ -46,7 +42,7 @@ abstract class StatusComp implements Posc, Flyingc{ return; }else if(entry.effect.reactsWith(effect)){ //find opposite StatusEntry.tmp.effect = entry.effect; - entry.effect.getTransition(base(), effect, entry.time, duration, StatusEntry.tmp); + entry.effect.getTransition(self(), effect, entry.time, duration, StatusEntry.tmp); entry.time = StatusEntry.tmp.time; if(StatusEntry.tmp.effect != entry.effect){ @@ -102,13 +98,13 @@ abstract class StatusComp implements Posc, Flyingc{ @Override public void update(){ Floor floor = floorOn(); - if(isGrounded()){ + if(isGrounded() && !type.hovering){ //apply effect apply(floor.status, floor.statusDuration); } applied.clear(); - speedMultiplier = damageMultiplier = armorMultiplier = reloadMultiplier = 1f; + speedMultiplier = damageMultiplier = healthMultiplier = reloadMultiplier = 1f; if(statuses.isEmpty()) return; @@ -126,17 +122,17 @@ abstract class StatusComp implements Posc, Flyingc{ statuses.remove(index); }else{ speedMultiplier *= entry.effect.speedMultiplier; - armorMultiplier *= entry.effect.armorMultiplier; + healthMultiplier *= entry.effect.healthMultiplier; damageMultiplier *= entry.effect.damageMultiplier; reloadMultiplier *= entry.effect.reloadMultiplier; - entry.effect.update(base(), entry.time); + entry.effect.update(self(), entry.time); } } } public void draw(){ for(StatusEntry e : statuses){ - e.effect.draw(base()); + e.effect.draw(self()); } } diff --git a/core/src/mindustry/entities/comp/TeamComp.java b/core/src/mindustry/entities/comp/TeamComp.java index ed03caca5c..c58e97b7fd 100644 --- a/core/src/mindustry/entities/comp/TeamComp.java +++ b/core/src/mindustry/entities/comp/TeamComp.java @@ -1,11 +1,11 @@ package mindustry.entities.comp; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.game.*; import mindustry.gen.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; @Component abstract class TeamComp implements Posc{ @@ -17,15 +17,18 @@ abstract class TeamComp implements Posc{ return team.rules().cheat; } - public @Nullable Building core(){ + @Nullable + public Building core(){ return team.core(); } - public @Nullable Building closestCore(){ + @Nullable + public Building closestCore(){ return state.teams.closestCore(x, y, team); } - public @Nullable Building closestEnemyCore(){ + @Nullable + public Building closestEnemyCore(){ return state.teams.closestEnemyCore(x, y, team); } } diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index 1eb509c785..1cf0f7e216 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -5,12 +5,14 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.struct.*; import arc.util.*; +import mindustry.ai.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.ctype.*; import mindustry.entities.*; +import mindustry.entities.abilities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -21,23 +23,25 @@ import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; +import mindustry.world.blocks.payloads.*; import static mindustry.Vars.*; @Component(base = true) -abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Displayable, Senseable{ +abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Commanderc, Displayable, Senseable, Ranged{ - @Import boolean hovering; - @Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health; - @Import boolean dead; + @Import boolean hovering, dead; + @Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo; @Import Team team; @Import int id; private UnitController controller; private UnitType type; - boolean spawnedByCore, deactivated; + boolean spawnedByCore; + double flag; - transient float timer1, timer2; + transient Seq abilities = new Seq<>(0); + private transient float resupplyTime = Mathf.random(10f); public void moveAt(Vec2 vector){ moveAt(vector, type.accel); @@ -61,27 +65,54 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I return type.hasWeapons(); } + /** @return speed with boost multipliers factored in. */ + public float realSpeed(){ + return Mathf.lerp(1f, type.canBoost ? type.boostMultiplier : 1f, elevation) * type.speed; + } + + @Override public float range(){ return type.range; } @Replace public float clipSize(){ - return type.region.getWidth() * 2f; + return Math.max(type.region.width * 2f, type.clipSize); } @Override public double sense(LAccess sensor){ - if(sensor == LAccess.totalItems) return stack().amount; - if(sensor == LAccess.rotation) return rotation; - if(sensor == LAccess.health) return health; - if(sensor == LAccess.x) return x; - if(sensor == LAccess.y) return y; - if(sensor == LAccess.team) return team.id; - if(sensor == LAccess.shooting) return isShooting() ? 1 : 0; - if(sensor == LAccess.shootX) return aimX(); - if(sensor == LAccess.shootY) return aimY(); - return 0; + return switch(sensor){ + case totalItems -> stack().amount; + case itemCapacity -> type.itemCapacity; + case rotation -> rotation; + case health -> health; + case maxHealth -> maxHealth; + case x -> x; + case y -> y; + case team -> team.id; + case shooting -> isShooting() ? 1 : 0; + case shootX -> aimX(); + case shootY -> aimY(); + case flag -> flag; + case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0; + default -> 0; + }; + } + + @Override + public Object senseObject(LAccess sensor){ + return switch(sensor){ + case type -> type; + case name -> controller instanceof Player p ? p.name : null; + case firstItem -> stack().amount == 0 ? null : item(); + case payloadType -> self() instanceof Payloadc pay ? + (pay.payloads().isEmpty() ? null : + pay.payloads().peek() instanceof UnitPayload p1 ? p1.unit.type() : + pay.payloads().peek() instanceof BuildPayload p2 ? p2.block() : null) : null; + default -> noSensed; + }; + } @Override @@ -93,7 +124,14 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override @Replace public boolean canDrown(){ - return isGrounded() && !hovering && type.canDrown && !(this instanceof WaterMovec); + return isGrounded() && !hovering && type.canDrown; + } + + @Override + @Replace + public boolean canShoot(){ + //cannot shoot while boosting + return !(type.canBoost && isFlying()); } @Override @@ -109,7 +147,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void controller(UnitController next){ this.controller = next; - if(controller.unit() != base()) controller.unit(base()); + if(controller.unit() != self()) controller.unit(self()); } @Override @@ -139,8 +177,13 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I return type; } + /** @return pathfinder path type for calculating costs */ + public int pathType(){ + return Pathfinder.costGround; + } + public void lookAt(float angle){ - rotation = Angles.moveToward(rotation, angle, type.rotateSpeed * Time.delta); + rotation = Angles.moveToward(rotation, angle, type.rotateSpeed * Time.delta * speedMultiplier()); } public void lookAt(Position pos){ @@ -156,30 +199,33 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } public int count(){ - return teamIndex.countType(team, type); + return team.data().countType(type); } public int cap(){ return Units.getCap(team); } - private void setStats(UnitType type){ + public void setStats(UnitType type){ this.type = type; this.maxHealth = type.health; this.drag = type.drag; this.armor = type.armor; - this.hitSize = type.hitsize; + this.hitSize = type.hitSize; this.hovering = type.hovering; if(controller == null) controller(type.createController()); if(mounts().length != type.weapons.size) setupWeapons(type); + if(abilities.size != type.abilities.size){ + abilities = type.abilities.map(Ability::copy); + } } @Override public void afterSync(){ //set up type info after reading setStats(this.type); - controller.unit(base()); + controller.unit(self()); } @Override @@ -191,20 +237,18 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void add(){ - teamIndex.updateCount(team, type, 1); //check if over unit cap - if(count() > cap() && !spawnedByCore){ - deactivated = true; - }else{ - teamIndex.updateActiveCount(team, type, 1); + if(count() > cap() && !spawnedByCore && !dead){ + Call.unitCapDeath(self()); + team.data().updateCount(type, -1); } } @Override public void remove(){ - teamIndex.updateCount(team, type, -1); - controller.removed(base()); + team.data().updateCount(type, -1); + controller.removed(self()); } @Override @@ -213,18 +257,29 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I Effect.shake(type.landShake, type.landShake, this); } - type.landed(base()); + type.landed(self()); } @Override public void update(){ - //activate the unit when possible - if(!net.client() && deactivated && teamIndex.countActive(team, type) < Units.getCap(team)){ - teamIndex.updateActiveCount(team, type, 1); - deactivated = false; + + type.update(self()); + + if(state.rules.unitAmmo && ammo < type.ammoCapacity - 0.0001f){ + resupplyTime += Time.delta; + + //resupply only at a fixed interval to prevent lag + if(resupplyTime > 10f){ + type.ammoType.resupply(self()); + resupplyTime = 0f; + } } - if(!deactivated) type.update(base()); + if(abilities.size > 0){ + for(Ability a : abilities){ + a.update(self()); + } + } drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f); @@ -274,25 +329,27 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I if(tile != null && isGrounded() && !type.hovering){ //unit block update if(tile.build != null){ - tile.build.unitOn(base()); + tile.build.unitOn(self()); } //apply damage if(floor.damageTaken > 0f){ damageContinuous(floor.damageTaken); } + } - if(tile.solid()){ - if(type.canBoost){ - elevation = 1f; - }else if(!net.client()){ - kill(); - } + //kill entities on tiles that are solid to them + if(tile != null && !canPassOn()){ + //boost if possible + if(type.canBoost){ + elevation = 1f; + }else if(!net.client()){ + kill(); } } //AI only updates on the server - if(!net.client() && !dead && !deactivated){ + if(!net.client() && !dead){ controller.updateUnit(); } @@ -301,14 +358,9 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I resetController(); } - //do not control anything when deactivated - if(deactivated){ - controlWeapons(false, false); - } - //remove units spawned by the core if(spawnedByCore && !isPlayer()){ - Call.unitDespawn(base()); + Call.unitDespawn(self()); } } @@ -319,8 +371,8 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I /** Actually destroys the unit, removing it and creating explosions. **/ public void destroy(){ - float explosiveness = 2f + item().explosiveness * stack().amount; - float flammability = item().flammability * stack().amount; + float explosiveness = 2f + item().explosiveness * stack().amount / 2f; + float flammability = item().flammability * stack().amount / 2f; Damage.dynamicExplosion(x, y, flammability, explosiveness, 0f, bounds() / 2f, Pal.darkFlame, state.rules.damageExplosions); float shake = hitSize / 3f; @@ -330,7 +382,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I Effect.shake(shake, shake, this); type.deathSound.at(this); - Events.fire(new UnitDestroyEvent(base())); + Events.fire(new UnitDestroyEvent(self())); if(explosiveness > 7f && isLocal()){ Events.fire(Trigger.suicideBomb); @@ -338,13 +390,13 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I //if this unit crash landed (was flying), damage stuff in a radius if(type.flying){ - Damage.damage(team,x, y, hitSize * 1.1f, hitSize * type.crashDamageMultiplier, true, false, true); + Damage.damage(team,x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true); } if(!headless){ for(int i = 0; i < type.wreckRegions.length; i++){ if(type.wreckRegions[i].found()){ - float range = type.hitsize/4f; + float range = type.hitSize /4f; Tmp.v1.rnd(range); Effect.decal(type.wreckRegions[i], x + Tmp.v1.x, y + Tmp.v1.y, rotation - 90); } @@ -356,7 +408,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void display(Table table){ - type.display(base(), table); + type.display(self(), table); } @Override @@ -366,7 +418,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void draw(){ - type.draw(base()); + type.draw(self()); } @Override @@ -385,7 +437,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I dead = true; //don't waste time when the unit is already on the ground, just destroy it - if(isGrounded()){ + if(!type.flying){ destroy(); } } diff --git a/core/src/mindustry/entities/comp/VelComp.java b/core/src/mindustry/entities/comp/VelComp.java index 469d217665..ca04d6a40c 100644 --- a/core/src/mindustry/entities/comp/VelComp.java +++ b/core/src/mindustry/entities/comp/VelComp.java @@ -4,8 +4,11 @@ import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.annotations.Annotations.*; +import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; +import static mindustry.Vars.*; + @Component abstract class VelComp implements Posc{ @Import float x, y; @@ -22,12 +25,35 @@ abstract class VelComp implements Posc{ vel.scl(Mathf.clamp(1f - drag * Time.delta)); } + /** @return function to use for check solid state. if null, no checking is done. */ + @Nullable + SolidPred solidity(){ + return null; + } + + /** @return whether this entity can move through a location*/ + boolean canPass(int tileX, int tileY){ + SolidPred s = solidity(); + return s == null || !s.solid(tileX, tileY); + } + + /** @return whether this entity can exist on its current location*/ + boolean canPassOn(){ + return canPass(tileX(), tileY()); + } + boolean moving(){ return !vel.isZero(0.01f); } void move(float cx, float cy){ - x += cx; - y += cy; + SolidPred check = solidity(); + + if(check != null){ + collisions.move(self(), cx, cy, check); + }else{ + x += cx; + y += cy; + } } } diff --git a/core/src/mindustry/entities/comp/WaterMoveComp.java b/core/src/mindustry/entities/comp/WaterMoveComp.java index 9671d694ea..f87679efdb 100644 --- a/core/src/mindustry/entities/comp/WaterMoveComp.java +++ b/core/src/mindustry/entities/comp/WaterMoveComp.java @@ -4,17 +4,17 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.util.*; +import mindustry.ai.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; -import static mindustry.Vars.*; - //just a proof of concept @Component abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ @@ -38,16 +38,8 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ @Override @Replace - public void lookAt(float angle){ - if(onLiquid()){ - rotation = Angles.moveToward(rotation, angle, type.rotateSpeed * Time.delta); - } - } - - @Override - @Replace - public boolean canShoot(){ - return onLiquid(); + public int pathType(){ + return Pathfinder.costWater; } @Override @@ -74,13 +66,8 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ @Replace @Override - public void move(float cx, float cy){ - if(isGrounded()){ - collisions.moveCheck(this, cx, cy, EntityCollisions::waterSolid); - }else{ - x += cx; - y += cy; - } + public SolidPred solidity(){ + return isFlying() ? null : EntityCollisions::waterSolid; } @Replace diff --git a/core/src/mindustry/entities/comp/WeaponsComp.java b/core/src/mindustry/entities/comp/WeaponsComp.java index 5665bee7db..d891dbc1e4 100644 --- a/core/src/mindustry/entities/comp/WeaponsComp.java +++ b/core/src/mindustry/entities/comp/WeaponsComp.java @@ -13,12 +13,11 @@ import mindustry.type.*; import static mindustry.Vars.*; @Component -abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ +abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ @Import float x, y, rotation, reloadMultiplier; @Import Vec2 vel; + @Import UnitType type; - /** minimum cursor distance from unit, fixes 'cross-eyed' shooting */ - static final float minAimDst = 18f; /** temporary weapon sequence number */ static int sequenceNum = 0; @@ -29,6 +28,10 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ boolean isShooting; float ammo; + float ammof(){ + return ammo / type.ammoCapacity; + } + void setWeaponRotation(float rotation){ for(WeaponMount mount : mounts){ mount.rotation = rotation; @@ -62,7 +65,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ /** Aim at something. This will make all mounts point at it. */ void aim(float x, float y){ Tmp.v1.set(x, y).sub(this.x, this.y); - if(Tmp.v1.len() < minAimDst) Tmp.v1.setLength(minAimDst); + if(Tmp.v1.len() < type.aimDst) Tmp.v1.setLength(type.aimDst); x = Tmp.v1.x + this.x; y = Tmp.v1.y + this.y; @@ -80,6 +83,16 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ return true; } + @Override + public void remove(){ + for(WeaponMount mount : mounts){ + if(mount.bullet != null){ + mount.bullet.time = mount.bullet.lifetime - 10f; + mount.bullet = null; + } + } + } + /** Update shooting and rotation for this unit. */ @Override public void update(){ @@ -89,6 +102,27 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ Weapon weapon = mount.weapon; mount.reload = Math.max(mount.reload - Time.delta * reloadMultiplier, 0); + float weaponRotation = this.rotation - 90 + (weapon.rotate ? mount.rotation : 0); + float mountX = this.x + Angles.trnsx(this.rotation - 90, weapon.x, weapon.y), + mountY = this.y + Angles.trnsy(this.rotation - 90, weapon.x, weapon.y); + float shootX = mountX + Angles.trnsx(weaponRotation, weapon.shootX, weapon.shootY), + shootY = mountY + Angles.trnsy(weaponRotation, weapon.shootX, weapon.shootY); + float shootAngle = weapon.rotate ? weaponRotation + 90 : Angles.angle(shootX, shootY, mount.aimX, mount.aimY) + (this.rotation - angleTo(mount.aimX, mount.aimY)); + + //update continuous state + if(weapon.continuous && mount.bullet != null){ + if(!mount.bullet.isAdded() || mount.bullet.time >= mount.bullet.lifetime || mount.bullet.type != weapon.bullet){ + mount.bullet = null; + }else{ + mount.bullet.rotation(weaponRotation + 90); + mount.bullet.set(shootX, shootY); + vel.add(Tmp.v1.trns(rotation + 180f, mount.bullet.type.recoil)); + } + }else{ + //heat decreases when not firing + mount.heat = Math.max(mount.heat - Time.delta * reloadMultiplier / mount.weapon.cooldownTime, 0); + } + //flip weapon shoot side for alternating weapons at half reload if(weapon.otherSide != -1 && weapon.alternate && mount.side == weapon.flipSprite && mount.reload + Time.delta > weapon.reload/2f && mount.reload <= weapon.reload/2f){ @@ -98,10 +132,10 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ //rotate if applicable if(weapon.rotate && (mount.rotate || mount.shoot) && can){ - float axisX = this.x + Angles.trnsx(rotation - 90, weapon.x, weapon.y), - axisY = this.y + Angles.trnsy(rotation - 90, weapon.x, weapon.y); + float axisX = this.x + Angles.trnsx(this.rotation - 90, weapon.x, weapon.y), + axisY = this.y + Angles.trnsy(this.rotation - 90, weapon.x, weapon.y); - mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - rotation; + mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - this.rotation; mount.rotation = Angles.moveToward(mount.rotation, mount.targetRotation, weapon.rotateSpeed * Time.delta); }else if(!weapon.rotate){ mount.rotation = 0; @@ -118,19 +152,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ mount.reload <= 0.0001f && //reload has to be 0 Angles.within(weapon.rotate ? mount.rotation : this.rotation, mount.targetRotation, mount.weapon.shootCone) //has to be within the cone ){ - - float rotation = this.rotation - 90; - float weaponRotation = rotation + (weapon.rotate ? mount.rotation : 0); - - //m a t h - - float mountX = this.x + Angles.trnsx(rotation, weapon.x, weapon.y), - mountY = this.y + Angles.trnsy(rotation, weapon.x, weapon.y); - float shootX = mountX + Angles.trnsx(weaponRotation, weapon.shootX, weapon.shootY), - shootY = mountY + Angles.trnsy(weaponRotation, weapon.shootX, weapon.shootY); - float shootAngle = weapon.rotate ? weaponRotation + 90 : Angles.angle(shootX, shootY, mount.aimX, mount.aimY) + (this.rotation - angleTo(mount.aimX, mount.aimY)); - - shoot(weapon, shootX, shootY, mount.aimX, mount.aimY, shootAngle, Mathf.sign(weapon.x)); + shoot(mount, shootX, shootY, mount.aimX, mount.aimY, shootAngle, Mathf.sign(weapon.x)); mount.reload = weapon.reload; @@ -140,37 +162,59 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ } } - private void shoot(Weapon weapon, float x, float y, float aimX, float aimY, float rotation, int side){ + private void shoot(WeaponMount mount, float x, float y, float aimX, float aimY, float rotation, int side){ + Weapon weapon = mount.weapon; float baseX = this.x, baseY = this.y; + boolean delay = weapon.firstShotDelay > 0f; - weapon.shootSound.at(x, y, Mathf.random(0.8f, 1.0f)); + (delay ? weapon.chargeSound : weapon.shootSound).at(x, y, Mathf.random(0.8f, 1.0f)); BulletType ammo = weapon.bullet; float lifeScl = ammo.scaleVelocity ? Mathf.clamp(Mathf.dst(x, y, aimX, aimY) / ammo.range()) : 1f; sequenceNum = 0; - if(weapon.shotDelay > 0.01f){ + if(delay){ Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> { - Time.run(sequenceNum * weapon.shotDelay, () -> bullet(weapon, x + this.x - baseX, y + this.y - baseY, f + Mathf.range(weapon.inaccuracy), lifeScl)); + Time.run(sequenceNum * weapon.shotDelay + weapon.firstShotDelay, () -> { + if(!isAdded()) return; + mount.bullet = bullet(weapon, x + this.x - baseX, y + this.y - baseY, f + Mathf.range(weapon.inaccuracy), lifeScl); + }); sequenceNum++; }); }else{ - Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> bullet(weapon, x, y, f + Mathf.range(weapon.inaccuracy), lifeScl)); + Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> mount.bullet = bullet(weapon, x, y, f + Mathf.range(weapon.inaccuracy), lifeScl)); } - if(this instanceof Velc){ - ((Velc)this).vel().add(Tmp.v1.trns(rotation + 180f, ammo.recoil)); - } boolean parentize = ammo.keepVelocity; - Effect.shake(weapon.shake, weapon.shake, x, y); + if(delay){ + Time.run(weapon.firstShotDelay, () -> { + if(!isAdded()) return; + + vel.add(Tmp.v1.trns(rotation + 180f, ammo.recoil)); + Effect.shake(weapon.shake, weapon.shake, x, y); + mount.heat = 1f; + weapon.shootSound.at(x, y, Mathf.random(0.8f, 1.0f)); + }); + }else{ + vel.add(Tmp.v1.trns(rotation + 180f, ammo.recoil)); + Effect.shake(weapon.shake, weapon.shake, x, y); + mount.heat = 1f; + } + weapon.ejectEffect.at(x, y, rotation * side); ammo.shootEffect.at(x, y, rotation, parentize ? this : null); ammo.smokeEffect.at(x, y, rotation, parentize ? this : null); + apply(weapon.shootStatus, weapon.shootStatusDuration); } - private void bullet(Weapon weapon, float x, float y, float angle, float lifescl){ - weapon.bullet.create(this, team(), x, y, angle, (1f - weapon.velocityRnd) + Mathf.random(weapon.velocityRnd), lifescl); + private Bullet bullet(Weapon weapon, float x, float y, float angle, float lifescl){ + float xr = Mathf.range(weapon.xRand); + + return weapon.bullet.create(this, team(), + x + Angles.trnsx(angle, 0, xr), + y + Angles.trnsy(angle, 0, xr), + angle, (1f - weapon.velocityRnd) + Mathf.random(weapon.velocityRnd), lifescl); } } diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java index aa95959e60..b02fa5dc00 100644 --- a/core/src/mindustry/entities/units/AIController.java +++ b/core/src/mindustry/entities/units/AIController.java @@ -2,9 +2,9 @@ package mindustry.entities.units; import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; +import mindustry.ai.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.type.*; @@ -16,9 +16,12 @@ import static mindustry.Vars.*; public class AIController implements UnitController{ protected static final Vec2 vec = new Vec2(); protected static final int timerTarget = 0; + protected static final int timerTarget2 = 1; + protected static final int timerTarget3 = 2; protected Unit unit; protected Interval timer = new Interval(4); + protected AIController fallback; /** main target that is being faced */ protected Teamc target; @@ -27,29 +30,74 @@ public class AIController implements UnitController{ { timer.reset(0, Mathf.random(40f)); + timer.reset(1, Mathf.random(60f)); } @Override public void updateUnit(){ + //use fallback AI when possible + if(useFallback() && (fallback != null || (fallback = fallback()) != null)){ + if(fallback.unit != unit) fallback.unit(unit); + fallback.updateUnit(); + return; + } + + updateVisuals(); updateTargeting(); updateMovement(); } + @Nullable + protected AIController fallback(){ + return null; + } + + protected boolean useFallback(){ + return false; + } + protected UnitCommand command(){ return unit.team.data().command; } + protected void updateVisuals(){ + + if(unit.isFlying()){ + unit.wobble(); + + if(unit.moving()){ + unit.lookAt(unit.vel.angle()); + } + } + } + protected void updateMovement(){ } protected void updateTargeting(){ if(unit.hasWeapons()){ - updateWeapons(); } } + protected boolean invalid(Teamc target){ + return Units.invalidateTarget(target, unit.team, unit.x, unit.y); + } + + + protected void pathfind(int pathTarget){ + int costType = unit.pathType(); + + Tile tile = unit.tileOn(); + if(tile == null) return; + Tile targetTile = pathfinder.getTargetTile(tile, pathfinder.getField(unit.team, costType, pathTarget)); + + if(tile == targetTile || (costType == Pathfinder.costWater && !targetTile.floor().isLiquid)) return; + + unit.moveAt(vec.trns(unit.angleTo(targetTile), unit.type().speed)); + } + protected void updateWeapons(){ if(targets.length != unit.mounts.length) targets = new Teamc[unit.mounts.length]; @@ -60,7 +108,7 @@ public class AIController implements UnitController{ target = findTarget(unit.x, unit.y, unit.range(), unit.type().targetAir, unit.type().targetGround); } - if(Units.invalidateTarget(target, unit.team, unit.x, unit.y)){ + if(invalid(target)){ target = null; } @@ -86,13 +134,11 @@ public class AIController implements UnitController{ boolean shoot = false; if(targets[i] != null){ - shoot = targets[i].within(mountX, mountY, weapon.bullet.range()); + shoot = targets[i].within(mountX, mountY, weapon.bullet.range()) && shouldShoot(); - if(shoot){ - Vec2 to = Predict.intercept(unit, targets[i], weapon.bullet.speed); - mount.aimX = to.x; - mount.aimY = to.y; - } + Vec2 to = Predict.intercept(unit, targets[i], weapon.bullet.speed); + mount.aimX = to.x; + mount.aimY = to.y; } mount.shoot = shoot; @@ -100,6 +146,10 @@ public class AIController implements UnitController{ } } + protected boolean shouldShoot(){ + return true; + } + protected Teamc targetFlag(float x, float y, BlockFlag flag, boolean enemy){ Tile target = Geometry.findClosest(x, y, enemy ? indexer.getEnemy(unit.team, flag) : indexer.getAllied(unit.team, flag)); return target == null ? null : target.build; @@ -138,19 +188,23 @@ public class AIController implements UnitController{ vec.rotate((circleLength - vec.len()) / circleLength * 180f); } - vec.setLength(speed * Time.delta); + vec.setLength(speed); unit.moveAt(vec); } protected void moveTo(Position target, float circleLength){ + moveTo(target, circleLength, 100f); + } + + protected void moveTo(Position target, float circleLength, float smooth){ if(target == null) return; vec.set(target).sub(unit); - float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / 100f, -1f, 1f); + float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / smooth, -1f, 1f); - vec.setLength(unit.type().speed * Time.delta * length); + vec.setLength(unit.realSpeed() * length); if(length < -0.5f){ vec.rotate(180f); }else if(length < 0){ diff --git a/core/src/mindustry/entities/units/BuildPlan.java b/core/src/mindustry/entities/units/BuildPlan.java index fb4a7a2816..9d8e98a05f 100644 --- a/core/src/mindustry/entities/units/BuildPlan.java +++ b/core/src/mindustry/entities/units/BuildPlan.java @@ -2,7 +2,7 @@ package mindustry.entities.units; import arc.func.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.gen.*; import mindustry.world.*; diff --git a/core/src/mindustry/entities/units/WeaponMount.java b/core/src/mindustry/entities/units/WeaponMount.java index 89becb6dcf..80bf713f20 100644 --- a/core/src/mindustry/entities/units/WeaponMount.java +++ b/core/src/mindustry/entities/units/WeaponMount.java @@ -1,5 +1,7 @@ package mindustry.entities.units; +import arc.util.*; +import mindustry.gen.*; import mindustry.type.*; public class WeaponMount{ @@ -11,6 +13,8 @@ public class WeaponMount{ public float rotation; /** destination rotation; do not modify! */ public float targetRotation; + /** current heat, 0 to 1*/ + public float heat; /** aiming position in world coordinates */ public float aimX, aimY; /** whether to shoot right now */ @@ -19,6 +23,8 @@ public class WeaponMount{ public boolean rotate = false; /** extra state for alternating weapons */ public boolean side; + /** current bullet for continuous weapons */ + public @Nullable Bullet bullet; public WeaponMount(Weapon weapon){ this.weapon = weapon; diff --git a/core/src/mindustry/game/DefaultWaves.java b/core/src/mindustry/game/DefaultWaves.java index 07269df4c1..53a0bfa99c 100644 --- a/core/src/mindustry/game/DefaultWaves.java +++ b/core/src/mindustry/game/DefaultWaves.java @@ -1,47 +1,53 @@ package mindustry.game; -import arc.struct.Seq; +import arc.func.*; +import arc.math.*; +import arc.struct.*; +import arc.util.*; import mindustry.content.*; -import mindustry.type.ItemStack; +import mindustry.type.*; + +import static mindustry.content.UnitTypes.*; public class DefaultWaves{ private Seq spawns; public Seq get(){ - if(spawns == null && UnitTypes.dagger != null){ + if(spawns == null && dagger != null){ spawns = Seq.with( - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ end = 10; unitScaling = 2f; }}, - new SpawnGroup(UnitTypes.crawler){{ + new SpawnGroup(crawler){{ begin = 4; end = 13; unitAmount = 2; unitScaling = 1.5f; }}, - new SpawnGroup(UnitTypes.flare){{ + new SpawnGroup(flare){{ begin = 12; end = 16; unitScaling = 1f; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ begin = 11; unitScaling = 1.7f; spacing = 2; max = 4; + shieldScaling = 15f; }}, - new SpawnGroup(UnitTypes.pulsar){{ + new SpawnGroup(pulsar){{ begin = 13; spacing = 3; unitScaling = 0.5f; }}, - new SpawnGroup(UnitTypes.mace){{ + new SpawnGroup(mace){{ begin = 7; spacing = 3; unitScaling = 2; @@ -49,28 +55,33 @@ public class DefaultWaves{ end = 30; }}, - new SpawnGroup(UnitTypes.dagger){{ - begin = 8; + new SpawnGroup(dagger){{ + begin = 12; unitScaling = 1; unitAmount = 4; spacing = 2; + shieldScaling = 10f; + max = 20; }}, - new SpawnGroup(UnitTypes.mace){{ + new SpawnGroup(mace){{ begin = 28; spacing = 3; unitScaling = 1; end = 40; + shieldScaling = 20f; }}, - new SpawnGroup(UnitTypes.mace){{ + new SpawnGroup(spiroct){{ begin = 45; spacing = 3; - unitScaling = 2; + unitScaling = 1; + max = 10; + shieldScaling = 10f; effect = StatusEffects.overdrive; }}, - new SpawnGroup(UnitTypes.mace){{ + new SpawnGroup(mace){{ begin = 120; spacing = 2; unitScaling = 3; @@ -78,21 +89,23 @@ public class DefaultWaves{ effect = StatusEffects.overdrive; }}, - new SpawnGroup(UnitTypes.flare){{ + new SpawnGroup(flare){{ begin = 16; unitScaling = 1; spacing = 2; + shieldScaling = 20f; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(quasar){{ begin = 82; spacing = 3; unitAmount = 4; unitScaling = 3; + shieldScaling = 30f; effect = StatusEffects.overdrive; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(pulsar){{ begin = 41; spacing = 5; unitAmount = 1; @@ -100,15 +113,16 @@ public class DefaultWaves{ effect = StatusEffects.shielded; }}, - new SpawnGroup(UnitTypes.fortress){{ + new SpawnGroup(fortress){{ begin = 40; spacing = 5; unitAmount = 2; unitScaling = 2; max = 20; + shieldScaling = 30; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ begin = 35; spacing = 3; unitAmount = 4; @@ -117,7 +131,7 @@ public class DefaultWaves{ end = 60; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ begin = 42; spacing = 3; unitAmount = 4; @@ -126,72 +140,226 @@ public class DefaultWaves{ end = 130; }}, - new SpawnGroup(UnitTypes.horizon){{ + new SpawnGroup(horizon){{ begin = 40; unitAmount = 2; spacing = 2; unitScaling = 2; + shieldScaling = 20; }}, - new SpawnGroup(UnitTypes.flare){{ + new SpawnGroup(flare){{ begin = 50; unitAmount = 4; unitScaling = 3; spacing = 5; + shields = 100f; + shieldScaling = 10f; effect = StatusEffects.overdrive; }}, - new SpawnGroup(UnitTypes.zenith){{ + new SpawnGroup(zenith){{ begin = 50; unitAmount = 2; unitScaling = 3; spacing = 5; max = 16; + shieldScaling = 30; }}, - new SpawnGroup(UnitTypes.horizon){{ + new SpawnGroup(nova){{ begin = 53; unitAmount = 2; unitScaling = 3; spacing = 4; + shieldScaling = 20; }}, - new SpawnGroup(UnitTypes.atrax){{ + new SpawnGroup(atrax){{ begin = 31; unitAmount = 4; unitScaling = 1; spacing = 3; + shieldScaling = 5f; }}, - new SpawnGroup(UnitTypes.scepter){{ + new SpawnGroup(scepter){{ begin = 41; unitAmount = 1; unitScaling = 1; spacing = 30; + shieldScaling = 10f; }}, - new SpawnGroup(UnitTypes.reign){{ + new SpawnGroup(reign){{ begin = 81; unitAmount = 1; unitScaling = 1; spacing = 40; + shieldScaling = 20f; }}, - new SpawnGroup(UnitTypes.antumbra){{ - begin = 131; + new SpawnGroup(antumbra){{ + begin = 120; unitAmount = 1; unitScaling = 1; spacing = 40; + shieldScaling = 20f; }}, - new SpawnGroup(UnitTypes.horizon){{ + new SpawnGroup(vela){{ + begin = 100; + unitAmount = 1; + unitScaling = 1; + spacing = 30; + shieldScaling = 20f; + }}, + + new SpawnGroup(corvus){{ + begin = 145; + unitAmount = 1; + unitScaling = 1; + spacing = 35; + shieldScaling = 30f; + shields = 100; + }}, + + new SpawnGroup(horizon){{ begin = 90; unitAmount = 2; unitScaling = 3; spacing = 4; + shields = 40f; + shieldScaling = 20f; + }}, + + new SpawnGroup(atrax){{ + begin = 210; + unitAmount = 1; + unitScaling = 1; + spacing = 35; + shields = 1000; + shieldScaling = 35f; }} ); } return spawns == null ? new Seq<>() : spawns; } + + //TODO move elsewhere + public static Seq generate(float difficulty){ + UnitType[][] species = { + {dagger, mace, fortress, scepter, reign}, + {nova, pulsar, quasar, vela, corvus}, + {crawler, atrax, spiroct, arkyid, toxopid}, + //{risso, minke, bryde, sei, omura}, //questionable choices + //{mono, poly, mega, quad, oct}, //do not attack + {flare, horizon, zenith, antumbra, eclipse} + }; + + //required progression: + //- extra periodic patterns + + Seq out = new Seq<>(); + + //max reasonable wave, after which everything gets boring + int cap = 200; + + float shieldStart = 30, shieldsPerWave = 20 + difficulty*30f; + + Intc createProgression = start -> { + //main sequence + UnitType[] curSpecies = Structs.random(species); + int curTier = 0; + + for(int i = start; i < cap;){ + int f = i; + int next = Mathf.random(8, 16); + + float shieldAmount = Math.max((i - shieldStart) * shieldsPerWave, 0); + int space = start == 0 ? 1 : Mathf.random(1, 2); + + //main progression + out.add(new SpawnGroup(curSpecies[Math.min(curTier, curSpecies.length - 1)]){{ + unitAmount = f == 0 ? 1 : 10; + begin = f; + end = f + next >= cap ? never : f + next; + max = 20; + unitScaling = Mathf.random(1f, 2f); + shields = shieldAmount; + shieldScaling = shieldsPerWave; + spacing = space; + }}); + + //extra progression that tails out, blends in + out.add(new SpawnGroup(curSpecies[Math.min(curTier, curSpecies.length - 1)]){{ + unitAmount = 6; + begin = f + next; + end = f + next + Mathf.random(8, 12); + max = 14; + unitScaling = Mathf.random(2f); + spacing = Mathf.random(2, 3); + shields = shieldAmount; + shieldScaling = shieldsPerWave; + }}); + + i += next; + if(curTier < 3 || Mathf.chance(0.2)){ + curTier ++; + } + + //do not spawn bosses + curTier = Math.min(curTier, 3); + + //small chance to switch species + if(Mathf.chance(0.3)){ + curSpecies = Structs.random(species); + } + } + }; + + createProgression.get(0); + + int step = 5 + Mathf.random(3); + + while(step <= cap){ + createProgression.get(step); + step += (int)(Mathf.random(12, 25) * Mathf.lerp(1f, 0.4f, difficulty)); + } + + int bossWave = (int)(Mathf.random(30, 60) * Mathf.lerp(1f, 0.7f, difficulty)); + int bossSpacing = (int)(Mathf.random(25, 40) * Mathf.lerp(1f, 0.6f, difficulty)); + + //main boss progression + out.add(new SpawnGroup(Structs.random(species)[4]){{ + unitAmount = 1; + begin = bossWave; + spacing = bossSpacing; + end = never; + max = 16; + unitScaling = bossSpacing; + shieldScaling = shieldsPerWave; + }}); + + //alt boss progression + out.add(new SpawnGroup(Structs.random(species)[4]){{ + unitAmount = 1; + begin = bossWave + Mathf.random(3, 5) * bossSpacing; + spacing = bossSpacing; + end = never; + max = 16; + unitScaling = bossSpacing; + shieldScaling = shieldsPerWave; + }}); + + //shift back waves on higher difficulty for a harder start + int shift = Math.max((int)(difficulty * 15 - 5), 0); + + for(SpawnGroup group : out){ + group.begin -= shift; + group.end -= shift; + } + + return out; + } } diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index 98622b4bc5..272c26363f 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -1,6 +1,6 @@ package mindustry.game; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.core.GameState.*; import mindustry.ctype.*; import mindustry.entities.units.*; @@ -40,7 +40,6 @@ public class EventType{ public static class WinEvent{} public static class LoseEvent{} - public static class LaunchEvent{} public static class ResizeEvent{} public static class MapMakeEvent{} public static class MapPublishEvent{} @@ -149,7 +148,7 @@ public class EventType{ } } - /** Called when the configures sets a specific block. */ + /** Called when the player configures a specific building. */ public static class ConfigEvent{ public final Building tile; public final Player player; @@ -162,6 +161,17 @@ public class EventType{ } } + /** Called when a player taps any tile. */ + public static class TapEvent{ + public final Player player; + public final Tile tile; + + public TapEvent(Player player, Tile tile){ + this.tile = tile; + this.player = player; + } + } + public static class GameOverEvent{ public final Team winner; @@ -271,6 +281,14 @@ public class EventType{ } } + public static class UnitDrownEvent{ + public final Unit unit; + + public UnitDrownEvent(Unit unit){ + this.unit = unit; + } + } + public static class UnitCreateEvent{ public final Unit unit; diff --git a/core/src/mindustry/game/Objectives.java b/core/src/mindustry/game/Objectives.java index ad66fb9219..a4097c51fc 100644 --- a/core/src/mindustry/game/Objectives.java +++ b/core/src/mindustry/game/Objectives.java @@ -2,7 +2,6 @@ package mindustry.game; import arc.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; import mindustry.ctype.*; import mindustry.type.*; @@ -10,7 +9,7 @@ import mindustry.type.*; public class Objectives{ public static class Research implements Objective{ - public @NonNull UnlockableContent content; + public UnlockableContent content; public Research(UnlockableContent content){ this.content = content; @@ -29,6 +28,7 @@ public class Objectives{ } } + //TODO fix public static class SectorComplete extends SectorObjective{ public SectorComplete(SectorPreset zone){ @@ -39,18 +39,18 @@ public class Objectives{ @Override public boolean complete(){ - return preset.sector.isCaptured(); + return preset.sector.save != null && preset.sector.save.meta.wave >= preset.sector.save.meta.rules.winWave; } @Override public String display(){ - return Core.bundle.format("requirement.capture", preset.localizedName); + return Core.bundle.format("requirement.wave", preset.sector.save == null ? "" : preset.sector.save.meta.rules.winWave, preset.localizedName); } } //TODO merge public abstract static class SectorObjective implements Objective{ - public @NonNull SectorPreset preset; + public SectorPreset preset; } /** Defines a specific objective for a game. */ diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index 824671dd8c..a101fe8592 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -2,7 +2,7 @@ package mindustry.game; import arc.graphics.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import arc.util.serialization.*; import arc.util.serialization.Json.*; import mindustry.content.*; @@ -38,6 +38,8 @@ public class Rules{ public boolean canGameOver = true; /** Whether reactors can explode and damage other blocks. */ public boolean reactorExplosions = true; + /** Whether schematics are allowed */ + public boolean schematicsAllowed = true; /** Whether friendly explosions can occur and set fire/damage other blocks. */ public boolean damageExplosions = true; /** Whether fire is enabled. */ @@ -66,8 +68,6 @@ public class Rules{ public float dropZoneRadius = 300f; /** Time between waves in ticks. */ public float waveSpacing = 60 * 60 * 2; - /** How many times longer a launch wave takes. */ - public float launchWaveMultiplier = 2f; /** Wave after which the player 'wins'. Used in sectors. Use a value <= 0 to disable. */ public int winWave = 0; /** Base unit cap. Can still be increased by blocks. */ diff --git a/core/src/mindustry/game/Saves.java b/core/src/mindustry/game/Saves.java index 501eaf2c3c..fcebb28a8f 100644 --- a/core/src/mindustry/game/Saves.java +++ b/core/src/mindustry/game/Saves.java @@ -2,11 +2,10 @@ package mindustry.game; import arc.*; import arc.assets.*; -import arc.struct.*; import arc.files.*; import arc.graphics.*; +import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.async.*; import mindustry.*; import mindustry.core.GameState.*; @@ -61,6 +60,9 @@ public class Saves{ //automatically assign sector save slots for(SaveSlot slot : saves){ if(slot.getSector() != null){ + if(slot.getSector().save != null){ + Log.warn("Sector @ has two corresponding saves: @ and @", slot.getSector(), slot.getSector().save.file, slot.file); + } slot.getSector().save = slot; } } @@ -75,7 +77,6 @@ public class Saves{ } public void update(){ - SaveSlot current = this.current; if(current != null && state.isGame() && !(state.isPaused() && Core.scene.hasDialog())){ @@ -90,14 +91,13 @@ public class Saves{ if(time > Core.settings.getInt("saveinterval") * 60){ saving = true; - Time.runTask(2f, () -> { - try{ - current.save(); - }catch(Throwable e){ - e.printStackTrace(); - } - saving = false; - }); + try{ + current.save(); + }catch(Throwable e){ + e.printStackTrace(); + } + + Time.runTask(3f, () -> saving = false); time = 0; } @@ -128,6 +128,7 @@ public class Saves{ sector.save.setName(sector.save.file.nameWithoutExtension()); saves.add(sector.save); } + sector.save.setAutosave(true); sector.save.save(); lastSectorSave = sector.save; Core.settings.put("last-sector-save", sector.save.getName()); diff --git a/core/src/mindustry/game/Schematic.java b/core/src/mindustry/game/Schematic.java index 01088826bb..e539ae69a2 100644 --- a/core/src/mindustry/game/Schematic.java +++ b/core/src/mindustry/game/Schematic.java @@ -2,9 +2,7 @@ package mindustry.game; import arc.files.*; import arc.struct.*; -import arc.struct.IntIntMap.*; -import arc.util.ArcAnnotate.*; -import mindustry.*; +import arc.util.*; import mindustry.content.*; import mindustry.mod.Mods.*; import mindustry.type.*; @@ -12,7 +10,6 @@ import mindustry.world.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.storage.*; import mindustry.world.consumers.*; -import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -24,7 +21,7 @@ public class Schematic implements Publishable, Comparable{ /** Associated mod. If null, no mod is associated with this schematic. */ public @Nullable LoadedMod mod; - public Schematic(Seq tiles, @NonNull StringMap tags, int width, int height){ + public Schematic(Seq tiles, StringMap tags, int width, int height){ this.tiles = tiles; this.tags = tags; this.width = width; @@ -39,29 +36,23 @@ public class Schematic implements Publishable, Comparable{ return tiles.sumf(s -> s.block.consumes.has(ConsumeType.power) ? s.block.consumes.getPower().usage : 0f); } - public Seq requirements(){ - IntIntMap amounts = new IntIntMap(); + public ItemSeq requirements(){ + ItemSeq requirements = new ItemSeq(); tiles.each(t -> { - if(t.block.buildVisibility == BuildVisibility.hidden) return; - for(ItemStack stack : t.block.requirements){ - amounts.increment(stack.item.id, stack.amount); + requirements.add(stack.item, stack.amount); } }); - Seq stacks = new Seq<>(); - for(Entry ent : amounts.entries()){ - stacks.add(new ItemStack(Vars.content.item(ent.key), ent.value)); - } - stacks.sort(); - return stacks; + + return requirements; } public boolean hasCore(){ return tiles.contains(s -> s.block instanceof CoreBlock); } - public @NonNull CoreBlock findCore(){ + public CoreBlock findCore(){ Stile tile = tiles.find(s -> s.block instanceof CoreBlock); if(tile == null) throw new IllegalArgumentException("Schematic is missing a core!"); return (CoreBlock)tile.block; @@ -71,6 +62,10 @@ public class Schematic implements Publishable, Comparable{ return tags.get("name", "unknown"); } + public String description(){ + return tags.get("description", ""); + } + public void save(){ schematics.saveChanges(this); } @@ -99,7 +94,7 @@ public class Schematic implements Publishable, Comparable{ @Override public String steamDescription(){ - return null; + return description(); } @Override @@ -127,7 +122,7 @@ public class Schematic implements Publishable, Comparable{ } public static class Stile{ - public @NonNull Block block; + public Block block; public short x, y; public Object config; public byte rotation; diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java index 8debf7bd14..596a571d3a 100644 --- a/core/src/mindustry/game/Schematics.java +++ b/core/src/mindustry/game/Schematics.java @@ -9,7 +9,6 @@ import arc.graphics.gl.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import arc.util.io.Streams.*; @@ -28,6 +27,7 @@ import mindustry.io.*; import mindustry.world.*; import mindustry.world.blocks.*; import mindustry.world.blocks.distribution.*; +import mindustry.world.blocks.legacy.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.production.*; import mindustry.world.blocks.sandbox.*; @@ -346,9 +346,9 @@ public class Schematics implements Loadable{ for(int cy = y; cy <= y2; cy++){ Building linked = world.build(cx, cy); - if(linked != null &&linked.block().isVisible() && !(linked.block() instanceof ConstructBlock)){ - int top = linked.block().size/2; - int bot = linked.block().size % 2 == 1 ? -linked.block().size/2 : -(linked.block().size - 1)/2; + if(linked != null && linked.block.isVisible() && !(linked.block instanceof ConstructBlock)){ + int top = linked.block.size/2; + int bot = linked.block.size % 2 == 1 ? -linked.block.size/2 : -(linked.block.size - 1)/2; minx = Math.min(linked.tileX() + bot, minx); miny = Math.min(linked.tileY() + bot, miny); maxx = Math.max(linked.tileX() + top, maxx); @@ -374,11 +374,11 @@ public class Schematics implements Loadable{ for(int cy = oy; cy <= oy2; cy++){ Building tile = world.build(cx, cy); - if(tile != null && !counted.contains(tile.pos()) && !(tile.block() instanceof ConstructBlock) - && (tile.block().isVisible() || (tile.block() instanceof CoreBlock))){ + if(tile != null && !counted.contains(tile.pos()) && !(tile.block instanceof ConstructBlock) + && (tile.block.isVisible() || (tile.block instanceof CoreBlock))){ Object config = tile.config(); - tiles.add(new Stile(tile.block(), tile.tileX() + offsetX, tile.tileY() + offsetY, config, (byte)tile.rotation)); + tiles.add(new Stile(tile.block, tile.tileX() + offsetX, tile.tileY() + offsetY, config, (byte)tile.rotation)); counted.add(tile.pos()); } } @@ -486,8 +486,9 @@ public class Schematics implements Loadable{ IntMap blocks = new IntMap<>(); byte length = stream.readByte(); for(int i = 0; i < length; i++){ - Block block = Vars.content.getByName(ContentType.block, stream.readUTF()); - blocks.put(i, block == null ? Blocks.air : block); + String name = stream.readUTF(); + Block block = Vars.content.getByName(ContentType.block, SaveFileReader.fallback.get(name, name)); + blocks.put(i, block == null || block instanceof LegacyBlock ? Blocks.air : block); } int total = stream.readInt(); diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 7b585890c3..b66dc5bf95 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -3,13 +3,15 @@ package mindustry.game; import arc.math.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.content.*; +import mindustry.ctype.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.storage.CoreBlock.*; import mindustry.world.modules.*; +import java.util.*; + import static mindustry.Vars.*; public class SectorInfo{ @@ -23,7 +25,7 @@ public class SectorInfo{ /** Export statistics. */ public ObjectMap export = new ObjectMap<>(); /** Items stored in all cores. */ - public ObjectIntMap coreItems = new ObjectIntMap<>(); + public ItemSeq coreItems = new ItemSeq(); /** The best available core type. */ public Block bestCoreType = Blocks.air; /** Max storage capacity. */ @@ -32,13 +34,31 @@ public class SectorInfo{ public boolean hasCore = true; /** Sector that was launched from. */ public @Nullable Sector origin; + /** Launch destination. */ + public @Nullable Sector destination; + /** Resources known to occur at this sector. */ + public Seq resources = new Seq<>(); /** Time spent at this sector. Do not use unless you know what you're doing. */ public transient float internalTimeSpent; /** Counter refresh state. */ private transient Interval time = new Interval(); /** Core item storage to prevent spoofing. */ - private transient int[] lastCoreItems; + private transient int[] coreItemCounts; + + /** Handles core item changes. */ + public void handleCoreItem(Item item, int amount){ + if(coreItemCounts == null){ + coreItemCounts = new int[content.items().size]; + } + coreItemCounts[item.id] += amount; + } + + /** @return the real location items go when launched on this sector */ + public Sector getRealDestination(){ + //on multiplayer the destination is, by default, the first captured sector (basically random) + return !net.client() || destination != null ? destination : state.rules.sector.planet.sectors.find(Sector::hasBase); + } /** Updates export statistics. */ public void handleItemExport(ItemStack stack){ @@ -69,7 +89,7 @@ public class SectorInfo{ if(entity != null){ ItemModule items = entity.items; for(int i = 0; i < items.length(); i++){ - coreItems.put(content.item(i), items.get(i)); + coreItems.set(content.item(i), items.get(i)); } } @@ -77,24 +97,22 @@ public class SectorInfo{ bestCoreType = !hasCore ? Blocks.air : state.rules.defaultTeam.cores().max(e -> e.block.size).block; storageCapacity = entity != null ? entity.storageCapacity : 0; - //update sector's internal time spent counter1 + //update sector's internal time spent counter state.rules.sector.setTimeSpent(internalTimeSpent); } /** Update averages of various stats, updates some special sector logic. * Called every frame. */ public void update(){ + //updating in multiplayer as a client doesn't make sense + if(net.client()) return; + internalTimeSpent += Time.delta; - //time spent exceeds turn duration! - if(internalTimeSpent >= turnDuration && internalTimeSpent - Time.delta < turnDuration){ - universe.displayTimeEnd(); - } - - //create last stored core items - if(lastCoreItems == null){ - lastCoreItems = new int[content.items().size]; - updateCoreDeltas(); + //autorun turns + if(internalTimeSpent >= turnDuration){ + internalTimeSpent = 0; + universe.runTurn(); } CoreBuild ent = state.rules.defaultTeam.core(); @@ -110,15 +128,16 @@ public class SectorInfo{ stat.loaded = true; } - //how the resources changed - only interested in negative deltas, since that's what happens during spoofing - int coreDelta = Math.min(ent == null ? 0 : ent.items.get(item) - lastCoreItems[item.id], 0); - //add counter, subtract how many items were taken from the core during this time - stat.means.add(Math.max(stat.counter + coreDelta, 0)); + stat.means.add(Math.max(stat.counter, 0)); stat.counter = 0; stat.mean = stat.means.rawMean(); }); + if(coreItemCounts == null){ + coreItemCounts = new int[content.items().size]; + } + //refresh core items for(Item item : content.items()){ ExportStat stat = production.get(item, ExportStat::new); @@ -129,21 +148,14 @@ public class SectorInfo{ //get item delta //TODO is preventing negative production a good idea? - int delta = Math.max((ent == null ? 0 : ent.items.get(item)) - lastCoreItems[item.id], 0); + int delta = Math.max(ent == null ? 0 : coreItemCounts[item.id], 0); //store means stat.means.add(delta); stat.mean = stat.means.rawMean(); } - updateCoreDeltas(); - } - } - - private void updateCoreDeltas(){ - CoreBuild ent = state.rules.defaultTeam.core(); - for(int i = 0; i < lastCoreItems.length; i++){ - lastCoreItems[i] = ent == null ? 0 : ent.items.get(i); + Arrays.fill(coreItemCounts, 0); } } diff --git a/core/src/mindustry/game/SpawnGroup.java b/core/src/mindustry/game/SpawnGroup.java index 15f7c98fff..f9ae7c74d3 100644 --- a/core/src/mindustry/game/SpawnGroup.java +++ b/core/src/mindustry/game/SpawnGroup.java @@ -1,5 +1,6 @@ package mindustry.game; +import arc.util.*; import arc.util.serialization.*; import arc.util.serialization.Json.*; import mindustry.content.*; @@ -8,7 +9,7 @@ import mindustry.gen.*; import mindustry.io.legacy.*; import mindustry.type.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; /** * A spawn group defines spawn information for a specific type of unit, with optional extra information like @@ -27,7 +28,7 @@ public class SpawnGroup implements Serializable{ /** The spacing, in waves, of spawns. For example, 2 = spawns every other wave */ public int spacing = 1; /** Maximum amount of units that spawn */ - public int max = 100; + public int max = 40; /** How many waves need to pass before the amount of units spawned increases by 1 */ public float unitScaling = never; /** Shield points that this unit has. */ @@ -37,8 +38,10 @@ public class SpawnGroup implements Serializable{ /** Amount of enemies spawned initially, with no scaling */ public int unitAmount = 1; /** Status effect applied to the spawned unit. Null to disable. */ + @Nullable public StatusEffect effect; /** Items this unit spawns with. Null to disable. */ + @Nullable public ItemStack items; public SpawnGroup(UnitType type){ @@ -51,6 +54,7 @@ public class SpawnGroup implements Serializable{ /** Returns the amount of units spawned on a specific wave. */ public int getUnitsSpawned(int wave){ + if(spacing == 0) spacing = 1; if(wave < begin || wave > end || (wave - begin) % spacing != 0){ return 0; } @@ -84,12 +88,12 @@ public class SpawnGroup implements Serializable{ if(begin != 0) json.writeValue("begin", begin); if(end != never) json.writeValue("end", end); if(spacing != 1) json.writeValue("spacing", spacing); - //if(max != 40) json.writeValue("max", max); + if(max != 40) json.writeValue("max", max); if(unitScaling != never) json.writeValue("scaling", unitScaling); if(shields != 0) json.writeValue("shields", shields); if(shieldScaling != 0) json.writeValue("shieldScaling", shieldScaling); if(unitAmount != 1) json.writeValue("amount", unitAmount); - if(effect != null) json.writeValue("effect", effect.id); + if(effect != null) json.writeValue("effect", effect.name); } @Override @@ -101,12 +105,18 @@ public class SpawnGroup implements Serializable{ begin = data.getInt("begin", 0); end = data.getInt("end", never); spacing = data.getInt("spacing", 1); - //max = data.getInt("max", 40); + max = data.getInt("max", 40); unitScaling = data.getFloat("scaling", never); shields = data.getFloat("shields", 0); shieldScaling = data.getFloat("shieldScaling", 0); unitAmount = data.getInt("amount", 1); - effect = content.getByID(ContentType.status, data.getInt("effect", -1)); + + //old boss effect ID + if(data.has("effect") && data.get("effect").isNumber() && data.getInt("effect", -1) == 8){ + effect = StatusEffects.boss; + }else{ + effect = content.getByName(ContentType.status, data.has("effect") && data.get("effect").isString() ? data.getString("effect", "none") : "none"); + } } @Override diff --git a/core/src/mindustry/game/Stats.java b/core/src/mindustry/game/Stats.java index 4a03f6199e..1d175607ba 100644 --- a/core/src/mindustry/game/Stats.java +++ b/core/src/mindustry/game/Stats.java @@ -22,6 +22,7 @@ public class Stats{ /** Friendly buildings destroyed. */ public int buildingsDestroyed; + //TODO fix public RankResult calculateRank(Sector zone, boolean launched){ float score = 0; @@ -39,7 +40,7 @@ public class Stats{ //weigh used fractions float frac = 0f; - Seq obtainable = Seq.select(zone.data.resources, i -> i instanceof Item).as(); + Seq obtainable = zone.save == null ? new Seq<>() : zone.save.meta.secinfo.resources.select(i -> i instanceof Item).as(); for(Item item : obtainable){ frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size; } diff --git a/core/src/mindustry/game/Team.java b/core/src/mindustry/game/Team.java index 3028edf3f4..1ab345dc10 100644 --- a/core/src/mindustry/game/Team.java +++ b/core/src/mindustry/game/Team.java @@ -4,7 +4,7 @@ import arc.*; import arc.graphics.*; import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.game.Rules.*; import mindustry.game.Teams.*; import mindustry.graphics.*; @@ -74,7 +74,7 @@ public class Team implements Comparable{ /** @return the core items for this team, or an empty item module. * Never add to the resulting item module, as it is mutable. */ - public @NonNull ItemModule items(){ + public ItemModule items(){ return core() == null ? ItemModule.empty : core().items; } @@ -91,7 +91,8 @@ public class Team implements Comparable{ return state.teams.get(this); } - public @Nullable CoreBuild core(){ + @Nullable + public CoreBuild core(){ return data().core(); } diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index e513c31fc6..5e38b43eb2 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -2,15 +2,20 @@ package mindustry.game; import arc.func.*; import arc.math.geom.*; +import arc.struct.Queue; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.*; import mindustry.ai.*; import mindustry.content.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.type.*; +import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.storage.CoreBlock.*; +import java.util.*; + import static mindustry.Vars.*; /** Class for various team-based utilities. */ @@ -24,7 +29,8 @@ public class Teams{ active.add(get(Team.crux)); } - public @Nullable CoreBuild closestEnemyCore(float x, float y, Team team){ + @Nullable + public CoreBuild closestEnemyCore(float x, float y, Team team){ for(Team enemy : team.enemies()){ CoreBuild tile = Geometry.findClosest(x, y, enemy.cores()); if(tile != null) return tile; @@ -32,7 +38,8 @@ public class Teams{ return null; } - public @Nullable CoreBuild closestCore(float x, float y, Team team){ + @Nullable + public CoreBuild closestCore(float x, float y, Team team){ return Geometry.findClosest(x, y, get(team).cores); } @@ -65,9 +72,7 @@ public class Teams{ /** Returns team data by type. */ public TeamData get(Team team){ - if(map[team.id] == null){ - map[team.id] = new TeamData(team); - } + if(map[team.id] == null) map[team.id] = new TeamData(team); return map[team.id]; } @@ -127,6 +132,61 @@ public class Teams{ } } + private void count(Unit unit){ + unit.team.data().updateCount(unit.type(), 1); + + if(unit instanceof Payloadc){ + ((Payloadc)unit).payloads().each(p -> { + if(p instanceof UnitPayload){ + count(((UnitPayload)p).unit); + } + }); + } + } + + public void updateTeamStats(){ + for(Team team : Team.all){ + TeamData data = team.data(); + + data.unitCount = 0; + data.units.clear(); + if(data.tree != null){ + data.tree.clear(); + } + + if(data.typeCounts != null){ + Arrays.fill(data.typeCounts, 0); + } + + //clear old unit records + if(data.unitsByType != null){ + for(int i = 0; i < data.unitsByType.length; i++){ + if(data.unitsByType[i] != null){ + data.unitsByType[i].clear(); + } + } + } + } + + for(Unit unit : Groups.unit){ + TeamData data = unit.team.data(); + data.tree().insert(unit); + data.units.add(unit); + + if(data.unitsByType == null || data.unitsByType.length <= unit.type().id){ + data.unitsByType = new Seq[content.units().size]; + } + + if(data.unitsByType[unit.type().id] == null){ + data.unitsByType[unit.type().id] = new Seq<>(); + } + + data.unitsByType[unit.type().id].add(unit); + + count(unit); + } + } + private void updateEnemies(){ if(state.rules.waves && !active.contains(get(state.rules.waveTeam))){ active.add(get(state.rules.waveTeam)); @@ -145,7 +205,7 @@ public class Teams{ } } - public class TeamData{ + public static class TeamData{ public final Seq cores = new Seq<>(); public final Team team; public final BaseAI ai; @@ -158,11 +218,48 @@ public class Teams{ /** Target items to mine. */ public Seq mineItems = Seq.with(Items.copper, Items.lead, Items.titanium, Items.thorium); + /** Total unit count. */ + public int unitCount; + /** Counts for each type of unit. Do not access directly. */ + @Nullable + public int[] typeCounts; + /** Quadtree for units of this type. Do not access directly. */ + @Nullable + public QuadTree tree; + /** Units of this team. Updated each frame. */ + public Seq units = new Seq<>(); + /** Units of this team by type. Updated each frame. */ + @Nullable + public Seq[] unitsByType; + public TeamData(Team team){ this.team = team; this.ai = new BaseAI(this); } + @Nullable + public Seq unitCache(UnitType type){ + if(unitsByType == null || unitsByType.length <= type.id || unitsByType[type.id] == null) return null; + return unitsByType[type.id]; + } + + public void updateCount(UnitType type, int amount){ + unitCount = Math.max(amount + unitCount, 0); + if(typeCounts == null || typeCounts.length <= type.id){ + typeCounts = new int[Vars.content.units().size]; + } + typeCounts [type.id] = Math.max(amount + typeCounts [type.id], 0); + } + + public QuadTree tree(){ + if(tree == null) tree = new QuadTree<>(Vars.world.getQuadBounds(new Rect())); + return tree; + } + + public int countType(UnitType type){ + return typeCounts == null || typeCounts.length <= type.id ? 0 : typeCounts[type.id]; + } + public boolean active(){ return (team == state.rules.waveTeam && state.rules.waves) || cores.size > 0; } @@ -175,7 +272,8 @@ public class Teams{ return cores.isEmpty(); } - public @Nullable CoreBuild core(){ + @Nullable + public CoreBuild core(){ return cores.isEmpty() ? null : cores.first(); } diff --git a/core/src/mindustry/game/Tutorial.java b/core/src/mindustry/game/Tutorial.java index bfa18e8e50..d3e5bae56c 100644 --- a/core/src/mindustry/game/Tutorial.java +++ b/core/src/mindustry/game/Tutorial.java @@ -1,17 +1,17 @@ package mindustry.game; 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.struct.*; import arc.util.*; import mindustry.content.*; -import mindustry.gen.*; import mindustry.game.EventType.*; +import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; @@ -250,7 +250,7 @@ public class Tutorial{ Building core = state.teams.playerCores().first(); for(int i = 0; i < blocksToBreak; i++){ - if(world.tile(core.tile().x + blockOffset, core.tile().y + i).block() == Blocks.scrapWall){ + if(world.tile(core.tile.x + blockOffset, core.tile.y + i).block() == Blocks.scrapWall){ return false; } } diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 4e91437a76..892b93b731 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -5,7 +5,6 @@ import arc.math.*; import arc.struct.*; import arc.util.*; import mindustry.content.*; -import mindustry.core.GameState.*; import mindustry.game.EventType.*; import mindustry.type.*; import mindustry.world.blocks.storage.*; @@ -14,12 +13,13 @@ import static mindustry.Vars.*; /** Updates and handles state of the campaign universe. Has no relevance to other gamemodes. */ public class Universe{ - private long seconds; + private int seconds; + private int netSeconds; private float secondCounter; private int turn; private Schematic lastLoadout; - private Seq lastLaunchResources = new Seq<>(); + private ItemSeq lastLaunchResources = new ItemSeq(); public Universe(){ load(); @@ -53,25 +53,26 @@ public class Universe{ } } - public void displayTimeEnd(){ - if(!headless){ - state.set(State.paused); - - ui.announce("Next turn incoming."); - } + /** @return sectors attacked on the current planet, minus the ones that are being played on right now. */ + public Seq getAttacked(Planet planet){ + return planet.sectors.select(s -> s.hasWaves() && s.hasBase() && !s.isBeingPlayed() && s.getSecondsPassed() > 1); } /** Update planet rotations, global time and relevant state. */ public void update(){ - secondCounter += Time.delta / 60f; - if(secondCounter >= 1){ - seconds += (int)secondCounter; - secondCounter %= 1f; + //only update time when not in multiplayer + if(!net.client()){ + secondCounter += Time.delta / 60f; - //save every few seconds - if(seconds % 10 == 1){ - save(); + if(secondCounter >= 1){ + seconds += (int)secondCounter; + secondCounter %= 1f; + + //save every few seconds + if(seconds % 10 == 1){ + save(); + } } } @@ -86,14 +87,14 @@ public class Universe{ } } - public Seq getLaunchResources(){ - lastLaunchResources = Core.settings.getJson("launch-resources", Seq.class, ItemStack.class, Seq::new); + public ItemSeq getLaunchResources(){ + lastLaunchResources = Core.settings.getJson("launch-resources-seq", ItemSeq.class, ItemSeq::new); return lastLaunchResources; } - public void updateLaunchResources(Seq stacks){ + public void updateLaunchResources(ItemSeq stacks){ this.lastLaunchResources = stacks; - Core.settings.putJson("launch-resources", ItemStack.class, lastLaunchResources); + Core.settings.putJson("launch-resources-seq", lastLaunchResources); } /** Updates selected loadout for future deployment. */ @@ -139,15 +140,29 @@ public class Universe{ if(!sector.isBeingPlayed()){ sector.setSecondsPassed(sector.getSecondsPassed() + actuallyPassed); + //TODO sector damage disabled for now //check if the sector has been attacked too many times... - if(sector.hasBase() && sector.hasWaves() && sector.getSecondsPassed() * 60f > turnDuration * sectorDestructionTurns){ + /*if(sector.hasBase() && sector.hasWaves() && sector.getSecondsPassed() * 60f > turnDuration * sectorDestructionTurns){ //fire event for losing the sector Events.fire(new SectorLoseEvent(sector)); //if so, just delete the save for now. it's lost. //TODO don't delete it later maybe sector.save.delete(); + //clear recieved + sector.setExtraItems(new ItemSeq()); sector.save = null; + }*/ + } + + //export to another sector + if(sector.save != null && sector.save.meta != null && sector.save.meta.secinfo != null && sector.save.meta.secinfo.destination != null){ + Sector to = sector.save.meta.secinfo.destination; + if(to.save != null){ + ItemSeq items = new ItemSeq(); + //calculated exported items to this sector + sector.save.meta.secinfo.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed))); + to.addItems(items); } } @@ -156,7 +171,6 @@ public class Universe{ } } } - //TODO events Events.fire(new TurnEvent()); @@ -178,25 +192,30 @@ public class Universe{ return count; } - public float secondsMod(float mod, float scale){ - return (seconds / scale) % mod; + public void updateNetSeconds(int value){ + netSeconds = value; } - public long seconds(){ - return seconds; + public float secondsMod(float mod, float scale){ + return (seconds() / scale) % mod; + } + + public int seconds(){ + //use networked seconds when playing as client + return net.client() ? netSeconds : seconds; } public float secondsf(){ - return seconds + secondCounter; + return seconds() + secondCounter; } private void save(){ - Core.settings.put("utime", seconds); + Core.settings.put("utimei", seconds); Core.settings.put("turn", turn); } private void load(){ - seconds = Core.settings.getLong("utime"); + seconds = Core.settings.getInt("utimei"); turn = Core.settings.getInt("turn"); } diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index 5bb0b5fbae..a36230f0aa 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -16,7 +16,7 @@ import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.power.*; -import static arc.Core.camera; +import static arc.Core.*; import static mindustry.Vars.*; public class BlockRenderer implements Disposable{ @@ -35,7 +35,7 @@ public class BlockRenderer implements Disposable{ private FrameBuffer dark = new FrameBuffer(); private Seq outArray2 = new Seq<>(); private Seq shadowEvents = new Seq<>(); - private IntSet processedEntities = new IntSet(); + private IntSet processedEntities = new IntSet(), processedLinks = new IntSet(); private boolean displayStatus = false; public BlockRenderer(){ @@ -180,6 +180,7 @@ public class BlockRenderer implements Disposable{ tileview.clear(); lightview.clear(); processedEntities.clear(); + processedLinks.clear(); int minx = Math.max(avgx - rangex - expandr, 0); int miny = Math.max(avgy - rangey - expandr, 0); @@ -192,12 +193,19 @@ public class BlockRenderer implements Disposable{ Tile tile = world.rawTile(x, y); Block block = tile.block(); //link to center - if(tile.build != null) tile = tile.build.tile(); + if(tile.build != null){ + tile = tile.build.tile; + } - if(block != Blocks.air && block.cacheLayer == CacheLayer.normal && (tile.build == null || !processedEntities.contains(tile.build.id()))){ + if(block != Blocks.air && block.cacheLayer == CacheLayer.normal && (tile.build == null || !processedEntities.contains(tile.build.id))){ if(block.expanded || !expanded){ - tileview.add(tile); - if(tile.build != null) processedEntities.add(tile.build.id()); + if(tile.build == null || processedLinks.add(tile.build.id)){ + tileview.add(tile); + if(tile.build != null){ + processedEntities.add(tile.build.id); + processedLinks.add(tile.build.id); + } + } } //lights are drawn even in the expanded range @@ -207,8 +215,8 @@ public class BlockRenderer implements Disposable{ if(tile.build != null && tile.build.power != null && tile.build.power.links.size > 0){ for(Building other : tile.build.getPowerConnections(outArray2)){ - if(other.block() instanceof PowerNode){ //TODO need a generic way to render connections! - tileview.add(other.tile()); + if(other.block instanceof PowerNode && processedLinks.add(other.id)){ //TODO need a generic way to render connections! + tileview.add(other.tile); } } } diff --git a/core/src/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java index 00bd578dc4..b0273799e4 100644 --- a/core/src/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -4,7 +4,7 @@ import arc.*; import arc.graphics.*; import arc.graphics.gl.*; -import static mindustry.Vars.renderer; +import static mindustry.Vars.*; public enum CacheLayer{ water{ @@ -18,6 +18,17 @@ public enum CacheLayer{ endShader(Shaders.water); } }, + mud{ + @Override + public void begin(){ + beginShader(); + } + + @Override + public void end(){ + endShader(Shaders.mud); + } + }, tar{ @Override public void begin(){ @@ -40,8 +51,19 @@ public enum CacheLayer{ endShader(Shaders.slag); } }, + space{ + @Override + public void begin(){ + beginShader(); + } + + @Override + public void end(){ + endShader(Shaders.space); + } + }, normal(5), - walls; + walls(3); public static final CacheLayer[] all = values(); /** Capacity multiplier. */ diff --git a/core/src/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java index 4b4a00e47d..f1d45bebc3 100644 --- a/core/src/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -84,6 +84,30 @@ public class Drawf{ Draw.color(); } + public static void shadow(TextureRegion region, float x, float y, float rotation){ + Draw.color(Pal.shadow); + Draw.rect(region, x, y, rotation); + Draw.color(); + } + + public static void shadow(TextureRegion region, float x, float y){ + Draw.color(Pal.shadow); + Draw.rect(region, x, y); + Draw.color(); + } + + public static void liquid(TextureRegion region, float x, float y, float alpha, Color color, float rotation){ + Draw.color(color, alpha); + Draw.rect(region, x, y, rotation); + Draw.color(); + } + + public static void liquid(TextureRegion region, float x, float y, float alpha, Color color){ + Draw.color(color, alpha); + Draw.rect(region, x, y); + Draw.color(); + } + public static void dashCircle(float x, float y, float rad, Color color){ Lines.stroke(3f, Pal.gray); Lines.dashCircle(x, y, rad); @@ -150,15 +174,14 @@ public class Drawf{ } public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2, float rotation, float scale){ - Tmp.v1.trns(rotation, 8f * scale * Draw.scl); + float scl = 8f * scale * Draw.scl; + float vx = Mathf.cosDeg(rotation) * scl, vy = Mathf.sinDeg(rotation) * scl; - Draw.rect(edge, x, y, edge.getWidth() * scale * Draw.scl, edge.getHeight() * scale * Draw.scl, rotation + 180); - Draw.rect(edge, x2, y2, edge.getWidth() * scale * Draw.scl, edge.getHeight() * scale * Draw.scl, rotation); + Draw.rect(edge, x, y, edge.width * scale * Draw.scl, edge.height * scale * Draw.scl, rotation + 180); + Draw.rect(edge, x2, y2, edge.width * scale * Draw.scl, edge.height * scale * Draw.scl, rotation); Lines.stroke(12f * scale); - Lines.precise(true); - Lines.line(line, x + Tmp.v1.x, y + Tmp.v1.y, x2 - Tmp.v1.x, y2 - Tmp.v1.y, false, 0f); - Lines.precise(false); + Lines.line(line, x + vx, y + vy, x2 - vx, y2 - vy, false); Lines.stroke(1f); light(team, x, y, x2, y2); @@ -173,6 +196,20 @@ public class Drawf{ construct(t, content.icon(Cicon.full), rotation, progress, speed, time); } + public static void construct(float x, float y, TextureRegion region, float rotation, float progress, float speed, float time){ + Shaders.build.region = region; + Shaders.build.progress = progress; + Shaders.build.color.set(Pal.accent); + Shaders.build.color.a = speed; + Shaders.build.time = -time / 20f; + + Draw.shader(Shaders.build); + Draw.rect(region, x, y, rotation); + Draw.shader(); + + Draw.reset(); + } + public static void construct(Building t, TextureRegion region, float rotation, float progress, float speed, float time){ Shaders.build.region = region; Shaders.build.progress = progress; @@ -187,7 +224,7 @@ public class Drawf{ Draw.color(Pal.accent); Draw.alpha(speed); - Lines.lineAngleCenter(t.x + Mathf.sin(time, 20f, Vars.tilesize / 2f * t.block().size - 2f), t.y, 90, t.block().size * Vars.tilesize - 4f); + Lines.lineAngleCenter(t.x + Mathf.sin(time, 20f, Vars.tilesize / 2f * t.block.size - 2f), t.y, 90, t.block.size * Vars.tilesize - 4f); Draw.reset(); } diff --git a/core/src/mindustry/graphics/FloorRenderer.java b/core/src/mindustry/graphics/FloorRenderer.java index 43c45ad221..a3b7ff21c8 100644 --- a/core/src/mindustry/graphics/FloorRenderer.java +++ b/core/src/mindustry/graphics/FloorRenderer.java @@ -17,10 +17,9 @@ import java.util.*; import static mindustry.Vars.*; public class FloorRenderer implements Disposable{ - //TODO find out number with best performance private static final int chunksize = mobile ? 16 : 32; - private Chunk[][] cache; + private int[][][] cache; private MultiCacheBatch cbatch; private IntSet drawnLayerSet = new IntSet(); private IntSet recacheSet = new IntSet(); @@ -63,11 +62,11 @@ public class FloorRenderer implements Disposable{ if(!Structs.inBounds(worldx, worldy, cache)) continue; - Chunk chunk = cache[worldx][worldy]; + int[] chunk = cache[worldx][worldy]; //loop through all layers, and add layer index if it exists for(int i = 0; i < layers; i++){ - if(chunk.caches[i] != -1 && i != CacheLayer.walls.ordinal()){ + if(chunk[i] != -1 && i != CacheLayer.walls.ordinal()){ drawnLayerSet.add(i); } } @@ -154,9 +153,9 @@ public class FloorRenderer implements Disposable{ continue; } - Chunk chunk = cache[worldx][worldy]; - if(chunk.caches[layer.ordinal()] == -1) continue; - cbatch.drawCache(chunk.caches[layer.ordinal()]); + int[] chunk = cache[worldx][worldy]; + if(chunk[layer.ordinal()] == -1) continue; + cbatch.drawCache(chunk[layer.ordinal()]); } } @@ -165,7 +164,7 @@ public class FloorRenderer implements Disposable{ private void cacheChunk(int cx, int cy){ used.clear(); - Chunk chunk = cache[cx][cy]; + int[] chunk = cache[cx][cy]; for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize && tilex < world.width(); tilex++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize && tiley < world.height(); tiley++){ @@ -184,15 +183,15 @@ public class FloorRenderer implements Disposable{ } } - private void cacheChunkLayer(int cx, int cy, Chunk chunk, CacheLayer layer){ + private void cacheChunkLayer(int cx, int cy, int[] chunk, CacheLayer layer){ Batch current = Core.batch; Core.batch = cbatch; //begin a new cache - if(chunk.caches[layer.ordinal()] == -1){ + if(chunk[layer.ordinal()] == -1){ cbatch.beginCache(); }else{ - cbatch.beginCache(chunk.caches[layer.ordinal()]); + cbatch.beginCache(chunk[layer.ordinal()]); } for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ @@ -210,15 +209,15 @@ public class FloorRenderer implements Disposable{ tile.block().drawBase(tile); }else if(floor.cacheLayer == layer && (world.isAccessible(tile.x, tile.y) || tile.block().cacheLayer != CacheLayer.walls || !tile.block().fillsTile)){ floor.drawBase(tile); - }else if(floor.cacheLayer.ordinal() < layer.ordinal() && layer != CacheLayer.walls){ - floor.drawNonLayer(tile); + }else if(floor.cacheLayer != layer && layer != CacheLayer.walls){ + floor.drawNonLayer(tile, layer); } } } Core.batch = current; cbatch.reserve(layer.capacity * chunksize * chunksize); - chunk.caches[layer.ordinal()] = cbatch.endCache(); + chunk[layer.ordinal()] = cbatch.endCache(); } public void clearTiles(){ @@ -227,15 +226,14 @@ public class FloorRenderer implements Disposable{ recacheSet.clear(); int chunksx = Mathf.ceil((float)(world.width()) / chunksize), chunksy = Mathf.ceil((float)(world.height()) / chunksize); - cache = new Chunk[chunksx][chunksy]; - cbatch = new MultiCacheBatch(chunksize * chunksize * 5); + cache = new int[chunksx][chunksy][CacheLayer.all.length]; + cbatch = new MultiCacheBatch(chunksize * chunksize * 9); Time.mark(); for(int x = 0; x < chunksx; x++){ for(int y = 0; y < chunksy; y++){ - cache[x][y] = new Chunk(); - Arrays.fill(cache[x][y].caches, -1); + Arrays.fill(cache[x][y], -1); cacheChunk(x, y); } @@ -251,13 +249,4 @@ public class FloorRenderer implements Disposable{ cbatch = null; } } - - private static class Chunk{ - /** Maps cache layer ID to cache ID in the batch. - * -1 means that this cache is unoccupied. */ - int[] caches = new int[CacheLayer.all.length]; - - Chunk(){ - } - } } diff --git a/core/src/mindustry/graphics/IndexedRenderer.java b/core/src/mindustry/graphics/IndexedRenderer.java index 83067c1f96..46b9093a14 100644 --- a/core/src/mindustry/graphics/IndexedRenderer.java +++ b/core/src/mindustry/graphics/IndexedRenderer.java @@ -7,11 +7,10 @@ import arc.graphics.gl.*; import arc.math.*; import arc.util.*; -//TODO this class is a trainwreck, remove it public class IndexedRenderer implements Disposable{ private static final int vsize = 5; - private Shader program = new Shader( + private final Shader program = new Shader( "attribute vec4 a_position;\n" + "attribute vec4 a_color;\n" + "attribute vec2 a_texCoord0;\n" + @@ -68,10 +67,10 @@ public class IndexedRenderer implements Disposable{ public void draw(int index, TextureRegion region, float x, float y, float w, float h){ float fx2 = x + w; float fy2 = y + h; - float u = region.getU(); - float v = region.getV2(); - float u2 = region.getU2(); - float v2 = region.getV(); + float u = region.u; + float v = region.v2; + float u2 = region.u2; + float v2 = region.v; float[] vertices = tmpVerts; float color = this.color; @@ -96,32 +95,32 @@ public class IndexedRenderer implements Disposable{ vertices[idx++] = v2; //tri2 - vertices[idx++] = x; - vertices[idx++] = y; - vertices[idx++] = color; - vertices[idx++] = u; - vertices[idx++] = v; - - vertices[idx++] = fx2; - vertices[idx++] = y; - vertices[idx++] = color; - vertices[idx++] = u2; - vertices[idx++] = v; - vertices[idx++] = fx2; vertices[idx++] = fy2; vertices[idx++] = color; vertices[idx++] = u2; vertices[idx++] = v2; + vertices[idx++] = fx2; + vertices[idx++] = y; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v; + + vertices[idx++] = x; + vertices[idx++] = y; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v; + mesh.updateVertices(index * vsize * 6, vertices); } public void draw(int index, TextureRegion region, float x, float y, float w, float h, float rotation){ - float u = region.getU(); - float v = region.getV2(); - float u2 = region.getU2(); - float v2 = region.getV(); + float u = region.u; + float v = region.v2; + float u2 = region.u2; + float v2 = region.v; float originX = w / 2, originY = h / 2; @@ -155,6 +154,19 @@ public class IndexedRenderer implements Disposable{ vertices[idx++] = u; vertices[idx++] = v; + vertices[idx++] = x2; + vertices[idx++] = y2; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v2; + + vertices[idx++] = x3; + vertices[idx++] = y3; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v2; + + //tri2 vertices[idx++] = x3; vertices[idx++] = y3; vertices[idx++] = color; @@ -164,28 +176,15 @@ public class IndexedRenderer implements Disposable{ vertices[idx++] = x4; vertices[idx++] = y4; vertices[idx++] = color; - vertices[idx++] = u; - vertices[idx++] = v2; + vertices[idx++] = u2; + vertices[idx++] = v; - //tri2 vertices[idx++] = x1; vertices[idx++] = y1; vertices[idx++] = color; vertices[idx++] = u; vertices[idx++] = v; - vertices[idx++] = x2; - vertices[idx++] = y2; - vertices[idx++] = color; - vertices[idx++] = u2; - vertices[idx++] = v; - - vertices[idx++] = x3; - vertices[idx++] = y3; - vertices[idx++] = color; - vertices[idx++] = u2; - vertices[idx++] = v2; - mesh.updateVertices(index * vsize * 6, vertices); } diff --git a/core/src/mindustry/graphics/LightRenderer.java b/core/src/mindustry/graphics/LightRenderer.java index 63cd3f2783..10ffa727b6 100644 --- a/core/src/mindustry/graphics/LightRenderer.java +++ b/core/src/mindustry/graphics/LightRenderer.java @@ -10,7 +10,7 @@ import arc.struct.*; import arc.util.*; import mindustry.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; /** Renders overlay lights. Client only. */ public class LightRenderer{ @@ -58,10 +58,10 @@ public class LightRenderer{ TextureRegion ledge = Core.atlas.find("circle-end"), lmid = Core.atlas.find("circle-mid"); float color = Draw.getColor().toFloatBits(); - float u = lmid.getU(); - float v = lmid.getV2(); - float u2 = lmid.getU2(); - float v2 = lmid.getV(); + float u = lmid.u; + float v = lmid.v2; + float u2 = lmid.u2; + float v2 = lmid.v; Vec2 v1 = Tmp.v1.trnsExact(rot + 90f, stroke); @@ -98,15 +98,15 @@ public class LightRenderer{ vertices[22] = v; vertices[23] = 0; - Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); + Draw.vert(ledge.texture, vertices, 0, vertices.length); Vec2 v3 = Tmp.v2.trnsExact(rot, stroke); - u = ledge.getU(); - v = ledge.getV2(); - u2 = ledge.getU2(); - v2 = ledge.getV(); + u = ledge.u; + v = ledge.v2; + u2 = ledge.u2; + v2 = ledge.v; vertices[0] = lx4; vertices[1] = ly4; @@ -136,7 +136,7 @@ public class LightRenderer{ vertices[22] = v; vertices[23] = 0; - Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); + Draw.vert(ledge.texture, vertices, 0, vertices.length); vertices[0] = lx2; vertices[1] = ly2; @@ -166,7 +166,7 @@ public class LightRenderer{ vertices[22] = v; vertices[23] = 0; - Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); + Draw.vert(ledge.texture, vertices, 0, vertices.length); }); } diff --git a/core/src/mindustry/graphics/LoadRenderer.java b/core/src/mindustry/graphics/LoadRenderer.java index 295205a13d..35674837d6 100644 --- a/core/src/mindustry/graphics/LoadRenderer.java +++ b/core/src/mindustry/graphics/LoadRenderer.java @@ -98,7 +98,6 @@ public class LoadRenderer implements Disposable{ float w = Core.graphics.getWidth(), h = Core.graphics.getHeight(), s = Scl.scl(); //s = 2f; - Lines.precise(true); Draw.proj().setOrtho(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight()); @@ -467,7 +466,6 @@ public class LoadRenderer implements Disposable{ font.draw(red + "[[[[ " + key + " ]]\n"+orange+"<" + Version.modifier + " " + (Version.build == 0 ? " [init]" : Version.build == -1 ? " custom" : " " + Version.build) + ">", w/2f, h/2f + 110*s, Align.center); } - Lines.precise(false); Draw.flush(); fx.end(); diff --git a/core/src/mindustry/graphics/MenuRenderer.java b/core/src/mindustry/graphics/MenuRenderer.java index bc72220c77..2899efcdba 100644 --- a/core/src/mindustry/graphics/MenuRenderer.java +++ b/core/src/mindustry/graphics/MenuRenderer.java @@ -50,21 +50,21 @@ public class MenuRenderer implements Disposable{ Simplex s3 = new Simplex(offset + 2); RidgedPerlin rid = new RidgedPerlin(1 + offset, 1); Block[] selected = Structs.select( - new Block[]{Blocks.sand, Blocks.sandRocks}, - new Block[]{Blocks.shale, Blocks.shaleRocks}, - new Block[]{Blocks.ice, Blocks.icerocks}, - new Block[]{Blocks.sand, Blocks.sandRocks}, - new Block[]{Blocks.shale, Blocks.shaleRocks}, - new Block[]{Blocks.ice, Blocks.icerocks}, + new Block[]{Blocks.sand, Blocks.sandWall}, + new Block[]{Blocks.shale, Blocks.shaleWall}, + new Block[]{Blocks.ice, Blocks.iceWall}, + new Block[]{Blocks.sand, Blocks.sandWall}, + new Block[]{Blocks.shale, Blocks.shaleWall}, + new Block[]{Blocks.ice, Blocks.iceWall}, new Block[]{Blocks.moss, Blocks.sporePine} ); Block[] selected2 = Structs.select( - new Block[]{Blocks.ignarock, Blocks.duneRocks}, - new Block[]{Blocks.ignarock, Blocks.duneRocks}, - new Block[]{Blocks.stone, Blocks.rocks}, - new Block[]{Blocks.stone, Blocks.rocks}, - new Block[]{Blocks.moss, Blocks.sporerocks}, - new Block[]{Blocks.salt, Blocks.saltRocks} + new Block[]{Blocks.basalt, Blocks.duneWall}, + new Block[]{Blocks.basalt, Blocks.duneWall}, + new Block[]{Blocks.stone, Blocks.stoneWall}, + new Block[]{Blocks.stone, Blocks.stoneWall}, + new Block[]{Blocks.moss, Blocks.sporeWall}, + new Block[]{Blocks.salt, Blocks.saltWall} ); Block ore1 = ores.random(); @@ -113,7 +113,7 @@ public class MenuRenderer implements Disposable{ if(heat > base){ ore = Blocks.air; wall = Blocks.air; - floor = Blocks.ignarock; + floor = Blocks.basalt; if(heat > base + 0.1){ floor = Blocks.hotrock; @@ -146,7 +146,7 @@ public class MenuRenderer implements Disposable{ floor = Mathf.chance(0.2) ? Blocks.sporeMoss : Blocks.moss; if(wall != Blocks.air){ - wall = Blocks.sporerocks; + wall = Blocks.sporeWall; } } } @@ -237,13 +237,11 @@ public class MenuRenderer implements Disposable{ } private void drawFlyers(){ - //TODO fix - if(true) return; Draw.color(0f, 0f, 0f, 0.4f); TextureRegion icon = flyerType.icon(Cicon.full); - float size = Math.max(icon.getWidth(), icon.getHeight()) * Draw.scl * 1.6f; + float size = Math.max(icon.width, icon.height) * Draw.scl * 1.6f; flyers((x, y) -> { Draw.rect(flyerType.region, x - 12f, y - 13f, flyerRot - 90); diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index 3b3482e410..cdb84e9044 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -9,7 +9,6 @@ import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.pooling.*; import mindustry.entities.*; import mindustry.game.EventType.*; @@ -122,8 +121,8 @@ public class MinimapRenderer implements Disposable{ float dy = (Core.camera.position.y / tilesize); dx = Mathf.clamp(dx, sz, world.width() - sz); dy = Mathf.clamp(dy, sz, world.height() - sz); - float invTexWidth = 1f / texture.getWidth(); - float invTexHeight = 1f / texture.getHeight(); + float invTexWidth = 1f / texture.width; + float invTexHeight = 1f / texture.height; float x = dx - sz, y = world.height() - dy - sz, width = sz * 2, height = sz * 2; region.set(x * invTexWidth, y * invTexHeight, (x + width) * invTexWidth, (y + height) * invTexHeight); return region; diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index f3724d39dc..19569ed1a3 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -7,6 +7,7 @@ import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.*; +import mindustry.ai.types.*; import mindustry.gen.*; import mindustry.input.*; import mindustry.ui.*; @@ -82,7 +83,7 @@ public class OverlayRenderer{ if(select instanceof BlockUnitc){ //special selection for block "units" - Fill.square(select.x, select.y, ((BlockUnitc)select).tile().block().size * tilesize/2f); + Fill.square(select.x, select.y, ((BlockUnitc)select).tile().block.size * tilesize/2f); }else{ Draw.rect(select.type().icon(Cicon.full), select.x(), select.y(), select.rotation() - 90); } @@ -140,10 +141,10 @@ public class OverlayRenderer{ build.drawDisabled(); } - if(Core.input.keyDown(Binding.rotateplaced) && build.block().rotate && build.interactable(player.team())){ - control.input.drawArrow(build.block(), build.tileX(), build.tileY(), build.rotation, true); + if(Core.input.keyDown(Binding.rotateplaced) && build.block.rotate && build.block.quickRotate && build.interactable(player.team())){ + control.input.drawArrow(build.block, build.tileX(), build.tileY(), build.rotation, true); Draw.color(Pal.accent, 0.3f + Mathf.absin(4f, 0.2f)); - Fill.square(build.x, build.y, build.block().size * tilesize/2f); + Fill.square(build.x, build.y, build.block.size * tilesize/2f); Draw.color(); } } @@ -151,6 +152,13 @@ public class OverlayRenderer{ input.drawOverSelect(); + if(ui.hudfrag.blockfrag.hover() instanceof Unit unit && unit.controller() instanceof LogicAI ai && ai.controller instanceof Building build){ + Drawf.square(build.x, build.y, build.block.size * tilesize/2f + 2f); + if(!unit.within(build, unit.hitSize * 2f)){ + Drawf.arrow(unit.x, unit.y, build.x, build.y, unit.hitSize *2f, 4f); + } + } + //draw selection overlay when dropping item if(input.isDroppingItem()){ Vec2 v = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); @@ -161,11 +169,11 @@ public class OverlayRenderer{ Draw.reset(); Building tile = world.buildWorld(v.x, v.y); - if(tile != null && tile.interactable(player.team()) && tile.acceptStack(player.unit().item(), player.unit().stack.amount, player.unit()) > 0){ + if(tile != null && tile.interactable(player.team()) && tile.acceptStack(player.unit().item(), player.unit().stack.amount, player.unit()) > 0 && player.within(tile, itemTransferRange)){ Lines.stroke(3f, Pal.gray); - Lines.square(tile.x, tile.y, tile.block().size * tilesize / 2f + 3 + Mathf.absin(Time.time(), 5f, 1f)); + Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 3 + Mathf.absin(Time.time(), 5f, 1f)); Lines.stroke(1f, Pal.place); - Lines.square(tile.x, tile.y, tile.block().size * tilesize / 2f + 2 + Mathf.absin(Time.time(), 5f, 1f)); + Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 2 + Mathf.absin(Time.time(), 5f, 1f)); Draw.reset(); } diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index 052cd14326..753bbbbbed 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -1,9 +1,9 @@ package mindustry.graphics; -import arc.graphics.Color; +import arc.graphics.*; public class Pal{ - public static final Color + public static Color items = Color.valueOf("2ea756"), command = Color.valueOf("eab678"), @@ -46,6 +46,8 @@ public class Pal{ lightishGray = Color.valueOf("a2a2a2"), darkishGray = new Color(0.3f, 0.3f, 0.3f, 1f), darkerGray = new Color(0.2f, 0.2f, 0.2f, 1f), + darkestGray = new Color(0.1f, 0.1f, 0.1f, 1f), + shadow = new Color(0, 0, 0, 0.22f), ammo = Color.valueOf("ff8947"), rubble = Color.valueOf("1c1817"), diff --git a/core/src/mindustry/graphics/Pixelator.java b/core/src/mindustry/graphics/Pixelator.java index 4d77af56a7..5bce6721e3 100644 --- a/core/src/mindustry/graphics/Pixelator.java +++ b/core/src/mindustry/graphics/Pixelator.java @@ -8,7 +8,7 @@ import arc.graphics.gl.*; import arc.util.*; import static arc.Core.*; -import static mindustry.Vars.renderer; +import static mindustry.Vars.*; public class Pixelator implements Disposable{ private FrameBuffer buffer = new FrameBuffer(); diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index 884f70b84e..cefb7b1bab 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -8,7 +8,6 @@ import arc.graphics.g3d.*; import arc.graphics.gl.*; import arc.math.geom.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.type.*; @@ -20,7 +19,7 @@ public class Shaders{ public static UnitBuild build; public static DarknessShader darkness; public static LightShader light; - public static SurfaceShader water, tar, slag; + public static SurfaceShader water, mud, tar, slag, space; public static PlanetShader planet; public static PlanetGridShader planetGrid; public static AtmosphereShader atmosphere; @@ -42,8 +41,10 @@ public class Shaders{ darkness = new DarknessShader(); light = new LightShader(); water = new SurfaceShader("water"); + mud = new SurfaceShader("mud"); tar = new SurfaceShader("tar"); slag = new SurfaceShader("slag"); + space = new SpaceShader("space"); planet = new PlanetShader(); planetGrid = new PlanetGridShader(); atmosphere = new AtmosphereShader(); @@ -152,9 +153,9 @@ public class Shaders{ setUniformf("u_time", time); setUniformf("u_color", color); setUniformf("u_progress", progress); - setUniformf("u_uv", region.getU(), region.getV()); - setUniformf("u_uv2", region.getU2(), region.getV2()); - setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); + setUniformf("u_uv", region.u, region.v); + setUniformf("u_uv2", region.u2, region.v2); + setUniformf("u_texsize", region.texture.width, region.texture.height); } } @@ -171,10 +172,10 @@ public class Shaders{ public void apply(){ setUniformf("u_progress", progress); setUniformf("u_color", color); - setUniformf("u_uv", region.getU(), region.getV()); - setUniformf("u_uv2", region.getU2(), region.getV2()); + setUniformf("u_uv", region.u, region.v); + setUniformf("u_uv2", region.u2, region.v2); setUniformf("u_time", Time.time()); - setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); + setUniformf("u_texsize", region.texture.width, region.texture.height); } } @@ -196,6 +197,34 @@ public class Shaders{ } } + //seed: 8kmfuix03fw + public static class SpaceShader extends SurfaceShader{ + Texture texture; + + public SpaceShader(String frag){ + super(frag); + + Core.assets.load("sprites/space.png", Texture.class).loaded = t -> { + texture = (Texture)t; + texture.setFilter(TextureFilter.linear); + texture.setWrap(TextureWrap.mirroredRepeat); + }; + } + + @Override + public void apply(){ + setUniformf("u_campos", Core.camera.position.x, Core.camera.position.y); + setUniformf("u_ccampos", Core.camera.position); + setUniformf("u_resolution", Core.graphics.getWidth(), Core.graphics.getHeight()); + setUniformf("u_time", Time.time()); + + texture.bind(1); + renderer.effectBuffer.getTexture().bind(0); + + setUniformi("u_stars", 1); + } + } + public static class SurfaceShader extends LoadShader{ public SurfaceShader(String frag){ @@ -225,7 +254,7 @@ public class Shaders{ public static class LoadShader extends Shader{ public LoadShader(String frag, String vert){ - super(Core.files.internal("shaders/" + vert + ".vert").readString(), Core.files.internal("shaders/" + frag + ".frag").readString()); + super(Core.files.internal("shaders/" + vert + ".vert"), Core.files.internal("shaders/" + frag + ".frag")); } } } diff --git a/core/src/mindustry/graphics/g3d/MeshBuilder.java b/core/src/mindustry/graphics/g3d/MeshBuilder.java index 2342c469c6..dc26cec9f5 100644 --- a/core/src/mindustry/graphics/g3d/MeshBuilder.java +++ b/core/src/mindustry/graphics/g3d/MeshBuilder.java @@ -4,11 +4,10 @@ import arc.graphics.*; import arc.graphics.VertexAttributes.*; import arc.graphics.gl.*; import arc.math.geom.*; -import arc.util.*; import mindustry.graphics.g3d.PlanetGrid.*; public class MeshBuilder{ - private static final Vec3 v1 = new Vec3(), v2 = new Vec3(), v3 = new Vec3(); + private static final Vec3 v1 = new Vec3(), v2 = new Vec3(), v3 = new Vec3(), v4 = new Vec3(); private static final float[] floats = new float[3 + 3 + 1]; private static Mesh mesh; @@ -111,7 +110,7 @@ public class MeshBuilder{ } private static Vec3 normal(Vec3 v1, Vec3 v2, Vec3 v3){ - return Tmp.v32.set(v2).sub(v1).crs(v3.x - v1.x, v3.y - v1.y, v3.z - v1.z).nor(); + return v4.set(v2).sub(v1).crs(v3.x - v1.x, v3.y - v1.y, v3.z - v1.z).nor(); } private static void verts(Vec3 a, Vec3 b, Vec3 c, Vec3 normal, Color color){ diff --git a/core/src/mindustry/graphics/g3d/PlanetRenderer.java b/core/src/mindustry/graphics/g3d/PlanetRenderer.java index e0e76c0cee..e3eb74a7b5 100644 --- a/core/src/mindustry/graphics/g3d/PlanetRenderer.java +++ b/core/src/mindustry/graphics/g3d/PlanetRenderer.java @@ -23,10 +23,6 @@ public class PlanetRenderer implements Disposable{ shadowColor = new Color(0, 0, 0, 0.7f); private static final Seq points = new Seq<>(); - private static final PlanetInterfaceRenderer emptyRenderer = new PlanetInterfaceRenderer(){ - @Override public void renderSectors(Planet planet){} - @Override public void renderProjections(){} - }; /** Camera direction relative to the planet. Length is determined by zoom. */ public final Vec3 camPos = new Vec3(); diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index f28902819c..7099f254dd 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -10,7 +10,6 @@ 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.entities.units.*; @@ -47,8 +46,9 @@ public class DesktopInput extends InputHandler{ @Override public void buildUI(Group group){ + group.fill(t -> { - t.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown() && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty())); + t.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty())); t.bottom(); t.table(Styles.black6, b -> { b.defaults().left(); @@ -75,13 +75,13 @@ public class DesktopInput extends InputHandler{ }); group.fill(t -> { - t.visible(() -> Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty()); + t.visible(() -> lastSchematic != null && !selectRequests.isEmpty()); t.bottom(); t.table(Styles.black6, b -> { b.defaults().left(); - b.label( () -> Core.bundle.format("schematic.flip", - Core.keybinds.get(Binding.schematic_flip_x).key.toString(), - Core.keybinds.get(Binding.schematic_flip_y).key.toString())).style(Styles.outlineLabel); + b.label(() -> Core.bundle.format("schematic.flip", + Core.keybinds.get(Binding.schematic_flip_x).key.toString(), + Core.keybinds.get(Binding.schematic_flip_y).key.toString())).style(Styles.outlineLabel).visible(() -> Core.settings.getBool("hints")); b.row(); b.table(a -> { a.button("@schematic.add", Icon.save, this::showSchematicSave).colspan(2).size(250f, 50f).disabled(f -> lastSchematic == null || lastSchematic.file != null); @@ -176,12 +176,12 @@ public class DesktopInput extends InputHandler{ public void update(){ super.update(); - if(net.active() && Core.input.keyTap(Binding.player_list) && (scene.getKeyboardFocus() == null || scene.getKeyboardFocus().isDescendantOf(ui.listfrag.content))){ + if(net.active() && Core.input.keyTap(Binding.player_list) && (scene.getKeyboardFocus() == null || scene.getKeyboardFocus().isDescendantOf(ui.listfrag.content) || scene.getKeyboardFocus().isDescendantOf(ui.minimapfrag.elem))){ ui.listfrag.toggle(); } boolean panCam = false; - float camSpeed = !Core.input.keyDown(Binding.boost) ? panSpeed : panBoostSpeed; + float camSpeed = (!Core.input.keyDown(Binding.boost) ? panSpeed : panBoostSpeed) * Time.delta; if(input.keyDown(Binding.pan)){ panCam = true; @@ -199,7 +199,7 @@ public class DesktopInput extends InputHandler{ } panning = false; - 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)); + Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(camSpeed)); }else if(!player.dead() && !panning){ Core.camera.position.lerpDelta(player, Core.settings.getBool("smoothcamera") ? 0.08f : 1f); } @@ -224,7 +224,7 @@ public class DesktopInput extends InputHandler{ if(!player.dead() && !state.isPaused() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ updateMovement(player.unit()); - if(Core.input.keyDown(Binding.respawn) && !player.unit().spawnedByCore()){ + if(Core.input.keyDown(Binding.respawn) && !player.unit().spawnedByCore() && !scene.hasField()){ Call.unitClear(player); controlledType = null; } @@ -306,7 +306,7 @@ public class DesktopInput extends InputHandler{ cursorType = ui.unloadCursor; } - if(cursor.build != null && cursor.interactable(player.team()) && !isPlacing() && Math.abs(Core.input.axisTap(Binding.rotate)) > 0 && Core.input.keyDown(Binding.rotateplaced) && cursor.block().rotate){ + if(cursor.build != null && cursor.interactable(player.team()) && !isPlacing() && Math.abs(Core.input.axisTap(Binding.rotate)) > 0 && Core.input.keyDown(Binding.rotateplaced) && cursor.block().rotate && cursor.block().quickRotate){ Call.rotateBlock(player, cursor.build, Core.input.axisTap(Binding.rotate) > 0); } } @@ -353,9 +353,8 @@ public class DesktopInput extends InputHandler{ }).visible(() -> state.isCampaign()).tooltip("@planetmap"); table.button(Icon.up, Styles.clearPartiali, () -> { - ui.planet.show(state.getSector(), player.team().core()); - }).visible(() -> state.isCampaign()) - .disabled(b -> player.team().core() == null || !player.team().core().items.has(player.team().core().block.requirements)).tooltip("@launchcore"); + ui.planet.showLaunch(state.getSector(), player.team().core()); + }).visible(() -> state.isCampaign()).tooltip("@launchcore").disabled(b -> player.team().core() == null); } void pollInput(){ @@ -459,6 +458,10 @@ public class DesktopInput extends InputHandler{ } if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){ + if(selected != null){ + Call.tileTap(player, selected); + } + BuildPlan req = getRequest(cursorX, cursorY); if(Core.input.keyDown(Binding.break_block)){ @@ -596,19 +599,19 @@ public class DesktopInput extends InputHandler{ } protected void updateMovement(Unit unit){ - boolean omni = !(unit instanceof WaterMovec); + boolean omni = unit.type().omniMovement; boolean ground = unit.isGrounded(); float strafePenalty = ground ? 1f : Mathf.lerp(1f, unit.type().strafePenalty, Angles.angleDist(unit.vel().angle(), unit.rotation()) / 180f); float baseSpeed = unit.type().speed; //limit speed to minimum formation speed to preserve formation - if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){ + if(unit.isCommanding()){ //add a tiny multiplier to let units catch up just in case - baseSpeed = ((Commanderc)unit).minFormationSpeed() * 0.95f; + baseSpeed = unit.minFormationSpeed * 0.95f; } - float speed = baseSpeed * Mathf.lerp(1f, unit.type().canBoost ? unit.type().boostMultiplier : 1f, unit.elevation) * strafePenalty; + float speed = baseSpeed * Mathf.lerp(1f, unit.isCommanding() ? 1f : unit.type().canBoost ? unit.type().boostMultiplier : 1f, unit.elevation) * strafePenalty; float xa = Core.input.axis(Binding.move_x); float ya = Core.input.axis(Binding.move_y); boolean boosted = (unit instanceof Mechc && unit.isFlying()); @@ -658,10 +661,8 @@ public class DesktopInput extends InputHandler{ } //update commander inut - if(unit instanceof Commanderc){ - if(Core.input.keyTap(Binding.command)){ - Call.unitCommand(player); - } + if(Core.input.keyTap(Binding.command)){ + Call.unitCommand(player); } } } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 34e4552958..eebe40e15b 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -12,7 +12,6 @@ import arc.scene.*; import arc.scene.event.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.ai.formations.patterns.*; import mindustry.annotations.Annotations.*; @@ -59,7 +58,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public int rotation; public boolean droppingItem; public Group uiGroup; - public boolean isBuilding = true, buildWasAutoPaused = false; + public boolean isBuilding = true, buildWasAutoPaused = false, wasShooting = false; public @Nullable UnitType controlledType; public @Nullable Schematic lastSchematic; @@ -78,6 +77,19 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ createItemTransfer(item, 1, x, y, to, null); } + @Remote(called = Loc.server, unreliable = true) + public static void takeItems(Building build, Item item, int amount, Unit to){ + if(to == null || build == null) return; + + int removed = build.removeStack(item, Math.min(to.maxAccepted(item), amount)); + if(removed == 0) return; + + to.addItem(item, removed); + for(int j = 0; j < Mathf.clamp(removed / 3, 1, 8); j++){ + Time.run(j * 3f, () -> Call.transferItemEffect(item, build.x, build.y, to)); + } + } + @Remote(called = Loc.server, unreliable = true) public static void transferItemToUnit(Item item, float x, float y, Itemsc to){ if(to == null) return; @@ -93,6 +105,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ build.items.add(item, amount); } + @Remote(called = Loc.server, unreliable = true) + public static void transferItemTo(Unit unit, Item item, int amount, float x, float y, Building build){ + if(build == null || build.items == null) return; + unit.stack.amount = Math.max(unit.stack.amount - amount, 0); + for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){ + Time.run(i * 3, () -> createItemTransfer(item, amount, x, y, build, () -> {})); + } + build.handleStack(item, amount, unit); + } + public static void createItemTransfer(Item item, int amount, float x, float y, Position to, Runnable done){ Fx.itemTransfer.at(x, y, amount, item.color, to); if(done != null){ @@ -100,37 +122,88 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } + @Remote(called = Loc.server, targets = Loc.both, forward = true) + public static void requestItem(Player player, Building tile, Item item, int amount){ + if(player == null || tile == null || !tile.interactable(player.team()) || !player.within(tile, buildingRange) || player.dead()) return; + amount = Math.min(player.unit().maxAccepted(item), amount); + int fa = amount; + + if(amount == 0) return; + + if(net.server() && (!Units.canInteract(player, tile) || + !netServer.admins.allowAction(player, ActionType.withdrawItem, tile.tile(), action -> { + action.item = item; + action.itemAmount = fa; + }))) throw new ValidateException(player, "Player cannot request items."); + + int removed = tile.removeStack(item, amount); + + player.unit().addItem(item, removed); + Events.fire(new WithdrawEvent(tile, player, item, amount)); + for(int j = 0; j < Mathf.clamp(removed / 3, 1, 8); j++){ + Time.run(j * 3f, () -> Call.transferItemEffect(item, tile.x, tile.y, player.unit())); + } + } + @Remote(variants = Variant.one) public static void removeQueueBlock(int x, int y, boolean breaking){ player.builder().removeBuild(x, y, breaking); } - @Remote(targets = Loc.both, called = Loc.server, forward = true) - public static void pickupUnitPayload(Player player, Unit target){ + @Remote(targets = Loc.both, called = Loc.server) + public static void requestUnitPayload(Player player, Unit target){ if(player == null) return; Unit unit = player.unit(); Payloadc pay = (Payloadc)unit; if(target.isAI() && target.isGrounded() && pay.canPickup(target) - && target.within(unit, unit.type().hitsize * 1.5f + target.type().hitsize)){ - pay.pickup(target); + && target.within(unit, unit.type().hitSize * 2f + target.type().hitSize * 2f)){ + Call.pickedUnitPayload(unit, target); } } - @Remote(targets = Loc.both, called = Loc.server, forward = true) - public static void pickupBlockPayload(Player player, Building tile){ + @Remote(targets = Loc.both, called = Loc.server) + public static void requestBuildPayload(Player player, Building tile){ if(player == null) return; Unit unit = player.unit(); Payloadc pay = (Payloadc)unit; - if(tile != null && tile.team == unit.team && pay.canPickup(tile) - && unit.within(tile, tilesize * tile.block.size * 1.2f)){ + if(tile != null && tile.team == unit.team + && unit.within(tile, tilesize * tile.block.size * 1.2f + tilesize * 5f)){ //pick up block directly - if(tile.block().buildVisibility != BuildVisibility.hidden && tile.canPickup()){ - pay.pickup(tile); + if(tile.block.buildVisibility != BuildVisibility.hidden && tile.canPickup() && pay.canPickup(tile)){ + Call.pickedBuildPayload(unit, tile, true); }else{ //pick up block payload + Payload current = tile.getPayload(); + if(current != null && pay.canPickupPayload(current)){ + Call.pickedBuildPayload(unit, tile, false); + } + } + } + } + + @Remote(targets = Loc.server, called = Loc.server) + public static void pickedUnitPayload(Unit unit, Unit target){ + if(target != null && unit instanceof Payloadc pay){ + pay.pickup(target); + }else if(target != null){ + target.remove(); + } + } + + @Remote(targets = Loc.server, called = Loc.server) + public static void pickedBuildPayload(Unit unit, Building tile, boolean onGround){ + if(tile != null && unit instanceof Payloadc pay){ + if(onGround){ + if(tile.block.buildVisibility != BuildVisibility.hidden && tile.canPickup() && pay.canPickup(tile)){ + pay.pickup(tile); + }else{ + Fx.unitPickup.at(tile); + tile.tile.remove(); + } + }else{ Payload current = tile.getPayload(); if(current != null && pay.canPickupPayload(current)){ Payload taken = tile.takePayload(); @@ -140,17 +213,29 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } } + + }else if(tile != null && onGround){ + Fx.unitPickup.at(tile); + tile.tile.remove(); } } - @Remote(targets = Loc.both, called = Loc.server, forward = true) - public static void dropPayload(Player player, float x, float y){ - if(player == null) return; + @Remote(targets = Loc.both, called = Loc.server) + public static void requestDropPayload(Player player, float x, float y){ + if(player == null || net.client()) return; Payloadc pay = (Payloadc)player.unit(); - //allow a slight margin of error - if(pay.within(x, y, tilesize * 2f)){ + //apply margin of error + Tmp.v1.set(x, y).sub(pay).limit(tilesize * 4f).add(pay); + float cx = Tmp.v1.x, cy = Tmp.v1.y; + + Call.payloadDropped(player.unit(), cx, cy); + } + + @Remote(called = Loc.server, targets = Loc.server) + public static void payloadDropped(Unit unit, float x, float y){ + if(unit instanceof Payloadc pay){ float prevx = pay.x(), prevy = pay.y(); pay.set(x, y); pay.dropLastPayload(); @@ -171,7 +256,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } @Remote(targets = Loc.both, called = Loc.server, forward = true, unreliable = true) - public static void rotateBlock(Player player, Building tile, boolean direction){ + public static void rotateBlock(@Nullable Player player, Building tile, boolean direction){ if(tile == null) return; if(net.server() && (!Units.canInteract(player, tile) || @@ -179,6 +264,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ throw new ValidateException(player, "Player cannot rotate a block."); } + if(player != null) tile.lastAccessed = player.name; tile.rotation = Mathf.mod(tile.rotation + Mathf.sign(direction), 4); tile.updateProximity(); tile.noSleep(); @@ -186,10 +272,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ @Remote(targets = Loc.both, forward = true, called = Loc.server) public static void transferInventory(Player player, Building tile){ - if(player == null || tile == null) return; + if(player == null || tile == null || !player.within(tile, buildingRange) || tile.items == null || player.dead()) return; if(net.server() && (player.unit().stack.amount <= 0 || !Units.canInteract(player, tile) || - !netServer.admins.allowAction(player, ActionType.depositItem, tile.tile(), action -> { + !netServer.admins.allowAction(player, ActionType.depositItem, tile.tile, action -> { action.itemAmount = player.unit().stack.amount; action.item = player.unit().item(); }))){ @@ -219,11 +305,20 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public static void tileConfig(@Nullable Player player, Building tile, @Nullable Object value){ if(tile == null) return; if(net.server() && (!Units.canInteract(player, tile) || - !netServer.admins.allowAction(player, ActionType.configure, tile.tile(), action -> action.config = value))) throw new ValidateException(player, "Player cannot configure a tile."); + !netServer.admins.allowAction(player, ActionType.configure, tile.tile, action -> action.config = value))) throw new ValidateException(player, "Player cannot configure a tile."); tile.configured(player == null || player.dead() ? null : player.unit(), value); Core.app.post(() -> Events.fire(new ConfigEvent(tile, player, value))); } + //only useful for servers or local mods, and is not replicated across clients + //uses unreliable packets due to high frequency + @Remote(targets = Loc.both, called = Loc.both, unreliable = true) + public static void tileTap(@Nullable Player player, Tile tile){ + if(tile == null) return; + + Events.fire(new TapEvent(player, tile)); + } + @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void unitControl(Player player, @Nullable Unit unit){ if(player == null) return; @@ -242,7 +337,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ }else if(unit == null){ //just clear the unit (is this used?) player.clearUnit(); //make sure it's AI controlled, so players can't overwrite each other - }else if(unit.isAI() && unit.team == player.team() && !unit.deactivated() && !unit.dead){ + }else if(unit.isAI() && unit.team == player.team() && !unit.dead){ if(!net.client()){ player.unit(unit); } @@ -266,15 +361,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void unitCommand(Player player){ - if(player == null || player.dead() || !(player.unit() instanceof Commanderc)) return; - - Commanderc commander = (Commanderc)player.unit(); + if(player == null || player.dead() || !(player.unit() instanceof Commanderc commander)) return; if(commander.isCommanding()){ commander.clearCommand(); - }else{ + }else if(player.unit().type().commandLimit > 0){ - commander.commandNearby(new SquareFormation()); + //TODO try out some other formations + commander.commandNearby(new CircleFormation()); Fx.commandSend.at(player); } @@ -303,12 +397,18 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.builder().updateBuilding(isBuilding); } + if(player.shooting && !wasShooting && player.unit().hasWeapons() && state.rules.unitAmmo && player.unit().ammo <= 0){ + player.unit().type().weapons.first().noAmmoSound.at(player.unit()); + } + + wasShooting = player.shooting; + if(!player.dead()){ controlledType = player.unit().type(); } if(controlledType != null && player.dead()){ - Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.deactivated() && !u.dead); + Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.dead); if(unit != null){ Call.unitControl(player, unit); @@ -318,7 +418,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public void checkUnit(){ if(controlledType != null){ - Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.deactivated() && !u.dead); + Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.dead); if(unit == null && controlledType == UnitTypes.block){ unit = world.buildWorld(player.x, player.y) instanceof ControlBlock ? ((ControlBlock)world.buildWorld(player.x, player.y)).unit() : null; } @@ -335,17 +435,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public void tryPickupPayload(){ Unit unit = player.unit(); - if(!(unit instanceof Payloadc)) return; - Payloadc pay = (Payloadc)unit; + if(!(unit instanceof Payloadc pay)) return; - Unit target = Units.closest(player.team(), pay.x(), pay.y(), unit.type().hitsize * 2.5f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(unit, u.hitSize + unit.hitSize * 1.2f)); + Unit target = Units.closest(player.team(), pay.x(), pay.y(), unit.type().hitSize * 2.5f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(unit, u.hitSize + unit.hitSize * 1.2f)); if(target != null){ - Call.pickupUnitPayload(player, target); + Call.requestUnitPayload(player, target); }else{ Building tile = world.buildWorld(pay.x(), pay.y()); - if(tile != null && tile.team == unit.team && pay.canPickup(tile)){ - Call.pickupBlockPayload(player, tile); + if(tile != null && tile.team == unit.team){ + Call.requestBuildPayload(player, tile); } } } @@ -354,7 +453,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Unit unit = player.unit(); if(!(unit instanceof Payloadc)) return; - Call.dropPayload(player, player.x, player.y); + Call.requestDropPayload(player, player.x, player.y); } public float getMouseX(){ @@ -433,6 +532,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ }); }else{ lastSchematic.tags.put("name", text); + lastSchematic.tags.put("description", ""); schematics.add(lastSchematic); ui.showInfoFade("@schematic.saved"); ui.schematics.showInfo(lastSchematic); @@ -753,7 +853,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ boolean consumed = false, showedInventory = false; //check if tapped block is configurable - if(tile.block().configurable && tile.interactable(player.team())){ + if(tile.block.configurable && tile.interactable(player.team())){ consumed = true; if(((!frag.config.isShown() && tile.shouldShowConfigure(player)) //if the config fragment is hidden, show //alternatively, the current selected block can 'agree' to switch config tiles @@ -780,10 +880,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } //consume tap event if necessary - if(tile.interactable(player.team()) && tile.block().consumesTap){ + if(tile.interactable(player.team()) && tile.block.consumesTap){ consumed = true; - }else if(tile.interactable(player.team()) && tile.block().synthetic() && !consumed){ - if(tile.block().hasItems && tile.items.total() > 0){ + }else if(tile.interactable(player.team()) && tile.block.synthetic() && !consumed){ + if(tile.block.hasItems && tile.items.total() > 0){ frag.inv.showFor(tile); consumed = true; showedInventory = true; @@ -874,7 +974,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public @Nullable Unit selectedUnit(){ - Unit unit = Units.closest(player.team(), Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, u -> u.isAI() && !u.deactivated()); + Unit unit = Units.closest(player.team(), Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, u -> u.isAI()); if(unit != null){ unit.hitbox(Tmp.r1); Tmp.r1.grow(6f); @@ -924,6 +1024,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ uiGroup.touchable = Touchable.childrenOnly; uiGroup.setFillParent(true); ui.hudGroup.addChild(uiGroup); + uiGroup.toBack(); buildUI(uiGroup); frag.add(); @@ -953,7 +1054,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ ItemStack stack = player.unit().stack; - if(tile != null && tile.acceptStack(stack.item, stack.amount, player.unit()) > 0 && tile.interactable(player.team()) && tile.block().hasItems && player.unit().stack().amount > 0 && tile.interactable(player.team())){ + if(tile != null && tile.acceptStack(stack.item, stack.amount, player.unit()) > 0 && tile.interactable(player.team()) && tile.block.hasItems && player.unit().stack().amount > 0 && tile.interactable(player.team())){ Call.transferInventory(player, tile); }else{ Call.dropItem(player.angleTo(x, y)); @@ -1018,15 +1119,15 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Draw.rect(Core.atlas.find("place-arrow"), x * tilesize + block.offset + dx*trns, y * tilesize + block.offset - 1 + dy*trns, - Core.atlas.find("place-arrow").getWidth() * Draw.scl, - Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90); + Core.atlas.find("place-arrow").width * Draw.scl, + Core.atlas.find("place-arrow").height * Draw.scl, rotation * 90 - 90); Draw.color(!valid ? Pal.remove : Pal.accent); Draw.rect(Core.atlas.find("place-arrow"), x * tilesize + block.offset + dx*trns, y * tilesize + block.offset + dy*trns, - Core.atlas.find("place-arrow").getWidth() * Draw.scl, - Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90); + Core.atlas.find("place-arrow").width * Draw.scl, + Core.atlas.find("place-arrow").height * Draw.scl, rotation * 90 - 90); } void iterateLine(int startX, int startY, int endX, int endY, Cons cons){ diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index 87e22187c1..19f458ea88 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -60,10 +60,15 @@ public class MobileInput extends InputHandler implements GestureListener{ public Block lastBlock; /** Last placed request. Used for drawing block overlay. */ public BuildPlan lastPlaced; - /** Down tracking for panning.*/ + /** Down tracking for panning. */ public boolean down = false; + /** Whether manual shooting (point with finger) is enabled. */ + public boolean manualShooting = false; - public Teamc target, moveTarget; + /** Current thing being shot at. */ + public Teamc target; + /** Payload target being moved to. Can be a position (for dropping), or a unit/block. */ + public Position payloadTarget; //region utility methods @@ -360,7 +365,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } //draw targeting crosshair - if(target != null && !state.isEditor()){ + if(target != null && !state.isEditor() && !manualShooting){ if(target != lastTarget){ crosshairScale = 0f; lastTarget = target; @@ -474,6 +479,7 @@ public class MobileInput extends InputHandler implements GestureListener{ down = false; } + manualShooting = false; selecting = false; //place down a line if in line mode @@ -517,12 +523,31 @@ public class MobileInput extends InputHandler implements GestureListener{ //handle long tap when player isn't building if(mode == none){ + Vec2 pos = Core.input.mouseWorld(x, y); - //control a unit/block - Unit on = selectedUnit(); - if(on != null){ - Call.unitControl(player, on); + if(player.unit() instanceof Payloadc pay){ + Unit target = Units.closest(player.team(), pos.x, pos.y, 8f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(pos, u.hitSize + 8f)); + if(target != null){ + payloadTarget = target; + }else{ + Building build = world.buildWorld(pos.x, pos.y); + + if(build != null && build.team == player.team() && pay.canPickup(build)){ + payloadTarget = build; + }else if(pay.hasPayload()){ + //drop off at position + payloadTarget = new Vec2(pos); + }else{ + manualShooting = true; + this.target = null; + } + } + }else{ + manualShooting = true; + this.target = null; } + + if(!state.isPaused()) Fx.select.at(pos); }else{ //ignore off-screen taps @@ -558,7 +583,10 @@ public class MobileInput extends InputHandler implements GestureListener{ //ignore off-screen taps if(cursor == null || Core.scene.hasMouse(x, y)) return false; - Tile linked = cursor.build == null ? cursor : cursor.build.tile(); + + Call.tileTap(player, cursor); + + Tile linked = cursor.build == null ? cursor : cursor.build.tile; if(!player.dead()){ checkTargets(worldx, worldy); @@ -578,17 +606,18 @@ public class MobileInput extends InputHandler implements GestureListener{ tryBeginMine(cursor); } - //apply command on double tap - if(count == 2 && Mathf.within(worldx, worldy, player.unit().x, player.unit().y, player.unit().hitSize * 2f)){ - if(player.unit() instanceof Commanderc){ + //control units. + if(count == 2){ + //reset payload target + payloadTarget = null; + //apply command on double tap when own unit is tapped + if(Mathf.within(worldx, worldy, player.unit().x, player.unit().y, player.unit().hitSize * 0.6f + 8f)){ Call.unitCommand(player); - } - - if(player.unit() instanceof Payloadc){ - if(((Payloadc)player.unit()).hasPayload()){ - tryDropPayload(); - }else{ - tryPickupPayload(); + }else{ + //control a unit/block + Unit on = selectedUnit(); + if(on != null){ + Call.unitControl(player, on); } } } @@ -605,10 +634,14 @@ public class MobileInput extends InputHandler implements GestureListener{ selectRequests.clear(); removals.clear(); mode = none; + manualShooting = false; + payloadTarget = null; } if(player.dead()){ mode = none; + manualShooting = false; + payloadTarget = null; } //zoom camera @@ -749,7 +782,8 @@ public class MobileInput extends InputHandler implements GestureListener{ return false; } - if(!down) return false; + //do not pan with manual shooting enabled + if(!down || manualShooting) return false; if(selecting){ //pan all requests shiftDeltaX += deltaX; @@ -803,8 +837,7 @@ public class MobileInput extends InputHandler implements GestureListener{ UnitType type = unit.type(); if(type == null) return; - boolean flying = type.flying; - boolean omni = !(unit instanceof WaterMovec); + boolean omni = unit.type().omniMovement; boolean legs = unit.isGrounded(); boolean allowHealing = type.canHeal; boolean validHealTarget = allowHealing && target instanceof Building && ((Building)target).isValid() && target.team() == unit.team && @@ -825,12 +858,12 @@ public class MobileInput extends InputHandler implements GestureListener{ float baseSpeed = unit.type().speed; //limit speed to minimum formation speed to preserve formation - if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){ + if(unit.isCommanding()){ //add a tiny multiplier to let units catch up just in case - baseSpeed = ((Commanderc)unit).minFormationSpeed() * 0.98f; + baseSpeed = unit.minFormationSpeed * 0.98f; } - float speed = baseSpeed * Mathf.lerp(1f, type.canBoost ? type.boostMultiplier : 1f, unit.elevation) * strafePenalty; + float speed = baseSpeed * Mathf.lerp(1f, unit.isCommanding() ? 1f : type.canBoost ? type.boostMultiplier : 1f, unit.elevation) * strafePenalty; float range = unit.hasWeapons() ? unit.range() : 0f; float bulletSpeed = unit.hasWeapons() ? type.weapons.first().bullet.speed : 0f; float mouseAngle = unit.angleTo(unit.aimX(), unit.aimY()); @@ -844,14 +877,26 @@ public class MobileInput extends InputHandler implements GestureListener{ } } - if(moveTarget != null){ - targetPos.set(moveTarget); + if(payloadTarget != null && unit instanceof Payloadc pay){ + targetPos.set(payloadTarget); attractDst = 0f; - if(unit.within(moveTarget, 2f * Time.delta)){ - handleTapTarget(moveTarget); - moveTarget = null; + if(unit.within(payloadTarget, 3f * Time.delta)){ + if(payloadTarget instanceof Vec2 && pay.hasPayload()){ + //vec -> dropping something + tryDropPayload(); + }else if(payloadTarget instanceof Building build && pay.canPickup(build)){ + //building -> picking building up + Call.requestBuildPayload(player, build); + }else if(payloadTarget instanceof Unit other && pay.canPickup(other)){ + //unit -> picking unit up + Call.requestUnitPayload(player, other); + } + + payloadTarget = null; } + }else{ + payloadTarget = null; } movement.set(targetPos).sub(player).limit(speed); @@ -877,21 +922,18 @@ public class MobileInput extends InputHandler implements GestureListener{ }else{ unit.moveAt(Tmp.v2.trns(unit.rotation, movement.len())); if(!movement.isZero() && legs){ - unit.vel.rotateTo(movement.angle(), type.rotateSpeed * Time.delta); + unit.vel.rotateTo(movement.angle(), type.rotateSpeed); } } - if(flying){ - //hovering effect - unit.x += Mathf.sin(Time.time(), 25f, 0.08f); - unit.y += Mathf.cos(Time.time(), 25f, 0.08f); - } - //update shooting if not building + not mining if(!player.builder().isBuilding() && player.miner().mineTile() == null){ - //autofire - if(target == null){ + //autofire targeting + if(manualShooting){ + player.shooting = !boosted; + unit.aim(player.mouseX = Core.input.mouseWorldX(), player.mouseY = Core.input.mouseWorldY()); + }else if(target == null){ player.shooting = false; if(Core.settings.getBool("autotarget")){ target = Units.closestTarget(unit.team, unit.x, unit.y, range, u -> u.team != Team.derelict, u -> u.team != Team.derelict); @@ -902,11 +944,9 @@ public class MobileInput extends InputHandler implements GestureListener{ target = null; } } - - if(target != null && player.isMiner()){ - player.miner().mineTile(null); - } } + + unit.aim(Tmp.v1.trns(unit.rotation, 1000f).add(unit)); }else{ Vec2 intercept = Predict.intercept(unit, target, bulletSpeed); @@ -916,16 +956,10 @@ public class MobileInput extends InputHandler implements GestureListener{ unit.aim(player.mouseX, player.mouseY); } - } unit.controlWeapons(player.shooting && !boosted); } - - protected void handleTapTarget(Teamc target){ - - } - //endregion } diff --git a/core/src/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java index a8995103d0..39c3a1a821 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -75,7 +75,7 @@ public class JsonIO{ //TODO this is terrible - json.setSerializer(Sector.class, new Serializer(){ + json.setSerializer(Sector.class, new Serializer<>(){ @Override public void write(Json json, Sector object, Class knownType){ json.writeValue(object.planet.name + "-" + object.id); @@ -88,7 +88,7 @@ public class JsonIO{ } }); - json.setSerializer(SectorPreset.class, new Serializer(){ + json.setSerializer(SectorPreset.class, new Serializer<>(){ @Override public void write(Json json, SectorPreset object, Class knownType){ json.writeValue(object.name); @@ -100,7 +100,21 @@ public class JsonIO{ } }); - json.setSerializer(Item.class, new Serializer(){ + json.setSerializer(Liquid.class, new Serializer<>(){ + @Override + public void write(Json json, Liquid object, Class knownType){ + json.writeValue(object.name); + } + + @Override + public Liquid read(Json json, JsonValue jsonData, Class type){ + if(jsonData.asString() == null) return Liquids.water; + Liquid i = Vars.content.getByName(ContentType.liquid, jsonData.asString()); + return i == null ? Liquids.water : i; + } + }); + + json.setSerializer(Item.class, new Serializer<>(){ @Override public void write(Json json, Item object, Class knownType){ json.writeValue(object.name); @@ -109,12 +123,12 @@ public class JsonIO{ @Override public Item read(Json json, JsonValue jsonData, Class type){ if(jsonData.asString() == null) return Items.copper; - Item i = Vars.content.getByName(ContentType.item, jsonData.asString()); + Item i = Vars.content.getByName(ContentType.item, jsonData.asString()); return i == null ? Items.copper : i; } }); - json.setSerializer(Team.class, new Serializer(){ + json.setSerializer(Team.class, new Serializer<>(){ @Override public void write(Json json, Team object, Class knownType){ json.writeValue(object.id); @@ -126,7 +140,7 @@ public class JsonIO{ } }); - json.setSerializer(Block.class, new Serializer(){ + json.setSerializer(Block.class, new Serializer<>(){ @Override public void write(Json json, Block object, Class knownType){ json.writeValue(object.name); @@ -139,7 +153,7 @@ public class JsonIO{ } }); - json.setSerializer(Weather.class, new Serializer(){ + json.setSerializer(Weather.class, new Serializer<>(){ @Override public void write(Json json, Weather object, Class knownType){ json.writeValue(object.name); @@ -151,7 +165,7 @@ public class JsonIO{ } }); - json.setSerializer(ItemStack.class, new Serializer(){ + json.setSerializer(ItemStack.class, new Serializer<>(){ @Override public void write(Json json, ItemStack object, Class knownType){ json.writeObjectStart(); @@ -165,6 +179,21 @@ public class JsonIO{ return new ItemStack(json.getSerializer(Item.class).read(json, jsonData.get("item"), Item.class), jsonData.getInt("amount")); } }); + + json.setSerializer(UnlockableContent.class, new Serializer<>(){ + @Override + public void write(Json json, UnlockableContent object, Class knownType){ + json.writeValue(object.name); + } + + @Override + public UnlockableContent read(Json json, JsonValue jsonData, Class type){ + String str = jsonData.asString(); + Item item = Vars.content.getByName(ContentType.item, str); + Liquid liquid = Vars.content.getByName(ContentType.liquid, str); + return item != null ? item : liquid; + } + }); } static class CustomJson extends Json{ diff --git a/core/src/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java index 73b7c06631..0aef1a19df 100644 --- a/core/src/mindustry/io/SaveFileReader.java +++ b/core/src/mindustry/io/SaveFileReader.java @@ -8,11 +8,7 @@ import mindustry.world.*; import java.io.*; public abstract class SaveFileReader{ - protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(); - protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput); - protected final ReusableByteOutStream byteOutputSmall = new ReusableByteOutStream(); - protected final DataOutputStream dataBytesSmall = new DataOutputStream(byteOutputSmall); - protected final ObjectMap fallback = ObjectMap.of( + public static final ObjectMap fallback = ObjectMap.of( "dart-mech-pad", "legacy-mech-pad", "dart-ship-pad", "legacy-mech-pad", "javelin-ship-pad", "legacy-mech-pad", @@ -35,9 +31,34 @@ public abstract class SaveFileReader{ "fortress-factory", "legacy-unit-factory", "mass-conveyor", "payload-conveyor", - "vestige", "scepter" + "vestige", "scepter", + "turbine-generator", "steam-generator", + + "rocks", "stone-wall", + "sporerocks", "spore-wall", + "icerocks", "ice-wall", + "dunerocks", "dune-wall", + "sandrocks", "sand-wall", + "shalerocks", "shale-wall", + "snowrocks", "snow-wall", + "saltrocks", "salt-wall", + "dirtwall", "dirt-wall", + + "ignarock", "basalt", + "holostone", "dacite", + "holostone-wall", "dacite-wall", + "rock", "boulder", + "snowrock", "snow-boulder", + "cliffs", "stone-wall", + + "cryofluidmixer", "cryofluid-mixer" ); + protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(); + protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput); + protected final ReusableByteOutStream byteOutputSmall = new ReusableByteOutStream(); + protected final DataOutputStream dataBytesSmall = new DataOutputStream(byteOutputSmall); + protected int lastRegionLength; protected void region(String name, DataInput stream, CounterInputStream counter, IORunner cons) throws IOException{ diff --git a/core/src/mindustry/io/SaveIO.java b/core/src/mindustry/io/SaveIO.java index 3ae3996d23..8b56ef2a61 100644 --- a/core/src/mindustry/io/SaveIO.java +++ b/core/src/mindustry/io/SaveIO.java @@ -3,6 +3,7 @@ package mindustry.io; import arc.*; import arc.files.*; import arc.struct.*; +import arc.util.*; import arc.util.io.*; import mindustry.*; import mindustry.game.EventType.*; @@ -41,7 +42,7 @@ public class SaveIO{ if(exists) file.moveTo(backupFileFor(file)); try{ write(file); - }catch(Exception e){ + }catch(Throwable e){ if(exists) backupFileFor(file).moveTo(file); throw new RuntimeException(e); } @@ -56,9 +57,9 @@ public class SaveIO{ } public static boolean isSaveValid(Fi file){ - try{ - return isSaveValid(new DataInputStream(new InflaterInputStream(file.read(bufferSize)))); - }catch(Exception e){ + try(DataInputStream stream = new DataInputStream(new InflaterInputStream(file.read(bufferSize)))){ + return isSaveValid(stream); + }catch(Throwable e){ return false; } } @@ -67,8 +68,8 @@ public class SaveIO{ try{ getMeta(stream); return true; - }catch(Exception e){ - e.printStackTrace(); + }catch(Throwable e){ + Log.err(e); return false; } } @@ -76,7 +77,8 @@ public class SaveIO{ public static SaveMeta getMeta(Fi file){ try{ return getMeta(getStream(file)); - }catch(Exception e){ + }catch(Throwable e){ + Log.err(e); return getMeta(getBackupStream(file)); } } @@ -119,11 +121,15 @@ public class SaveIO{ }else{ getVersion().write(stream, tags); } - }catch(Exception e){ + }catch(Throwable e){ throw new RuntimeException(e); } } + public static void load(String saveName) throws SaveException{ + load(saveDirectory.child(saveName + ".msav")); + } + public static void load(Fi file) throws SaveException{ load(file, world.context); } @@ -133,7 +139,7 @@ public class SaveIO{ //try and load; if any exception at all occurs load(new InflaterInputStream(file.read(bufferSize)), context); }catch(SaveException e){ - e.printStackTrace(); + Log.err(e); Fi backup = file.sibling(file.name() + "-backup." + file.extension()); if(backup.exists()){ load(new InflaterInputStream(backup.read(bufferSize)), context); @@ -153,7 +159,7 @@ public class SaveIO{ ver.read(stream, counter, context); Events.fire(new SaveLoadEvent()); - }catch(Exception e){ + }catch(Throwable e){ throw new SaveException(e); }finally{ world.setGenerating(false); diff --git a/core/src/mindustry/io/SaveMeta.java b/core/src/mindustry/io/SaveMeta.java index 4aeb7d2f99..f2e039f634 100644 --- a/core/src/mindustry/io/SaveMeta.java +++ b/core/src/mindustry/io/SaveMeta.java @@ -4,7 +4,7 @@ import arc.struct.*; import mindustry.game.*; import mindustry.maps.*; -import static mindustry.Vars.maps; +import static mindustry.Vars.*; public class SaveMeta{ public int version; diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index c3f83b30d8..cacac7700a 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -257,7 +257,7 @@ public abstract class SaveVersion extends SaveFileReader{ if(hadEntity){ if(isCenter){ //only read entity for center blocks - if(block.hasEntity()){ + if(block.hasBuilding()){ try{ readChunk(stream, true, in -> { byte revision = in.readByte(); diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index 733bb27c28..669cd65d53 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -3,7 +3,7 @@ package mindustry.io; import arc.graphics.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import arc.util.io.*; import arc.util.pooling.*; import mindustry.ai.types.*; @@ -37,64 +37,61 @@ public class TypeIO{ public static void writeObject(Writes write, Object object){ if(object == null){ write.b((byte)0); - }else if(object instanceof Integer){ + }else if(object instanceof Integer i){ write.b((byte)1); - write.i((Integer)object); - }else if(object instanceof Long){ + write.i(i); + }else if(object instanceof Long l){ write.b((byte)2); - write.l((Long)object); - }else if(object instanceof Float){ + write.l(l); + }else if(object instanceof Float f){ write.b((byte)3); - write.f((Float)object); - }else if(object instanceof String){ + write.f(f); + }else if(object instanceof String s){ write.b((byte)4); - writeString(write, (String)object); - }else if(object instanceof Content){ - Content map = (Content)object; + writeString(write, s); + }else if(object instanceof Content map){ write.b((byte)5); write.b((byte)map.getContentType().ordinal()); write.s(map.id); - }else if(object instanceof IntSeq){ + }else if(object instanceof IntSeq arr){ write.b((byte)6); - IntSeq arr = (IntSeq)object; write.s((short)arr.size); for(int i = 0; i < arr.size; i++){ write.i(arr.items[i]); } - }else if(object instanceof Point2){ + }else if(object instanceof Point2 p){ write.b((byte)7); - write.i(((Point2)object).x); - write.i(((Point2)object).y); - }else if(object instanceof Point2[]){ + write.i(p.x); + write.i(p.y); + }else if(object instanceof Point2[] p){ write.b((byte)8); - write.b(((Point2[])object).length); - for(int i = 0; i < ((Point2[])object).length; i++){ - write.i(((Point2[])object)[i].pack()); + write.b(p.length); + for(Point2 point2 : p){ + write.i(point2.pack()); } - }else if(object instanceof TechNode){ - TechNode map = (TechNode)object; + }else if(object instanceof TechNode map){ write.b(9); write.b((byte)map.content.getContentType().ordinal()); write.s(map.content.id); - }else if(object instanceof Boolean){ + }else if(object instanceof Boolean b){ write.b((byte)10); - write.bool((Boolean)object); - }else if(object instanceof Double){ + write.bool(b); + }else if(object instanceof Double d){ write.b((byte)11); - write.d((Double)object); - }else if(object instanceof Building){ - write.b((byte)12); - write.i(((Building)object).pos()); - }else if(object instanceof LAccess){ + write.d(d); + }else if(object instanceof Building b){ + write.b(12); + write.i(b.pos()); + }else if(object instanceof LAccess l){ write.b((byte)13); - write.s(((LAccess)object).ordinal()); - }else if(object instanceof byte[]){ + write.s(l.ordinal()); + }else if(object instanceof byte[] b){ write.b((byte)14); - write.i(((byte[])object).length); - write.b((byte[])object); - }else if(object instanceof UnitCommand){ + write.i(b.length); + write.b(b); + }else if(object instanceof UnitCommand c){ write.b((byte)15); - write.b(((UnitCommand)object).ordinal()); + write.b(c.ordinal()); }else{ throw new IllegalArgumentException("Unknown object type: " + object.getClass()); } @@ -293,12 +290,15 @@ public class TypeIO{ public static void writeController(Writes write, UnitController control){ //no real unit controller state is written, only the type - if(control instanceof Player){ + if(control instanceof Player p){ write.b(0); - write.i(((Player)control).id); - }else if(control instanceof FormationAI){ + write.i(p.id); + }else if(control instanceof FormationAI form){ write.b(1); - write.i(((FormationAI)control).leader.id); + write.i(form.leader.id); + }else if(control instanceof LogicAI logic && logic.controller != null){ + write.b(3); + write.i(logic.controller.pos()); }else{ write.b(2); } @@ -315,6 +315,19 @@ public class TypeIO{ }else if(type == 1){ //formation controller int id = read.i(); return prev instanceof FormationAI ? prev : new FormationAI(Groups.unit.getByID(id), null); + }else if(type == 3){ + int pos = read.i(); + if(prev instanceof LogicAI pai){ + pai.controller = world.build(pos); + return pai; + }else{ + //create new AI for assignment + LogicAI out = new LogicAI(); + //instantly time out when updated. + out.controlTimer = LogicAI.logicControlTimeout; + out.controller = world.build(pos); + return out; + } }else{ //there are two cases here: //1: prev controller was not a player, carry on diff --git a/core/src/mindustry/io/legacy/LegacyIO.java b/core/src/mindustry/io/legacy/LegacyIO.java index 1d0a790159..545487d8ca 100644 --- a/core/src/mindustry/io/legacy/LegacyIO.java +++ b/core/src/mindustry/io/legacy/LegacyIO.java @@ -10,8 +10,8 @@ public class LegacyIO{ /** Maps old unit names to new ones. */ public static final StringMap unitMap = StringMap.of( "titan", "mace", - "chaos-array", "vestige", - "eradicator", "cataclyst", + "chaos-array", "scepter", + "eradicator", "reign", "eruptor", "atrax", "wraith", "flare", "ghoul", "horizon", diff --git a/core/src/mindustry/io/legacy/LegacySaveVersion.java b/core/src/mindustry/io/legacy/LegacySaveVersion.java index 74e4a12286..a511868356 100644 --- a/core/src/mindustry/io/legacy/LegacySaveVersion.java +++ b/core/src/mindustry/io/legacy/LegacySaveVersion.java @@ -9,7 +9,7 @@ import mindustry.world.*; import java.io.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public abstract class LegacySaveVersion extends SaveVersion{ @@ -54,14 +54,14 @@ public abstract class LegacySaveVersion extends SaveVersion{ if(block == null) block = Blocks.air; //occupied by multiblock part - boolean occupied = tile.build != null && !tile.isCenter() && (tile.build.block() == block || block == Blocks.air); + boolean occupied = tile.build != null && !tile.isCenter() && (tile.build.block == block || block == Blocks.air); //do not override occupied cells if(!occupied){ tile.setBlock(block); } - if(block.hasEntity()){ + if(block.hasBuilding()){ try{ readChunk(stream, true, in -> { byte version = in.readByte(); diff --git a/core/src/mindustry/io/legacy/Save3.java b/core/src/mindustry/io/legacy/Save3.java index 64e7683ff2..7306b2bf29 100644 --- a/core/src/mindustry/io/legacy/Save3.java +++ b/core/src/mindustry/io/legacy/Save3.java @@ -5,7 +5,7 @@ import mindustry.game.Teams.*; import java.io.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class Save3 extends LegacySaveVersion{ diff --git a/core/src/mindustry/logic/ConditionOp.java b/core/src/mindustry/logic/ConditionOp.java index c85bc6f37a..0954567c06 100644 --- a/core/src/mindustry/logic/ConditionOp.java +++ b/core/src/mindustry/logic/ConditionOp.java @@ -1,21 +1,28 @@ package mindustry.logic; public enum ConditionOp{ - equal("==", (a, b) -> Math.abs(a - b) < 0.000001), - notEqual("not", (a, b) -> Math.abs(a - b) >= 0.000001), + equal("==", (a, b) -> Math.abs(a - b) < 0.000001, (a, b) -> a == b), + notEqual("not", (a, b) -> Math.abs(a - b) >= 0.000001, (a, b) -> a != b), lessThan("<", (a, b) -> a < b), lessThanEq("<=", (a, b) -> a <= b), greaterThan(">", (a, b) -> a > b), - greaterThanEq(">=", (a, b) -> a >= b); + greaterThanEq(">=", (a, b) -> a >= b), + always("always", (a, b) -> true); public static final ConditionOp[] all = values(); + public final CondObjOpLambda objFunction; public final CondOpLambda function; public final String symbol; ConditionOp(String symbol, CondOpLambda function){ + this(symbol, function, null); + } + + ConditionOp(String symbol, CondOpLambda function, CondObjOpLambda objFunction){ this.symbol = symbol; this.function = function; + this.objFunction = objFunction; } @Override @@ -23,6 +30,10 @@ public enum ConditionOp{ return symbol; } + interface CondObjOpLambda{ + boolean get(Object a, Object b); + } + interface CondOpLambda{ boolean get(double a, double b); } diff --git a/core/src/mindustry/logic/Controllable.java b/core/src/mindustry/logic/Controllable.java index 31baf31a1e..3785eae4b6 100644 --- a/core/src/mindustry/logic/Controllable.java +++ b/core/src/mindustry/logic/Controllable.java @@ -3,4 +3,5 @@ package mindustry.logic; /** An object that can be controlled with logic. */ public interface Controllable{ void control(LAccess type, double p1, double p2, double p3, double p4); + void control(LAccess type, Object p1, double p2, double p3, double p4); } diff --git a/core/src/mindustry/logic/LAccess.java b/core/src/mindustry/logic/LAccess.java index 2128028153..5dc881a778 100644 --- a/core/src/mindustry/logic/LAccess.java +++ b/core/src/mindustry/logic/LAccess.java @@ -5,6 +5,7 @@ import arc.struct.*; /** Setter/getter enum for logic-controlled objects. */ public enum LAccess{ totalItems, + firstItem, totalLiquids, totalPower, itemCapacity, @@ -15,6 +16,7 @@ public enum LAccess{ powerNetIn, powerNetOut, health, + maxHealth, heat, efficiency, rotation, @@ -24,18 +26,35 @@ public enum LAccess{ shootY, shooting, team, + type, + flag, + name, + config, + payloadCount, + payloadType, //values with parameters are considered controllable enabled("to"), //"to" is standard for single parameter access - shoot("x", "y", "shoot"),; + shoot("x", "y", "shoot"), + shootp(true, "unit", "shoot") - public final String[] parameters; + ; - public static final LAccess[] all = values(); - public static final LAccess[] senseable = Seq.select(all, t -> t.parameters.length <= 1).toArray(LAccess.class); - public static final LAccess[] controls = Seq.select(all, t -> t.parameters.length > 0).toArray(LAccess.class); + public final String[] params; + public final boolean isObj; - LAccess(String... parameters){ - this.parameters = parameters; + public static final LAccess[] + all = values(), + senseable = Seq.select(all, t -> t.params.length <= 1).toArray(LAccess.class), + controls = Seq.select(all, t -> t.params.length > 0).toArray(LAccess.class); + + LAccess(String... params){ + this.params = params; + isObj = false; + } + + LAccess(boolean obj, String... params){ + this.params = params; + isObj = obj; } } diff --git a/core/src/mindustry/logic/LAssembler.java b/core/src/mindustry/logic/LAssembler.java index 47fb032c83..4f72d121aa 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -2,12 +2,14 @@ package mindustry.logic; import arc.func.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.*; +import mindustry.content.*; import mindustry.gen.*; import mindustry.logic.LExecutor.*; import mindustry.logic.LStatements.*; import mindustry.type.*; +import mindustry.world.*; /** "Compiles" a sequence of statements into instructions. */ public class LAssembler{ @@ -20,8 +22,14 @@ public class LAssembler{ LInstruction[] instructions; public LAssembler(){ + //instruction counter putVar("@counter").value = 0; + //unix timestamp putConst("@time", 0); + //currently controlled unit + putConst("@unit", null); + //reference to self + putConst("@this", null); //add default constants putConst("false", 0); @@ -38,6 +46,21 @@ public class LAssembler{ putConst("@" + liquid.name, liquid); } + for(Block block : Vars.content.blocks()){ + if(block.synthetic()){ + putConst("@" + block.name, block); + } + } + + //used as a special value for any environmental solid block + putConst("@solid", Blocks.stoneWall); + + putConst("@air", Blocks.air); + + for(UnitType type : Vars.content.units()){ + putConst("@" + type.name, type); + } + //store sensor constants for(LAccess sensor : LAccess.all){ @@ -195,7 +218,8 @@ public class LAssembler{ } } - public @Nullable BVar getVar(String name){ + @Nullable + public BVar getVar(String name){ return vars.get(name); } diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index d626f95388..ed98bee8ff 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -13,7 +13,6 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; @@ -348,7 +347,7 @@ public class LCanvas extends Table{ public static class JumpButton extends ImageButton{ Color hoverColor = Pal.place; Color defaultColor = Color.white; - @NonNull Prov to; + Prov to; boolean selecting; float mx, my; ClickListener listener; @@ -356,7 +355,7 @@ public class LCanvas extends Table{ JumpCurve curve; - public JumpButton(@NonNull Prov getter, Cons setter){ + public JumpButton(Prov getter, Cons setter){ super(Tex.logicNode, Styles.colori); to = getter; diff --git a/core/src/mindustry/logic/LCategory.java b/core/src/mindustry/logic/LCategory.java index b576261f74..849e2f64bd 100644 --- a/core/src/mindustry/logic/LCategory.java +++ b/core/src/mindustry/logic/LCategory.java @@ -7,7 +7,8 @@ public enum LCategory{ blocks(Pal.accentBack), control(Color.cyan.cpy().shiftSaturation(-0.6f).mul(0.7f)), operations(Pal.place.cpy().shiftSaturation(-0.5f).mul(0.7f)), - io(Pal.remove.cpy().shiftSaturation(-0.5f).mul(0.7f)); + io(Pal.remove.cpy().shiftSaturation(-0.5f).mul(0.7f)), + units(Pal.bulletYellowBack.cpy().shiftSaturation(-0.3f).mul(0.8f)); public final Color color; diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 5ac84a72ae..3bcfaf46ee 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1,30 +1,42 @@ package mindustry.logic; +import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; +import arc.util.noise.*; import mindustry.*; +import mindustry.ai.types.*; +import mindustry.content.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.game.*; import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; import mindustry.world.blocks.logic.LogicDisplay.*; import mindustry.world.blocks.logic.MemoryBlock.*; import mindustry.world.blocks.logic.MessageBlock.*; +import mindustry.world.blocks.payloads.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; public class LExecutor{ public static final int maxInstructions = 1000; + //for noise operations + public static final Simplex noise = new Simplex(); + //special variables public static final int varCounter = 0, - varTime = 1; + varTime = 1, + varUnit = 2, + varThis = 3; public static final int maxGraphicsBuffer = 256, - maxDisplayBuffer = 512, + maxDisplayBuffer = 1024, maxTextBuffer = 256; public LInstruction[] instructions = {}; @@ -33,6 +45,7 @@ public class LExecutor{ public LongSeq graphicsBuffer = new LongSeq(); public StringBuilder textBuffer = new StringBuilder(); public Building[] links = {}; + public Team team = Team.derelict; public boolean initialized(){ return instructions != null && vars != null && instructions.length > 0; @@ -99,10 +112,19 @@ public class LExecutor{ return v.isobj ? v.objval != null ? 1 : 0 : v.numval; } + public float numf(int index){ + Var v = vars[index]; + return v.isobj ? v.objval != null ? 1 : 0 : (float)v.numval; + } + public int numi(int index){ return (int)num(index); } + public void setbool(int index, boolean value){ + setnum(index, value ? 1 : 0); + } + public void setnum(int index, double value){ Var v = vars[index]; if(v.constant) return; @@ -118,6 +140,12 @@ public class LExecutor{ v.isobj = true; } + public void setconst(int index, Object value){ + Var v = vars[index]; + v.objval = value; + v.isobj = true; + } + //endregion public static class Var{ @@ -139,6 +167,327 @@ public class LExecutor{ void run(LExecutor exec); } + /** Binds the processor to a unit based on some filters. */ + public static class UnitBindI implements LInstruction{ + public int type; + + //iteration index + private int index; + + public UnitBindI(int type){ + this.type = type; + } + + public UnitBindI(){ + } + + @Override + public void run(LExecutor exec){ + + //binding to `null` was previously possible, but was too powerful and exploitable + if(exec.obj(type) instanceof UnitType type){ + Seq seq = exec.team.data().unitCache(type); + + if(seq != null && seq.any()){ + index %= seq.size; + if(index < seq.size){ + //bind to the next unit + exec.setconst(varUnit, seq.get(index)); + } + index ++; + }else{ + //no units of this type found + exec.setconst(varUnit, null); + } + }else{ + exec.setconst(varUnit, null); + } + } + } + + /** Uses a unit to find something that may not be in its range. */ + public static class UnitLocateI implements LInstruction{ + public LLocate locate = LLocate.building; + public BlockFlag flag = BlockFlag.core; + public int enemy, ore; + public int outX, outY, outFound; + + public UnitLocateI(LLocate locate, BlockFlag flag, int enemy, int ore, int outX, int outY, int outFound){ + this.locate = locate; + this.flag = flag; + this.enemy = enemy; + this.ore = ore; + this.outX = outX; + this.outY = outY; + this.outFound = outFound; + } + + public UnitLocateI(){ + } + + @Override + public void run(LExecutor exec){ + Object unitObj = exec.obj(varUnit); + LogicAI ai = UnitControlI.checkLogicAI(exec, unitObj); + + if(unitObj instanceof Unit unit && ai != null){ + ai.controlTimer = LogicAI.logicControlTimeout; + + Cache cache = (Cache)ai.execCache.get(this, Cache::new); + + if(ai.checkTargetTimer(this)){ + Tile res = null; + boolean build = false; + + switch(locate){ + case ore -> { + if(exec.obj(ore) instanceof Item item){ + res = indexer.findClosestOre(unit.x, unit.y, item); + } + } + case building -> { + res = Geometry.findClosest(unit.x, unit.y, exec.bool(enemy) ? indexer.getEnemy(unit.team, flag) : indexer.getAllied(unit.team, flag)); + build = true; + } + case spawn -> { + res = Geometry.findClosest(unit.x, unit.y, Vars.spawner.getSpawns()); + } + case damaged -> { + Building b = Units.findDamagedTile(unit.team, unit.x, unit.y); + res = b == null ? null : b.tile; + build = true; + } + } + + if(res != null && (!build || res.build != null)){ + cache.found = true; + //set result if found + exec.setnum(outX, cache.x = build ? res.build.x : res.worldx()); + exec.setnum(outY, cache.y = build ? res.build.y : res.worldy()); + exec.setnum(outFound, 1); + }else{ + cache.found = false; + exec.setnum(outFound, 0); + } + }else{ + exec.setbool(outFound, cache.found); + exec.setnum(outX, cache.x); + exec.setnum(outY, cache.y); + } + } + } + + static class Cache{ + float x, y; + boolean found; + } + } + + /** Controls the unit based on some parameters. */ + public static class UnitControlI implements LInstruction{ + public LUnitControl type = LUnitControl.move; + public int p1, p2, p3, p4; + + public UnitControlI(LUnitControl type, int p1, int p2, int p3, int p4){ + this.type = type; + this.p1 = p1; + this.p2 = p2; + this.p3 = p3; + this.p4 = p4; + } + + public UnitControlI(){ + } + + /** Checks is a unit is valid for logic AI control, and returns the controller. */ + @Nullable + public static LogicAI checkLogicAI(LExecutor exec, Object unitObj){ + if(unitObj instanceof Unit unit && exec.obj(varUnit) == unit && unit.team == exec.team && !unit.isPlayer() && !(unit.controller() instanceof FormationAI)){ + if(!(unit.controller() instanceof LogicAI)){ + unit.controller(new LogicAI()); + ((LogicAI)unit.controller()).controller = exec.building(varThis); + + //clear old state + if(unit instanceof Minerc miner){ + miner.mineTile(null); + } + + if(unit instanceof Builderc builder){ + builder.clearBuilding(); + } + + return (LogicAI)unit.controller(); + } + return (LogicAI)unit.controller(); + } + return null; + } + + @Override + public void run(LExecutor exec){ + Object unitObj = exec.obj(varUnit); + LogicAI ai = checkLogicAI(exec, unitObj); + + //only control standard AI units + if(unitObj instanceof Unit unit && ai != null){ + ai.controlTimer = LogicAI.logicControlTimeout; + + switch(type){ + case move, stop, approach -> { + ai.control = type; + ai.moveX = exec.numf(p1); + ai.moveY = exec.numf(p2); + if(type == LUnitControl.approach){ + ai.moveRad = exec.numf(p3); + } + + //stop mining/building + if(type == LUnitControl.stop){ + if(unit instanceof Minerc miner){ + miner.mineTile(null); + } + if(unit instanceof Builderc build){ + build.clearBuilding(); + } + } + } + case within -> { + exec.setnum(p4, unit.within(exec.numf(p1), exec.numf(p2), exec.numf(p3)) ? 1 : 0); + } + case pathfind -> { + ai.control = type; + } + case target -> { + ai.posTarget.set(exec.numf(p1), exec.numf(p2)); + ai.aimControl = type; + ai.mainTarget = null; + ai.shoot = exec.bool(p3); + } + case targetp -> { + ai.aimControl = type; + ai.mainTarget = exec.obj(p1) instanceof Teamc t ? t : null; + ai.shoot = exec.bool(p2); + } + case boost -> { + ai.boost = exec.bool(p1); + } + case flag -> { + unit.flag = exec.num(p1); + } + case mine -> { + Tile tile = world.tileWorld(exec.numf(p1), exec.numf(p2)); + if(unit instanceof Minerc miner){ + miner.mineTile(miner.validMine(tile) ? tile : null); + } + } + case payDrop -> { + if(ai.payTimer > 0) return; + + if(unit instanceof Payloadc pay && pay.hasPayload()){ + Call.payloadDropped(unit, unit.x, unit.y); + ai.payTimer = LogicAI.transferDelay; + } + } + case payTake -> { + if(ai.payTimer > 0) return; + + if(unit instanceof Payloadc pay){ + //units + if(exec.bool(p1)){ + Unit result = Units.closest(unit.team, unit.x, unit.y, unit.type().hitSize * 2f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(unit, u.hitSize + unit.hitSize * 1.2f)); + + if(result != null){ + Call.pickedUnitPayload(unit, result); + } + }else{ //buildings + Building tile = world.buildWorld(unit.x, unit.y); + + //TODO copy pasted code + if(tile != null && tile.team == unit.team){ + if(tile.block.buildVisibility != BuildVisibility.hidden && tile.canPickup() && pay.canPickup(tile)){ + Call.pickedBuildPayload(unit, tile, true); + }else{ //pick up block payload + Payload current = tile.getPayload(); + if(current != null && pay.canPickupPayload(current)){ + Call.pickedBuildPayload(unit, tile, false); + } + } + } + } + ai.payTimer = LogicAI.transferDelay; + } + } + case build -> { + if(unit instanceof Builderc builder && exec.obj(p3) instanceof Block block){ + int x = world.toTile(exec.numf(p1)), y = world.toTile(exec.numf(p2)); + int rot = exec.numi(p4); + + //reset state of last request when necessary + if(ai.plan.x != x || ai.plan.y != y || ai.plan.block != block || builder.plans().isEmpty()){ + ai.plan.progress = 0; + ai.plan.initialized = false; + ai.plan.stuck = false; + } + + ai.plan.set(x, y, rot, block); + ai.plan.config = null; + + if(ai.plan.tile() != null){ + builder.clearBuilding(); + builder.updateBuilding(true); + builder.addBuild(ai.plan); + } + } + } + case getBlock -> { + float x = exec.numf(p1), y = exec.numf(p2); + float range = Math.max(unit.range(), buildingRange); + if(!unit.within(x, y, range)){ + exec.setobj(p3, null); + exec.setnum(p4, 0); + }else{ + Tile tile = world.tileWorld(x, y); + //any environmental solid block is returned as StoneWall, aka "@solid" + Block block = tile == null ? null : !tile.synthetic() ? (tile.solid() ? Blocks.stoneWall : Blocks.air) : tile.block(); + exec.setobj(p3, block); + exec.setnum(p4, tile != null && tile.build != null ? tile.build.rotation : 0); + } + } + case itemDrop -> { + if(ai.itemTimer > 0) return; + + Building build = exec.building(p1); + int amount = exec.numi(p2); + int dropped = Math.min(unit.stack.amount, amount); + if(build != null && dropped > 0 && unit.within(build, logicItemTransferRange)){ + int accepted = build.acceptStack(unit.item(), dropped, unit); + if(accepted > 0){ + Call.transferItemTo(unit, unit.item(), accepted, unit.x, unit.y, build); + ai.itemTimer = LogicAI.transferDelay; + } + } + } + case itemTake -> { + if(ai.itemTimer > 0) return; + + Building build = exec.building(p1); + int amount = exec.numi(p3); + + if(build != null && exec.obj(p2) instanceof Item item && unit.within(build, logicItemTransferRange)){ + int taken = Math.min(build.items.get(item), Math.min(amount, unit.maxAccepted(item))); + + if(taken > 0){ + Call.takeItems(build, item, taken, unit); + ai.itemTimer = LogicAI.transferDelay; + } + } + } + default -> {} + } + } + } + } + /** Controls a building's state. */ public static class ControlI implements LInstruction{ public int target; @@ -159,9 +508,12 @@ public class LExecutor{ @Override public void run(LExecutor exec){ Object obj = exec.obj(target); - if(obj instanceof Controllable){ - Controllable cont = (Controllable)obj; - cont.control(type, exec.num(p1), exec.num(p2), exec.num(p3), exec.num(p4)); + if(obj instanceof Controllable cont){ + if(type.isObj){ + cont.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4)); + }else{ + cont.control(type, exec.num(p1), exec.num(p2), exec.num(p3), exec.num(p4)); + } } } } @@ -202,8 +554,7 @@ public class LExecutor{ int address = exec.numi(position); Building from = exec.building(target); - if(from instanceof MemoryBuild){ - MemoryBuild mem = (MemoryBuild)from; + if(from instanceof MemoryBuild mem){ exec.setnum(output, address < 0 || address >= mem.memory.length ? 0 : mem.memory[address]); } @@ -227,8 +578,7 @@ public class LExecutor{ int address = exec.numi(position); Building from = exec.building(target); - if(from instanceof MemoryBuild){ - MemoryBuild mem = (MemoryBuild)from; + if(from instanceof MemoryBuild mem){ if(address >= 0 && address < mem.memory.length){ mem.memory[address] = exec.num(value); @@ -255,18 +605,23 @@ public class LExecutor{ Object target = exec.obj(from); Object sense = exec.obj(type); - double output = 0; - - if(target instanceof Senseable){ + if(target instanceof Senseable se){ if(sense instanceof Content){ - output = ((Senseable)target).sense(((Content)sense)); + exec.setnum(to, se.sense(((Content)sense))); }else if(sense instanceof LAccess){ - output = ((Senseable)target).sense(((LAccess)sense)); + Object objOut = se.senseObject((LAccess)sense); + + if(objOut == Senseable.noSensed){ + //numeric output + exec.setnum(to, se.sense((LAccess)sense)); + }else{ + //object output + exec.setobj(to, objOut); + } } + }else{ + exec.setnum(to, 0); } - - exec.setnum(to, output); - } } @@ -298,16 +653,20 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - Building target = exec.building(radar); + Object base = exec.obj(radar); int sortDir = exec.bool(sortOrder) ? 1 : -1; + LogicAI ai = null; - if(target instanceof Ranged){ - float range = ((Ranged)target).range(); + if(base instanceof Ranged r && r.team() == exec.team && + (base instanceof Building || (ai = UnitControlI.checkLogicAI(exec, base)) != null)){ //must be a building or a controllable unit + float range = r.range(); Healthc targeted; - if(timer.get(30f)){ + //timers update on a fixed 30 tick interval + //units update on a special timer per controller instance + if((base instanceof Building && timer.get(30f)) || (ai != null && ai.checkTargetTimer(this))){ //if any of the targets involve enemies boolean enemies = target1 == RadarTarget.enemy || target2 == RadarTarget.enemy || target3 == RadarTarget.enemy; @@ -315,11 +674,11 @@ public class LExecutor{ bestValue = 0; if(enemies){ - for(Team enemy : state.teams.enemiesOf(target.team)){ - find(target, range, sortDir, enemy); + for(Team enemy : state.teams.enemiesOf(r.team())){ + find(r, range, sortDir, enemy); } }else{ - find(target, range, sortDir, target.team); + find(r, range, sortDir, r.team()); } lastTarget = targeted = best; @@ -333,14 +692,14 @@ public class LExecutor{ } } - void find(Building b, float range, int sortDir, Team team){ - Units.nearby(team, b.x, b.y, range, u -> { + void find(Ranged b, float range, int sortDir, Team team){ + Units.nearby(team, b.x(), b.y(), range, u -> { if(!u.within(b, range)) return; boolean valid = - target1.func.get(b.team, u) && - target2.func.get(b.team, u) && - target3.func.get(b.team, u); + target1.func.get(b.team(), u) && + target2.func.get(b.team(), u) && + target3.func.get(b.team(), u); if(!valid) return; @@ -399,7 +758,17 @@ public class LExecutor{ if(op.unary){ exec.setnum(dest, op.function1.get(exec.num(a))); }else{ - exec.setnum(dest, op.function2.get(exec.num(a), exec.num(b))); + Var va = exec.vars[a]; + Var vb = exec.vars[b]; + + if(op.objFunction2 != null && (va.isobj || vb.isobj)){ + //use object function if provided, and one of the variables is an object + exec.setnum(dest, op.objFunction2.get(exec.obj(a), exec.obj(b))); + }else{ + //otherwise use the numeric function + exec.setnum(dest, op.function2.get(exec.num(a), exec.num(b))); + } + } } } @@ -464,8 +833,7 @@ public class LExecutor{ if(Vars.headless) return; Building build = exec.building(target); - if(build instanceof LogicDisplayBuild){ - LogicDisplayBuild d = (LogicDisplayBuild)build; + if(build instanceof LogicDisplayBuild d){ if(d.commands.size + exec.graphicsBuffer.size < maxDisplayBuffer){ for(int i = 0; i < exec.graphicsBuffer.size; i++){ d.commands.addLast(exec.graphicsBuffer.items[i]); @@ -493,7 +861,9 @@ public class LExecutor{ //this should avoid any garbage allocation Var v = exec.vars[value]; if(v.isobj && value != 0){ - String strValue = v.objval instanceof String ? (String)v.objval : v.objval == null ? "null" : + String strValue = + v.objval == null ? "null" : + v.objval instanceof String ? (String)v.objval : v.objval instanceof Content ? "[content]" : v.objval instanceof Building ? "[building]" : v.objval instanceof Unit ? "[unit]" : @@ -525,8 +895,7 @@ public class LExecutor{ public void run(LExecutor exec){ Building build = exec.building(target); - if(build instanceof MessageBuild){ - MessageBuild d = (MessageBuild)build; + if(build instanceof MessageBuild d){ d.message.setLength(0); d.message.append(exec.textBuffer, 0, Math.min(exec.textBuffer.length(), maxTextBuffer)); @@ -552,8 +921,21 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - if(address != -1 && op.function.get(exec.num(value), exec.num(compare))){ - exec.vars[varCounter].numval = address; + if(address != -1){ + Var va = exec.vars[value]; + Var vb = exec.vars[compare]; + boolean cmp; + + if(op.objFunction != null && (va.isobj || vb.isobj)){ + //use object function if provided, and one of the variables is an object + cmp = op.objFunction.get(exec.obj(value), exec.obj(compare)); + }else{ + cmp = op.function.get(exec.num(value), exec.num(compare)); + } + + if(cmp){ + exec.vars[varCounter].numval = address; + } } } } diff --git a/core/src/mindustry/logic/LLocate.java b/core/src/mindustry/logic/LLocate.java new file mode 100644 index 0000000000..84da2321f9 --- /dev/null +++ b/core/src/mindustry/logic/LLocate.java @@ -0,0 +1,10 @@ +package mindustry.logic; + +public enum LLocate{ + ore, + building, + spawn, + damaged; + + public static final LLocate[] all = values(); +} diff --git a/core/src/mindustry/logic/LStatement.java b/core/src/mindustry/logic/LStatement.java index cbe5029d94..9fdc6407ef 100644 --- a/core/src/mindustry/logic/LStatement.java +++ b/core/src/mindustry/logic/LStatement.java @@ -9,7 +9,6 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.gen.*; import mindustry.logic.LCanvas.*; import mindustry.logic.LExecutor.*; @@ -32,6 +31,10 @@ public abstract class LStatement{ return read.size == 0 ? null : read.first(); } + public boolean hidden(){ + return false; + } + //protected methods are only for internal UI layout utilities protected Cell field(Table table, String value, Cons setter){ @@ -39,9 +42,9 @@ public abstract class LStatement{ .size(144f, 40f).pad(2f).color(table.color).addInputDialog(); } - protected void fields(Table table, String desc, String value, Cons setter){ + protected Cell fields(Table table, String desc, String value, Cons setter){ table.add(desc).padLeft(10).left(); - field(table, value, setter).width(85f).padRight(10).left(); + return field(table, value, setter).width(85f).padRight(10).left(); } protected void fields(Table table, String value, Cons setter){ @@ -88,8 +91,8 @@ public abstract class LStatement{ hitter.fillParent = true; hitter.tapped(hide); - Core.scene.add(hitter); + Core.scene.add(hitter); Core.scene.add(t); t.update(() -> { @@ -103,6 +106,8 @@ public abstract class LStatement{ b.localToStageCoordinates(Tmp.v1.set(b.getWidth()/2f, b.getHeight()/2f)); t.setPosition(Tmp.v1.x, Tmp.v1.y, Align.center); + if(t.getWidth() > Core.scene.getWidth()) t.setWidth(Core.graphics.getWidth()); + if(t.getHeight() > Core.scene.getHeight()) t.setHeight(Core.graphics.getHeight()); t.keepInStage(); }); t.actions(Actions.alpha(0), Actions.fadeIn(0.3f, Interp.fade)); diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 1a8abf221b..ba4d31e9a1 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -1,6 +1,7 @@ package mindustry.logic; import arc.func.*; +import arc.graphics.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; @@ -11,6 +12,7 @@ import mindustry.logic.LCanvas.*; import mindustry.logic.LExecutor.*; import mindustry.type.*; import mindustry.ui.*; +import mindustry.world.meta.*; import static mindustry.world.blocks.logic.LogicDisplay.*; @@ -154,39 +156,37 @@ public class LStatements{ s.setColor(table.color); switch(type){ - case clear: + case clear -> { fields(s, "r", x, v -> x = v); fields(s, "g", y, v -> y = v); fields(s, "b", p1, v -> p1 = v); - break; - case color: + } + case color -> { fields(s, "r", x, v -> x = v); fields(s, "g", y, v -> y = v); fields(s, "b", p1, v -> p1 = v); row(s); fields(s, "a", p2, v -> p2 = v); - break; - case stroke: + } + case stroke -> { s.add().width(4); fields(s, x, v -> x = v); - break; - case line: + } + case line -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); fields(s, "x2", p1, v -> p1 = v); fields(s, "y2", p2, v -> p2 = v); - break; - case rect: - case lineRect: + } + case rect, lineRect -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); fields(s, "width", p1, v -> p1 = v); fields(s, "height", p2, v -> p2 = v); - break; - case poly: - case linePoly: + } + case poly, linePoly -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); @@ -194,8 +194,8 @@ public class LStatements{ fields(s, "radius", p2, v -> p2 = v); row(s); fields(s, "rotation", p3, v -> p3 = v); - break; - case triangle: + } + case triangle -> { fields(s, "x", x, v -> x = v); fields(s, "y", y, v -> y = v); row(s); @@ -204,7 +204,7 @@ public class LStatements{ row(s); fields(s, "x3", p3, v -> p3 = v); fields(s, "y3", p4, v -> p4 = v); - break; + } } }).expand().left(); } @@ -348,9 +348,9 @@ public class LStatements{ //Q: why don't you just use arrays for this? //A: arrays aren't as easy to serialize so the code generator doesn't handle them int c = 0; - for(int i = 0; i < type.parameters.length; i++){ + for(int i = 0; i < type.params.length; i++){ - fields(table, type.parameters[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : v -> p4 = v); + fields(table, type.params[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : v -> p4 = v); if(++c % 2 == 0) row(table); } @@ -377,11 +377,13 @@ public class LStatements{ public void build(Table table){ table.defaults().left(); - table.add(" from "); + if(buildFrom()){ + table.add(" from "); - fields(table, radar, v -> radar = v); + fields(table, radar, v -> radar = v); - row(table); + row(table); + } for(int i = 0; i < 3; i++){ int fi = i; @@ -421,6 +423,10 @@ public class LStatements{ fields(table, output, v -> output = v); } + public boolean buildFrom(){ + return true; + } + @Override public LCategory category(){ return LCategory.blocks; @@ -633,6 +639,8 @@ public class LStatements{ @RegisterStatement("jump") public static class JumpStatement extends LStatement{ + private static Color last = new Color(); + public transient StatementElem dest; public int destIndex; @@ -644,19 +652,30 @@ public class LStatements{ public void build(Table table){ table.add("if ").padLeft(4); - field(table, value, str -> value = str); - - table.button(b -> { - b.label(() -> op.symbol); - b.clicked(() -> showSelect(b, ConditionOp.all, op, o -> op = o)); - }, Styles.logict, () -> {}).size(48f, 40f).pad(4f).color(table.color); - - field(table, compare, str -> compare = str); + last = table.color; + table.table(this::rebuild); table.add().growX(); table.add(new JumpButton(() -> dest, s -> dest = s)).size(30).right().padLeft(-8); } + void rebuild(Table table){ + table.clearChildren(); + table.setColor(last); + + if(op != ConditionOp.always) field(table, value, str -> value = str); + + table.button(b -> { + b.label(() -> op.symbol); + b.clicked(() -> showSelect(b, ConditionOp.all, op, o -> { + op = o; + rebuild(table); + })); + }, Styles.logict, () -> {}).size(op == ConditionOp.always ? 80f : 48f, 40f).pad(4f).color(table.color); + + if(op != ConditionOp.always) field(table, compare, str -> compare = str); + } + //elements need separate conversion logic @Override public void setupUI(){ @@ -682,4 +701,221 @@ public class LStatements{ return LCategory.control; } } + + @RegisterStatement("ubind") + public static class UnitBindStatement extends LStatement{ + public String type = "@mono"; + + @Override + public void build(Table table){ + table.add(" type "); + + TextField field = field(table, type, str -> type = str).get(); + + table.button(b -> { + b.image(Icon.pencilSmall); + b.clicked(() -> showSelectTable(b, (t, hide) -> { + t.row(); + t.table(i -> { + i.left(); + int c = 0; + for(UnitType item : Vars.content.units()){ + if(!item.unlockedNow() || item.isHidden()) continue; + i.button(new TextureRegionDrawable(item.icon(Cicon.small)), Styles.cleari, () -> { + type = "@" + item.name; + field.setText(type); + hide.run(); + }).size(40f).get().resizeImage(Cicon.small.size); + + if(++c % 6 == 0) i.row(); + } + }).colspan(3).width(240f).left(); + })); + }, Styles.logict, () -> {}).size(40f).padLeft(-2).color(table.color); + } + + @Override + public LCategory category(){ + return LCategory.units; + } + + @Override + public LInstruction build(LAssembler builder){ + return new UnitBindI(builder.var(type)); + } + } + + @RegisterStatement("ucontrol") + public static class UnitControlStatement extends LStatement{ + public LUnitControl type = LUnitControl.move; + public String p1 = "0", p2 = "0", p3 = "0", p4 = "0"; + + @Override + public void build(Table table){ + rebuild(table); + } + + void rebuild(Table table){ + table.clearChildren(); + + table.left(); + + table.add(" "); + + table.button(b -> { + b.label(() -> type.name()); + b.clicked(() -> showSelect(b, LUnitControl.all, type, t -> { + type = t; + rebuild(table); + }, 2, cell -> cell.size(120, 50))); + }, Styles.logict, () -> {}).size(120, 40).color(table.color).left().padLeft(2); + + row(table); + + //Q: why don't you just use arrays for this? + //A: arrays aren't as easy to serialize so the code generator doesn't handle them + int c = 0; + for(int i = 0; i < type.params.length; i++){ + + fields(table, type.params[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : v -> p4 = v).width(110f); + + if(++c % 2 == 0) row(table); + } + } + + @Override + public LCategory category(){ + return LCategory.units; + } + + @Override + public LInstruction build(LAssembler builder){ + return new UnitControlI(type, builder.var(p1), builder.var(p2), builder.var(p3), builder.var(p4)); + } + } + + @RegisterStatement("uradar") + public static class UnitRadarStatement extends RadarStatement{ + + @Override + public boolean buildFrom(){ + //do not build the "from" section + return false; + } + + @Override + public LCategory category(){ + return LCategory.units; + } + + @Override + public LInstruction build(LAssembler builder){ + return new RadarI(target1, target2, target3, sort, LExecutor.varUnit, builder.var(sortOrder), builder.var(output)); + } + } + + @RegisterStatement("ulocate") + public static class UnitLocateStatement extends LStatement{ + public LLocate locate = LLocate.building; + public BlockFlag flag = BlockFlag.core; + public String enemy = "true", ore = "@copper"; + public String outX = "outx", outY = "outy", outFound = "found"; + + @Override + public void build(Table table){ + rebuild(table); + } + + void rebuild(Table table){ + table.clearChildren(); + + table.add(" find ").left(); + + table.button(b -> { + b.label(() -> locate.name()); + b.clicked(() -> showSelect(b, LLocate.all, locate, t -> { + locate = t; + rebuild(table); + }, 2, cell -> cell.size(110, 50))); + }, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2); + + switch(locate){ + case building -> { + row(table); + table.add(" type ").left(); + table.button(b -> { + b.label(() -> flag.name()); + b.clicked(() -> showSelect(b, BlockFlag.all, flag, t -> flag = t, 2, cell -> cell.size(110, 50))); + }, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2); + row(table); + + table.add(" enemy ").left(); + + fields(table, enemy, str -> enemy = str); + + table.row(); + } + + case ore -> { + table.add(" ore ").left(); + table.table(ts -> { + ts.color.set(table.color); + + field(ts, ore, str -> ore = str); + + ts.button(b -> { + b.image(Icon.pencilSmall); + b.clicked(() -> showSelectTable(b, (t, hide) -> { + t.row(); + t.table(i -> { + i.left(); + int c = 0; + for(Item item : Vars.content.items()){ + if(!item.unlockedNow()) continue; + i.button(new TextureRegionDrawable(item.icon(Cicon.small)), Styles.cleari, () -> { + ore = "@" + item.name; + rebuild(table); + hide.run(); + }).size(40f).get().resizeImage(Cicon.small.size); + + if(++c % 6 == 0) i.row(); + } + }).colspan(3).width(240f).left(); + })); + }, Styles.logict, () -> {}).size(40f).padLeft(-2).color(table.color); + }); + + + table.row(); + } + + case spawn, damaged -> { + table.row(); + } + } + + table.add(" outX ").left(); + fields(table, outX, str -> outX = str); + + table.add(" outY ").left(); + fields(table, outY, str -> outY = str); + + row(table); + + table.add(" found ").left(); + fields(table, outFound, str -> outFound = str); + + + } + + @Override + public LCategory category(){ + return LCategory.units; + } + + @Override + public LInstruction build(LAssembler builder){ + return new UnitLocateI(locate, flag, builder.var(enemy), builder.var(ore), builder.var(outX), builder.var(outY), builder.var(outFound)); + } + } } diff --git a/core/src/mindustry/logic/LUnitControl.java b/core/src/mindustry/logic/LUnitControl.java new file mode 100644 index 0000000000..2166b00690 --- /dev/null +++ b/core/src/mindustry/logic/LUnitControl.java @@ -0,0 +1,27 @@ +package mindustry.logic; + +public enum LUnitControl{ + stop, + move("x", "y"), + approach("x", "y", "radius"), + boost("enable"), + pathfind(), + target("x", "y", "shoot"), + targetp("unit", "shoot"), + itemDrop("to", "amount"), + itemTake("from", "item", "amount"), + payDrop, + payTake("takeUnits"), + mine("x", "y"), + flag("value"), + build("x", "y", "block", "rotation"), + getBlock("x", "y", "result", "resRot"), + within("x", "y", "radius", "result"); + + public final String[] params; + public static final LUnitControl[] all = values(); + + LUnitControl(String... params){ + this.params = params; + } +} diff --git a/core/src/mindustry/logic/LogicDialog.java b/core/src/mindustry/logic/LogicDialog.java index fb97e5c4bc..44fcddd2c0 100644 --- a/core/src/mindustry/logic/LogicDialog.java +++ b/core/src/mindustry/logic/LogicDialog.java @@ -60,7 +60,7 @@ public class LogicDialog extends BaseDialog{ int i = 0; for(Prov prov : LogicIO.allStatements){ LStatement example = prov.get(); - if(example instanceof InvalidStatement) continue; + if(example instanceof InvalidStatement || example.hidden()) continue; TextButtonStyle style = new TextButtonStyle(Styles.cleart); style.fontColor = example.category().color; diff --git a/core/src/mindustry/logic/LogicOp.java b/core/src/mindustry/logic/LogicOp.java index 616ae5a464..40d02a8345 100644 --- a/core/src/mindustry/logic/LogicOp.java +++ b/core/src/mindustry/logic/LogicOp.java @@ -1,31 +1,34 @@ package mindustry.logic; import arc.math.*; +import arc.util.*; public enum LogicOp{ add("+", (a, b) -> a + b), sub("-", (a, b) -> a - b), mul("*", (a, b) -> a * b), div("/", (a, b) -> a / b), + idiv("//", (a, b) -> Math.floor(a / b)), mod("%", (a, b) -> a % b), - equal("==", (a, b) -> Math.abs(a - b) < 0.000001 ? 1 : 0), - notEqual("not", (a, b) -> Math.abs(a - b) < 0.000001 ? 0 : 1), + equal("==", (a, b) -> Math.abs(a - b) < 0.000001 ? 1 : 0, (a, b) -> Structs.eq(a, b) ? 1 : 0), + notEqual("not", (a, b) -> Math.abs(a - b) < 0.000001 ? 0 : 1, (a, b) -> !Structs.eq(a, b) ? 1 : 0), lessThan("<", (a, b) -> a < b ? 1 : 0), lessThanEq("<=", (a, b) -> a <= b ? 1 : 0), greaterThan(">", (a, b) -> a > b ? 1 : 0), greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0), pow("^", Math::pow), - shl(">>", (a, b) -> (int)a >> (int)b), - shr("<<", (a, b) -> (int)a << (int)b), - or("or", (a, b) -> (int)a | (int)b), - and("and", (a, b) -> (int)a & (int)b), - xor("xor", (a, b) -> (int)a ^ (int)b), + shl("<<", (a, b) -> (long)a << (long)b), + shr(">>", (a, b) -> (long)a >> (long)b), + or("or", (a, b) -> (long)a | (long)b), + and("and", (a, b) -> (long)a & (long)b), + xor("xor", (a, b) -> (long)a ^ (long)b), max("max", Math::max), min("min", Math::min), atan2("atan2", (x, y) -> Mathf.atan2((float)x, (float)y) * Mathf.radDeg), dst("dst", (x, y) -> Mathf.dst((float)x, (float)y)), + noise("noise", LExecutor.noise::rawNoise2D), - not("not", a -> ~(int)(a)), + not("not", a -> ~(long)(a)), abs("abs", a -> Math.abs(a)), log("log", Math::log), log10("log10", Math::log10), @@ -41,16 +44,22 @@ public enum LogicOp{ public static final LogicOp[] all = values(); + public final OpObjLambda2 objFunction2; public final OpLambda2 function2; public final OpLambda1 function1; public final boolean unary; public final String symbol; LogicOp(String symbol, OpLambda2 function){ + this(symbol, function, null); + } + + LogicOp(String symbol, OpLambda2 function, OpObjLambda2 objFunction){ this.symbol = symbol; this.function2 = function; this.function1 = null; this.unary = false; + this.objFunction2 = objFunction; } LogicOp(String symbol, OpLambda1 function){ @@ -58,6 +67,7 @@ public enum LogicOp{ this.function1 = function; this.function2 = null; this.unary = true; + this.objFunction2 = null; } @Override @@ -65,6 +75,10 @@ public enum LogicOp{ return symbol; } + interface OpObjLambda2{ + double get(Object a, Object b); + } + interface OpLambda2{ double get(double a, double b); } diff --git a/core/src/mindustry/logic/RadarSort.java b/core/src/mindustry/logic/RadarSort.java index 4164563f6d..50e553b70f 100644 --- a/core/src/mindustry/logic/RadarSort.java +++ b/core/src/mindustry/logic/RadarSort.java @@ -6,6 +6,8 @@ import mindustry.gen.*; public enum RadarSort{ distance((pos, other) -> -pos.dst2(other)), health((pos, other) -> other.health()), + shield((pos, other) -> other.shield()), + armor((pos, other) -> other.armor()), maxHealth((pos, other) -> other.maxHealth()); public final RadarSortFunc func; @@ -17,6 +19,6 @@ public enum RadarSort{ } public interface RadarSortFunc{ - float get(Position pos, Healthc other); + float get(Position pos, Unit other); } } diff --git a/core/src/mindustry/logic/RadarTarget.java b/core/src/mindustry/logic/RadarTarget.java index 5c82064fae..ddd7a1f368 100644 --- a/core/src/mindustry/logic/RadarTarget.java +++ b/core/src/mindustry/logic/RadarTarget.java @@ -8,7 +8,9 @@ public enum RadarTarget{ enemy((team, other) -> team != other.team), ally((team, other) -> team == other.team), player((team, other) -> other.isPlayer()), + attacker((pos, other) -> other.canShoot()), flying((team, other) -> other.isFlying()), + boss((team, other) -> other.isBoss()), ground((team, other) -> other.isGrounded()); public final RadarTargetFunc func; diff --git a/core/src/mindustry/logic/Senseable.java b/core/src/mindustry/logic/Senseable.java index 3f9e3798a4..6ae99afbfa 100644 --- a/core/src/mindustry/logic/Senseable.java +++ b/core/src/mindustry/logic/Senseable.java @@ -3,6 +3,12 @@ package mindustry.logic; import mindustry.ctype.*; public interface Senseable{ + Object noSensed = new Object(); + double sense(LAccess sensor); double sense(Content content); + + default Object senseObject(LAccess sensor){ + return noSensed; + } } diff --git a/core/src/mindustry/maps/Map.java b/core/src/mindustry/maps/Map.java index e47e369140..0fdc818139 100644 --- a/core/src/mindustry/maps/Map.java +++ b/core/src/mindustry/maps/Map.java @@ -1,11 +1,10 @@ package mindustry.maps; import arc.*; -import arc.struct.*; import arc.files.*; import arc.graphics.*; +import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -99,7 +98,9 @@ public class Map implements Comparable, Publishable{ public Rules rules(Rules base){ try{ - Rules result = JsonIO.read(Rules.class, base, tags.get("rules", "{}")); + //this replacement is a MASSIVE hack but it fixes some incorrect overwriting of team-specific rules. + //may need to be tweaked later + Rules result = JsonIO.read(Rules.class, base, tags.get("rules", "{}").replace("teams:{2:{infiniteAmmo:true}},", "")); if(result.spawns.isEmpty()) result.spawns = Vars.defaultWaves.get(); return result; }catch(Exception e){ @@ -130,7 +131,7 @@ public class Map implements Comparable, Publishable{ } public String tag(String name){ - return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name) : Core.bundle.get("unknown"); + return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name) : Core.bundle.get("unknown", "unknown"); } public boolean hasTag(String name){ @@ -146,7 +147,7 @@ public class Map implements Comparable, Publishable{ public void addSteamID(String id){ tags.put("steamid", id); - ui.editor.editor.getTags().put("steamid", id); + ui.editor.editor.tags.put("steamid", id); try{ ui.editor.save(); }catch(Exception e){ @@ -159,7 +160,7 @@ public class Map implements Comparable, Publishable{ public void removeSteamID(){ tags.remove("steamid"); - ui.editor.editor.getTags().remove("steamid"); + ui.editor.editor.tags.remove("steamid"); try{ ui.editor.save(); }catch(Exception e){ @@ -203,7 +204,7 @@ public class Map implements Comparable, Publishable{ @Override public boolean prePublish(){ tags.put("author", player.name); - ui.editor.editor.getTags().put("author", tags.get("author")); + ui.editor.editor.tags.put("author", tags.get("author")); ui.editor.save(); return true; diff --git a/core/src/mindustry/maps/MapPreviewLoader.java b/core/src/mindustry/maps/MapPreviewLoader.java index ebc69eeae4..6453c6f0b1 100644 --- a/core/src/mindustry/maps/MapPreviewLoader.java +++ b/core/src/mindustry/maps/MapPreviewLoader.java @@ -3,12 +3,12 @@ package mindustry.maps; import arc.assets.*; import arc.assets.loaders.*; import arc.assets.loaders.resolvers.*; -import arc.struct.*; import arc.files.*; import arc.graphics.*; +import arc.struct.*; import arc.util.*; import mindustry.*; -import mindustry.ctype.Content; +import mindustry.ctype.*; public class MapPreviewLoader extends TextureLoader{ diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java index 137b91bb36..7741f0942f 100644 --- a/core/src/mindustry/maps/Maps.java +++ b/core/src/mindustry/maps/Maps.java @@ -8,7 +8,6 @@ import arc.func.*; import arc.graphics.*; import arc.struct.IntSet.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.async.*; import arc.util.io.*; @@ -59,6 +58,7 @@ public class Maps{ /** @return the next map to shuffle to. May be null, in which case the server should be stopped. */ public @Nullable Map getNextMap(Gamemode mode, @Nullable Map previous){ + if(shuffler != null) return shuffler.next(mode, previous); return shuffleMode.next(mode, previous); } @@ -292,25 +292,29 @@ public class Maps{ if(str == null || str.isEmpty()){ //create default filters list Seq filters = Seq.with( - new ScatterFilter(){{ - flooronto = Blocks.stone; - block = Blocks.rock; - }}, - new ScatterFilter(){{ - flooronto = Blocks.shale; - block = Blocks.shaleBoulder; - }}, new ScatterFilter(){{ flooronto = Blocks.snow; - block = Blocks.snowrock; + block = Blocks.snowBoulder; }}, new ScatterFilter(){{ flooronto = Blocks.ice; - block = Blocks.snowrock; + block = Blocks.snowBoulder; }}, new ScatterFilter(){{ flooronto = Blocks.sand; block = Blocks.sandBoulder; + }}, + new ScatterFilter(){{ + flooronto = Blocks.dacite; + block = Blocks.daciteBoulder; + }}, + new ScatterFilter(){{ + flooronto = Blocks.stone; + block = Blocks.boulder; + }}, + new ScatterFilter(){{ + flooronto = Blocks.shale; + block = Blocks.shaleBoulder; }} ); diff --git a/core/src/mindustry/maps/filters/CoreSpawnFilter.java b/core/src/mindustry/maps/filters/CoreSpawnFilter.java index fa3b270d4d..6aa2db744b 100644 --- a/core/src/mindustry/maps/filters/CoreSpawnFilter.java +++ b/core/src/mindustry/maps/filters/CoreSpawnFilter.java @@ -5,7 +5,7 @@ import arc.util.*; import mindustry.world.*; import mindustry.world.blocks.storage.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; /** Selects X spawns from the core spawn pool.*/ public class CoreSpawnFilter extends GenerateFilter{ diff --git a/core/src/mindustry/maps/filters/DistortFilter.java b/core/src/mindustry/maps/filters/DistortFilter.java index 0d3691f1f7..32c8f18a14 100644 --- a/core/src/mindustry/maps/filters/DistortFilter.java +++ b/core/src/mindustry/maps/filters/DistortFilter.java @@ -3,7 +3,6 @@ package mindustry.maps.filters; import arc.util.*; import mindustry.maps.filters.FilterOption.*; import mindustry.world.*; -import mindustry.world.blocks.environment.*; public class DistortFilter extends GenerateFilter{ float scl = 40, mag = 5; @@ -27,6 +26,6 @@ public class DistortFilter extends GenerateFilter{ in.floor = tile.floor(); if(!tile.block().synthetic() && !in.block.synthetic()) in.block = tile.block(); - if(!((Floor)in.floor).isLiquid) in.ore = tile.overlay(); + in.ore = tile.overlay(); } } diff --git a/core/src/mindustry/maps/filters/FilterOption.java b/core/src/mindustry/maps/filters/FilterOption.java index 1124c195b8..dedebfe713 100644 --- a/core/src/mindustry/maps/filters/FilterOption.java +++ b/core/src/mindustry/maps/filters/FilterOption.java @@ -17,13 +17,13 @@ import mindustry.world.blocks.environment.*; 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(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 floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)); + public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)) && b.inEditor; + public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))); + public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(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(Cicon.full))) && b.inEditor; 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 static final Boolf anyOptional = b -> (floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air) && b.inEditor; public abstract void build(Table table); diff --git a/core/src/mindustry/maps/filters/GenerateFilter.java b/core/src/mindustry/maps/filters/GenerateFilter.java index 6d0f48d121..c884d5296e 100644 --- a/core/src/mindustry/maps/filters/GenerateFilter.java +++ b/core/src/mindustry/maps/filters/GenerateFilter.java @@ -20,7 +20,7 @@ public abstract class GenerateFilter{ apply(); tile.setFloor(in.floor.asFloor()); - tile.setOverlay(in.floor.asFloor().isLiquid ? Blocks.air : in.ore); + tile.setOverlay(!in.floor.asFloor().hasSurface() ? Blocks.air : in.ore); if(!tile.block().synthetic() && !in.block.synthetic()){ tile.setBlock(in.block); diff --git a/core/src/mindustry/maps/filters/MedianFilter.java b/core/src/mindustry/maps/filters/MedianFilter.java index c70bf6d71b..78a4df65d4 100644 --- a/core/src/mindustry/maps/filters/MedianFilter.java +++ b/core/src/mindustry/maps/filters/MedianFilter.java @@ -1,12 +1,12 @@ package mindustry.maps.filters; -import arc.struct.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import mindustry.maps.filters.FilterOption.*; import mindustry.world.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class MedianFilter extends GenerateFilter{ float radius = 2; diff --git a/core/src/mindustry/maps/filters/NoiseFilter.java b/core/src/mindustry/maps/filters/NoiseFilter.java index 8635966486..857be64369 100644 --- a/core/src/mindustry/maps/filters/NoiseFilter.java +++ b/core/src/mindustry/maps/filters/NoiseFilter.java @@ -1,17 +1,15 @@ package mindustry.maps.filters; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.maps.filters.FilterOption.BlockOption; -import mindustry.maps.filters.FilterOption.SliderOption; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; -import static mindustry.maps.filters.FilterOption.floorsOnly; -import static mindustry.maps.filters.FilterOption.wallsOnly; +import static mindustry.maps.filters.FilterOption.*; public class NoiseFilter extends GenerateFilter{ float scl = 40, threshold = 0.5f, octaves = 3f, falloff = 0.5f; - Block floor = Blocks.stone, block = Blocks.rocks; + Block floor = Blocks.stone, block = Blocks.stoneWall; @Override public FilterOption[] options(){ diff --git a/core/src/mindustry/maps/filters/OreFilter.java b/core/src/mindustry/maps/filters/OreFilter.java index 91c989e151..491bbf0123 100644 --- a/core/src/mindustry/maps/filters/OreFilter.java +++ b/core/src/mindustry/maps/filters/OreFilter.java @@ -1,12 +1,11 @@ package mindustry.maps.filters; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.maps.filters.FilterOption.SliderOption; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; -import static mindustry.maps.filters.FilterOption.BlockOption; -import static mindustry.maps.filters.FilterOption.oresOnly; +import static mindustry.maps.filters.FilterOption.*; public class OreFilter extends GenerateFilter{ public float scl = 23, threshold = 0.81f, octaves = 2f, falloff = 0.3f; diff --git a/core/src/mindustry/maps/filters/OreMedianFilter.java b/core/src/mindustry/maps/filters/OreMedianFilter.java index 43c589d586..c9fd8d91c6 100644 --- a/core/src/mindustry/maps/filters/OreMedianFilter.java +++ b/core/src/mindustry/maps/filters/OreMedianFilter.java @@ -1,7 +1,7 @@ package mindustry.maps.filters; -import arc.struct.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.content.*; diff --git a/core/src/mindustry/maps/filters/RiverNoiseFilter.java b/core/src/mindustry/maps/filters/RiverNoiseFilter.java index 79755e1e8e..28ffd1a714 100644 --- a/core/src/mindustry/maps/filters/RiverNoiseFilter.java +++ b/core/src/mindustry/maps/filters/RiverNoiseFilter.java @@ -1,17 +1,15 @@ package mindustry.maps.filters; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.maps.filters.FilterOption.BlockOption; -import mindustry.maps.filters.FilterOption.SliderOption; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; -import static mindustry.maps.filters.FilterOption.floorsOnly; -import static mindustry.maps.filters.FilterOption.wallsOnly; +import static mindustry.maps.filters.FilterOption.*; public class RiverNoiseFilter extends GenerateFilter{ float scl = 40, threshold = 0f, threshold2 = 0.1f; - Block floor = Blocks.water, floor2 = Blocks.deepwater, block = Blocks.sandRocks; + Block floor = Blocks.water, floor2 = Blocks.deepwater, block = Blocks.sandWall; @Override public FilterOption[] options(){ diff --git a/core/src/mindustry/maps/filters/ScatterFilter.java b/core/src/mindustry/maps/filters/ScatterFilter.java index 8866130baa..4b90275b1f 100644 --- a/core/src/mindustry/maps/filters/ScatterFilter.java +++ b/core/src/mindustry/maps/filters/ScatterFilter.java @@ -1,8 +1,8 @@ package mindustry.maps.filters; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.world.*; import static mindustry.maps.filters.FilterOption.*; diff --git a/core/src/mindustry/maps/filters/TerrainFilter.java b/core/src/mindustry/maps/filters/TerrainFilter.java index d525f74d14..cc0ba82b54 100644 --- a/core/src/mindustry/maps/filters/TerrainFilter.java +++ b/core/src/mindustry/maps/filters/TerrainFilter.java @@ -1,18 +1,16 @@ package mindustry.maps.filters; -import arc.math.Mathf; +import arc.math.*; import arc.util.*; -import mindustry.content.Blocks; -import mindustry.maps.filters.FilterOption.BlockOption; -import mindustry.maps.filters.FilterOption.SliderOption; -import mindustry.world.Block; +import mindustry.content.*; +import mindustry.maps.filters.FilterOption.*; +import mindustry.world.*; -import static mindustry.maps.filters.FilterOption.floorsOnly; -import static mindustry.maps.filters.FilterOption.wallsOnly; +import static mindustry.maps.filters.FilterOption.*; public class TerrainFilter extends GenerateFilter{ float scl = 40, threshold = 0.9f, octaves = 3f, falloff = 0.5f, magnitude = 1f, circleScl = 2.1f; - Block floor = Blocks.stone, block = Blocks.rocks; + Block floor = Blocks.stone, block = Blocks.stoneWall; @Override public FilterOption[] options(){ diff --git a/core/src/mindustry/maps/generators/BaseGenerator.java b/core/src/mindustry/maps/generators/BaseGenerator.java index 4c416cc1b8..3a28078f74 100644 --- a/core/src/mindustry/maps/generators/BaseGenerator.java +++ b/core/src/mindustry/maps/generators/BaseGenerator.java @@ -4,6 +4,7 @@ import arc.func.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; +import arc.util.*; import mindustry.ai.BaseRegistry.*; import mindustry.content.*; import mindustry.game.*; @@ -12,7 +13,6 @@ import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.defense.*; -import mindustry.world.blocks.environment.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.production.*; import mindustry.world.meta.*; @@ -26,8 +26,6 @@ public class BaseGenerator{ private Tiles tiles; private Team team; - private ObjectMap ores = new ObjectMap<>(); - private ObjectMap oreFloors = new ObjectMap<>(); private Seq cores; public void generate(Tiles tiles, Seq cores, Tile spawn, Team team, Sector sector, float difficulty){ @@ -40,14 +38,6 @@ public class BaseGenerator{ Mathf.rand.setSeed(sector.id); - for(Block block : content.blocks()){ - if(block instanceof OreBlock && block.asFloor().itemDrop != null){ - ores.put(block.asFloor().itemDrop, (OreBlock)block); - }else if(block.isFloor() && block.asFloor().itemDrop != null && !oreFloors.containsKey(block.asFloor().itemDrop)){ - oreFloors.put(block.asFloor().itemDrop, block.asFloor()); - } - } - //TODO limit base size float costBudget = 1000; @@ -70,12 +60,12 @@ public class BaseGenerator{ for(Tile tile : cores){ tile.clearOverlay(); - Schematics.placeLoadout(coreschem.schematic, tile.x, tile.y, team, coreschem.required instanceof Item ? ores.get((Item)coreschem.required) : Blocks.oreCopper); + Schematics.placeLoadout(coreschem.schematic, tile.x, tile.y, team, coreschem.required instanceof Item ? bases.ores.get((Item)coreschem.required) : Blocks.oreCopper); //fill core with every type of item (even non-material) Building entity = tile.build; for(Item item : content.items()){ - entity.items.add(item, entity.block().itemCapacity); + entity.items.add(item, entity.block.itemCapacity); } } @@ -87,10 +77,10 @@ public class BaseGenerator{ || (tile.floor().liquidDrop != null && Mathf.chance(nonResourceChance * 2))) && Mathf.chance(resourceChance)){ Seq parts = bases.forResource(tile.drop() != null ? tile.drop() : tile.floor().liquidDrop); if(!parts.isEmpty()){ - tryPlace(parts.getFrac(bracket + Mathf.range(bracketRange)), tile.x, tile.y); + tryPlace(parts.getFrac(bracket + Mathf.range(bracketRange)), tile.x, tile.y, team); } }else if(Mathf.chance(nonResourceChance)){ - tryPlace(bases.parts.getFrac(bracket + Mathf.range(bracketRange)), tile.x, tile.y); + tryPlace(bases.parts.getFrac(bracket + Mathf.range(bracketRange)), tile.x, tile.y, team); } }); @@ -164,7 +154,19 @@ public class BaseGenerator{ core.circle(range, (x, y) -> cons.get(tiles.getn(x, y))); } - boolean tryPlace(BasePart part, int x, int y){ + /** + * Tries to place a base part at a certain location with a certain team. + * @return success state + * */ + public static boolean tryPlace(BasePart part, int x, int y, Team team){ + return tryPlace(part, x, y, team, null); + } + + /** + * Tries to place a base part at a certain location with a certain team. + * @return success state + * */ + public static boolean tryPlace(BasePart part, int x, int y, Team team, @Nullable Intc2 posc){ int rotation = Mathf.range(2); axis.set((int)(part.schematic.width / 2f), (int)(part.schematic.height / 2f)); Schematic result = Schematics.rotate(part.schematic, rotation); @@ -180,21 +182,24 @@ public class BaseGenerator{ if(isTaken(tile.block, realX, realY)){ return false; } + + if(posc != null){ + posc.get(realX, realY); + } } - if(part.required instanceof Item){ - Item item = (Item)part.required; + if(part.required instanceof Item item){ for(Stile tile : result.tiles){ if(tile.block instanceof Drill){ tile.block.iterateTaken(tile.x + cx, tile.y + cy, (ex, ey) -> { - if(!tiles.getn(ex, ey).floor().isLiquid){ - set(tiles.getn(ex, ey), item); + if(world.tiles.getn(ex, ey).floor().hasSurface()){ + set(world.tiles.getn(ex, ey), item); } - Tile rand = tiles.getc(ex + Mathf.range(1), ey + Mathf.range(1)); - if(!rand.floor().isLiquid){ + Tile rand = world.tiles.getc(ex + Mathf.range(1), ey + Mathf.range(1)); + if(rand.floor().hasSurface()){ //random ores nearby to make it look more natural set(rand, item); } @@ -206,8 +211,7 @@ public class BaseGenerator{ Schematics.place(result, cx + result.width/2, cy + result.height/2, team); //fill drills with items after placing - if(part.required instanceof Item){ - Item item = (Item)part.required; + if(part.required instanceof Item item){ for(Stile tile : result.tiles){ if(tile.block instanceof Drill){ @@ -223,15 +227,15 @@ public class BaseGenerator{ return true; } - void set(Tile tile, Item item){ - if(ores.containsKey(item)){ - tile.setOverlay(ores.get(item)); - }else if(oreFloors.containsKey(item)){ - tile.setFloor(oreFloors.get(item)); + static void set(Tile tile, Item item){ + if(bases.ores.containsKey(item)){ + tile.setOverlay(bases.ores.get(item)); + }else if(bases.oreFloors.containsKey(item)){ + tile.setFloor(bases.oreFloors.get(item)); } } - boolean isTaken(Block block, int x, int y){ + static boolean isTaken(Block block, int x, int y){ int offsetx = -(block.size - 1) / 2; int offsety = -(block.size - 1) / 2; int pad = 1; @@ -247,8 +251,8 @@ public class BaseGenerator{ return false; } - boolean overlaps(int x, int y){ - Tile tile = tiles.get(x, y); + static boolean overlaps(int x, int y){ + Tile tile = world.tiles.get(x, y); return tile == null || !tile.block().alwaysReplace || world.getDarkness(x, y) > 0; } diff --git a/core/src/mindustry/maps/generators/BasicGenerator.java b/core/src/mindustry/maps/generators/BasicGenerator.java index 542f84cf29..e20350e6d3 100644 --- a/core/src/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/mindustry/maps/generators/BasicGenerator.java @@ -69,7 +69,7 @@ public abstract class BasicGenerator implements WorldGenerator{ public void ores(Seq ores){ pass((x, y) -> { - if(floor.asFloor().isLiquid) return; + if(!floor.asFloor().hasSurface()) return; int offsetX = x - 4, offsetY = y + 23; for(int i = ores.size - 1; i >= 0; i--){ @@ -124,7 +124,7 @@ public abstract class BasicGenerator implements WorldGenerator{ Block[] blocks = {Blocks.darkPanel3}; int secSize = 20; pass((x, y) -> { - if(floor.asFloor().isLiquid) return; + if(!floor.asFloor().hasSurface()) return; int mx = x % secSize, my = y % secSize; int sclx = x / secSize, scly = y / secSize; diff --git a/core/src/mindustry/maps/generators/FileMapGenerator.java b/core/src/mindustry/maps/generators/FileMapGenerator.java index e0b8bf3946..dab00370ed 100644 --- a/core/src/mindustry/maps/generators/FileMapGenerator.java +++ b/core/src/mindustry/maps/generators/FileMapGenerator.java @@ -3,7 +3,6 @@ package mindustry.maps.generators; import arc.math.*; import arc.math.geom.*; import mindustry.content.*; -import mindustry.ctype.*; import mindustry.game.*; import mindustry.io.*; import mindustry.maps.*; @@ -29,12 +28,13 @@ public class FileMapGenerator implements WorldGenerator{ world.setGenerating(true); tiles = world.tiles; + Item[] items = {Items.blastCompound, Items.pyratite, Items.copper, Items.thorium, Items.copper, Items.lead}; for(Tile tile : tiles){ if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock) && state.hasSector()){ - for(Content content : state.getSector().data.resources){ - if(content instanceof Item && Mathf.chance(0.3)){ - tile.build.items.add((Item)content, Math.min(Mathf.random(500), tile.block().itemCapacity)); + for(Item content : items){ + if(Mathf.chance(0.2)){ + tile.build.items.add(content, Math.min(Mathf.random(500), tile.block().itemCapacity)); } } } diff --git a/core/src/mindustry/maps/generators/PlanetGenerator.java b/core/src/mindustry/maps/generators/PlanetGenerator.java index 2ce0bbae27..2f0bd37058 100644 --- a/core/src/mindustry/maps/generators/PlanetGenerator.java +++ b/core/src/mindustry/maps/generators/PlanetGenerator.java @@ -1,14 +1,15 @@ package mindustry.maps.generators; import arc.math.geom.*; +import arc.struct.*; import arc.util.noise.*; import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.type.*; -import mindustry.type.Sector.*; import mindustry.world.*; public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{ + protected IntSeq ints = new IntSeq(); protected Sector sector; /** Should generate sector bases for a planet. */ @@ -24,7 +25,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe if(noise < 0.15){ for(Ptile other : tile.tiles){ - if(sector.planet.getSector(other).is(SectorAttribute.base)){ + if(sector.planet.getSector(other).generateEnemyBase){ any = false; break; } @@ -32,7 +33,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe } if(any){ - sector.data.attributes |= (1 << SectorAttribute.base.ordinal()); + sector.generateEnemyBase = true; } } diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index 851b7e25cb..ee2f6b437c 100644 --- a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java @@ -7,6 +7,7 @@ import arc.struct.*; import arc.util.*; import arc.util.noise.*; import mindustry.ai.*; +import mindustry.ai.BaseRegistry.*; import mindustry.content.*; import mindustry.game.*; import mindustry.maps.generators.*; @@ -21,17 +22,18 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ float scl = 5f; float waterOffset = 0.07f; + //TODO fix sand near snow (sector 173) Block[][] arr = { {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.darksandTaintedWater, Blocks.stone, Blocks.stone}, {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.darksandTaintedWater, Blocks.stone, Blocks.stone, Blocks.stone}, {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.sand, Blocks.salt, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.darksandTaintedWater, Blocks.stone, Blocks.stone, Blocks.stone}, {Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.salt, Blocks.salt, Blocks.salt, Blocks.sand, Blocks.stone, Blocks.stone, Blocks.stone, Blocks.snow, Blocks.iceSnow, Blocks.ice}, - {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.salt, Blocks.sand, Blocks.sand, Blocks.ignarock, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice}, + {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.salt, Blocks.sand, Blocks.sand, Blocks.basalt, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice}, {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.moss, Blocks.iceSnow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.snow, Blocks.ice}, - {Blocks.deepwater, Blocks.sandWater, Blocks.sand, Blocks.sand, Blocks.moss, Blocks.moss, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.snow, Blocks.ice}, - {Blocks.taintedWater, Blocks.darksandTaintedWater, Blocks.darksand, Blocks.darksand, Blocks.ignarock, Blocks.moss, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.snow, Blocks.ice, Blocks.ice}, - {Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.moss, Blocks.sporeMoss, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice}, + {Blocks.deepwater, Blocks.sandWater, Blocks.sand, Blocks.sand, Blocks.moss, Blocks.moss, Blocks.snow, Blocks.basalt, Blocks.basalt, Blocks.basalt, Blocks.ice, Blocks.snow, Blocks.ice}, + {Blocks.taintedWater, Blocks.darksandTaintedWater, Blocks.darksand, Blocks.darksand, Blocks.basalt, Blocks.moss, Blocks.basalt, Blocks.hotrock, Blocks.basalt, Blocks.ice, Blocks.snow, Blocks.ice, Blocks.ice}, + {Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.darksand, Blocks.moss, Blocks.sporeMoss, Blocks.snow, Blocks.basalt, Blocks.basalt, Blocks.ice, Blocks.snow, Blocks.ice, Blocks.ice}, {Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.sporeMoss, Blocks.ice, Blocks.ice, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice}, {Blocks.taintedWater, Blocks.darksandTaintedWater, Blocks.darksand, Blocks.sporeMoss, Blocks.sporeMoss, Blocks.ice, Blocks.ice, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice}, {Blocks.darksandTaintedWater, Blocks.darksandTaintedWater, Blocks.darksand, Blocks.sporeMoss, Blocks.moss, Blocks.sporeMoss, Blocks.iceSnow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice, Blocks.ice}, @@ -143,7 +145,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ float constraint = 1.3f; float radius = width / 2f / Mathf.sqrt3; int rooms = rand.random(2, 5); - Seq array = new Seq<>(); + Seq roomseq = new Seq<>(); for(int i = 0; i < rooms; i++){ Tmp.v1.trns(rand.random(360f), rand.random(radius / constraint)); @@ -151,7 +153,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ float ry = (height/2f + Tmp.v1.y); float maxrad = radius - Tmp.v1.len(); float rrad = Math.min(rand.random(9f, maxrad / 2f), 30f); - array.add(new Room((int)rx, (int)ry, (int)rrad)); + roomseq.add(new Room((int)rx, (int)ry, (int)rrad)); } //check positions on the map to place the player spawn. this needs to be in the corner of the map @@ -180,13 +182,13 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ } if(waterTiles <= 4 || (i + angleStep >= 360)){ - array.add(spawn = new Room(cx, cy, rand.random(8, 15))); + roomseq.add(spawn = new Room(cx, cy, rand.random(8, 15))); for(int j = 0; j < enemySpawns; j++){ float enemyOffset = rand.range(60f); Tmp.v1.set(cx - width/2, cy - height/2).rotate(180f + enemyOffset).add(width/2, height/2); Room espawn = new Room((int)Tmp.v1.x, (int)Tmp.v1.y, rand.random(8, 15)); - array.add(espawn); + roomseq.add(espawn); enemies.add(espawn); } @@ -194,16 +196,16 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ } } - for(Room room : array){ + for(Room room : roomseq){ erase(room.x, room.y, room.radius); } int connections = rand.random(Math.max(rooms - 1, 1), rooms + 3); for(int i = 0; i < connections; i++){ - array.random(rand).connect(array.random(rand)); + roomseq.random(rand).connect(roomseq.random(rand)); } - for(Room room : array){ + for(Room room : roomseq){ spawn.connect(room); } @@ -236,7 +238,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ } pass((x, y) -> { - if(floor.asFloor().isLiquid) return; + if(!floor.asFloor().hasSurface()) return; int offsetX = x - 4, offsetY = y + 23; for(int i = ores.size - 1; i >= 0; i--){ @@ -250,10 +252,6 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ } }); - for(Room espawn : enemies){ - tiles.getn(espawn.x, espawn.y).setOverlay(Blocks.spawn); - } - trimDark(); median(2); @@ -261,50 +259,168 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ tech(); pass((x, y) -> { - if(floor == Blocks.sporeMoss && rand.chance(0.9)){ - floor = Blocks.moss; - } - - //random stuff - - for(int i = 0; i < 4; i++){ - Tile near = world.tile(x + Geometry.d4[i].x, y + Geometry.d4[i].y); - if(near != null && near.block() != Blocks.air){ - return; + //random moss + if(floor == Blocks.sporeMoss){ + if(Math.abs(0.5f - noise(x - 90, y, 4, 0.8, 65)) > 0.02){ + floor = Blocks.moss; } } - if(rand.chance(0.01) && !floor.asFloor().isLiquid && block == Blocks.air){ - block = dec.get(floor, floor.asFloor().decoration); + //tar + if(floor == Blocks.darksand){ + if(Math.abs(0.5f - noise(x - 40, y, 2, 0.7, 80)) > 0.25f && + Math.abs(0.5f - noise(x, y + sector.id*10, 1, 1, 60)) > 0.41f && !(roomseq.contains(r -> Mathf.within(x, y, r.x, r.y, 15)))){ + floor = Blocks.tar; + ore = Blocks.air; + } + } + + //hotrock tweaks + if(floor == Blocks.hotrock){ + if(rand.chance(0.3)){ + floor = Blocks.basalt; + }else{ + ore = Blocks.air; + boolean all = true; + for(Point2 p : Geometry.d4){ + Tile other = tiles.get(x + p.x, y + p.y); + if(other == null || (other.floor() != Blocks.hotrock && other.floor() != Blocks.magmarock)){ + all = false; + } + } + if(all){ + floor = Blocks.magmarock; + } + } + } + + if(rand.chance(0.0075)){ + //random spore trees + boolean any = false; + boolean all = true; + for(Point2 p : Geometry.d4){ + Tile other = tiles.get(x + p.x, y + p.y); + if(other != null && other.block() == Blocks.air){ + any = true; + }else{ + all = false; + } + } + if(any && ((block == Blocks.snowWall || block == Blocks.iceWall) || (all && block == Blocks.air && floor == Blocks.snow && rand.chance(0.03)))){ + block = rand.chance(0.5) ? Blocks.whiteTree : Blocks.whiteTreeDead; + } + } + + //random stuff + dec: { + for(int i = 0; i < 4; i++){ + Tile near = world.tile(x + Geometry.d4[i].x, y + Geometry.d4[i].y); + if(near != null && near.block() != Blocks.air){ + break dec; + } + } + + if(rand.chance(0.01) && floor.asFloor().hasSurface() && block == Blocks.air){ + block = dec.get(floor, floor.asFloor().decoration); + } } }); + float difficulty = sector.baseCoverage; + ints.clear(); + ints.ensureCapacity(width * height / 4); + + int ruinCount = rand.random(-2, 4); + if(ruinCount > 0){ + int padding = 25; + + //create list of potential positions + for(int x = padding; x < width - padding; x++){ + for(int y = padding; y < height - padding; y++){ + Tile tile = tiles.getn(x, y); + if(!tile.solid() && (tile.drop() != null || tile.floor().liquidDrop != null)){ + ints.add(tile.pos()); + } + } + } + + ints.shuffle(rand); + + int placed = 0; + float diffRange = 0.4f; + //try each position + for(int i = 0; i < ints.size && placed < ruinCount; i++){ + int val = ints.items[i]; + int x = Point2.x(val), y = Point2.y(val); + + //do not overwrite player spawn + if(Mathf.within(x, y, spawn.x, spawn.y, 18f)){ + continue; + } + + float range = difficulty + rand.random(diffRange); + + Tile tile = tiles.getn(x, y); + BasePart part = null; + if(tile.overlay().itemDrop != null){ + part = bases.forResource(tile.drop()).getFrac(range); + }else if(tile.floor().liquidDrop != null && rand.chance(0.05)){ + part = bases.forResource(tile.floor().liquidDrop).getFrac(range); + }else if(rand.chance(0.05)){ //ore-less parts are less likely to occur. + part = bases.parts.getFrac(range); + } + + //actually place the part + if(part != null && BaseGenerator.tryPlace(part, x, y, Team.derelict, (cx, cy) -> { + Tile other = tiles.getn(cx, cy); + other.setOverlay(Blocks.oreScrap); + for(int j = 1; j <= 2; j++){ + for(Point2 p : Geometry.d8){ + Tile t = tiles.get(cx + p.x*j, cy + p.y*j); + if(t != null && t.floor().hasSurface() && rand.chance(j == 1 ? 0.4 : 0.2)){ + t.setOverlay(Blocks.oreScrap); + } + } + } + })){ + placed ++; + + int debrisRadius = Math.max(part.schematic.width, part.schematic.height)/2 + 3; + Geometry.circle(x, y, tiles.width, tiles.height, debrisRadius, (cx, cy) -> { + float dst = Mathf.dst(cx, cy, x, y); + float removeChance = Mathf.lerp(0.05f, 0.5f, dst / debrisRadius); + + Tile other = tiles.getn(cx, cy); + if(other.build != null && other.isCenter()){ + if(other.team() == Team.derelict && rand.chance(removeChance)){ + other.remove(); + }else if(rand.chance(0.5)){ + other.build.health = other.build.health - rand.random(other.build.health * 0.9f); + } + } + }); + } + } + } + Schematics.placeLaunchLoadout(spawn.x, spawn.y); - float difficulty = sector.baseCoverage; + for(Room espawn : enemies){ + tiles.getn(espawn.x, espawn.y).setOverlay(Blocks.spawn); + } if(sector.hasEnemyBase()){ basegen.generate(tiles, enemies.map(r -> tiles.getn(r.x, r.y)), tiles.get(spawn.x, spawn.y), state.rules.waveTeam, sector, difficulty); state.rules.attackMode = true; }else{ - state.rules.winWave = 15 * (int)Math.max(difficulty * 5, 1); + state.rules.winWave = 15 * (int)Math.max(difficulty * 10, 1); } state.rules.waves = true; //TODO better waves - state.rules.spawns = defaultWaves.get(); - - float waveScaling = 1f + difficulty*2; - - //scale up the spawning base on difficulty (this is just for testing) - for(SpawnGroup group : state.rules.spawns){ - group.unitAmount *= waveScaling; - if(group.unitScaling != SpawnGroup.never){ - group.unitScaling /= waveScaling; - } - } + state.rules.spawns = DefaultWaves.generate(difficulty); } @Override diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index b63a0b17dc..b9c119ee32 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -6,9 +6,9 @@ import arc.audio.*; import arc.files.*; import arc.func.*; import arc.graphics.*; +import arc.graphics.g2d.*; import arc.mock.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.serialization.*; import arc.util.serialization.Json.*; @@ -26,6 +26,8 @@ import mindustry.mod.Mods.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.*; +import mindustry.world.blocks.units.*; +import mindustry.world.blocks.units.UnitFactory.*; import mindustry.world.consumers.*; import mindustry.world.draw.*; import mindustry.world.meta.*; @@ -36,8 +38,9 @@ import java.lang.reflect.*; public class ContentParser{ private static final boolean ignoreUnknownFields = true; ObjectMap, ContentType> contentTypes = new ObjectMap<>(); + ObjectSet> implicitNullable = ObjectSet.with(TextureRegion.class, TextureRegion[].class, TextureRegion[][].class); - ObjectMap, FieldParser> classParsers = new ObjectMap, FieldParser>(){{ + ObjectMap, FieldParser> classParsers = new ObjectMap<>(){{ put(Effect.class, (type, data) -> field(Fx.class, data)); put(Schematic.class, (type, data) -> { Object result = fieldOpt(Loadouts.class, data); @@ -169,11 +172,9 @@ public class ContentParser{ readBundle(ContentType.block, name, value); Block block; - boolean exists; if(locate(ContentType.block, name) != null){ block = locate(ContentType.block, name); - exists = true; if(value.has("type")){ throw new IllegalArgumentException("When defining properties for an existing block, you must not re-declare its type. The original type will be used. Block: " + name); @@ -181,7 +182,6 @@ public class ContentParser{ }else{ //TODO generate dynamically instead of doing.. this Class type; - exists = false; try{ type = resolve(getType(value), @@ -207,14 +207,6 @@ public class ContentParser{ currentContent = block; - String[] research = {null}; - - //add research tech node - if(value.has("research")){ - research[0] = value.get("research").asString(); - value.remove("research"); - } - read(() -> { if(value.has("consumes")){ for(JsonValue child : value.get("consumes")){ @@ -245,33 +237,6 @@ public class ContentParser{ throw new IllegalArgumentException("Blocks cannot be larger than " + ConstructBlock.maxSize); } - //add research tech node - if(research[0] != null){ - //TODO only works with blocks - Block parent = find(ContentType.block, research[0]); - TechNode baseNode = exists && TechTree.all.contains(t -> t.content == block) ? TechTree.all.find(t -> t.content == block) : TechTree.create(parent, block); - LoadedMod cur = currentMod; - - postreads.add(() -> { - currentContent = block; - currentMod = cur; - - if(baseNode.parent != null){ - baseNode.parent.children.remove(baseNode); - } - - TechNode parnode = TechTree.all.find(t -> t.content == parent); - if(parnode == null){ - throw new IllegalArgumentException("Block '" + parent.name + "' isn't in the tech tree, but '" + block.name + "' requires it to be researched."); - } - if(!parnode.children.contains(baseNode)){ - parnode.children.add(baseNode); - } - baseNode.parent = parnode; - }); - - } - //make block visible by default if there are requirements and no visibility set if(value.has("requirements") && block.buildVisibility == BuildVisibility.hidden){ block.buildVisibility = BuildVisibility.shown; @@ -292,7 +257,37 @@ public class ContentParser{ } currentContent = unit; - read(() -> readFields(unit, value, true)); + //TODO test this! + read(() -> { + //add reconstructor type + if(value.hasChild("requirements")){ + JsonValue rec = value.remove("requirements"); + + //intermediate class for parsing + class UnitReq{ + public Block block; + public ItemStack[] requirements = {}; + @Nullable + public UnitType previous; + public float time = 60f * 10f; + } + + UnitReq req = parser.readValue(UnitReq.class, rec); + + if(req.block instanceof Reconstructor r){ + if(req.previous != null){ + r.upgrades.add(new UnitType[]{req.previous, unit}); + } + }else if(req.block instanceof UnitFactory f){ + f.plans.add(new UnitPlan(unit, req.time, req.requirements)); + }else{ + throw new IllegalArgumentException("Missing a valid 'block' in 'requirements'"); + } + + } + + readFields(unit, value, true); + }); return unit; }, @@ -323,8 +318,8 @@ public class ContentParser{ private TypeParser parser(ContentType type, Func constructor){ return (mod, name, value) -> { T item; - if(Vars.content.getByName(type, name) != null){ - item = (T)Vars.content.getByName(type, name); + if(locate(type, name) != null){ + item = (T)locate(type, name); readBundle(type, name, value); }else{ readBundle(type, name, value); @@ -440,6 +435,8 @@ public class ContentParser{ } public void markError(Content content, LoadedMod mod, Fi file, Throwable error){ + Log.err("Error for @ / @:\n@\n", content, file, Strings.getStackTrace(error)); + content.minfo.mod = mod; content.minfo.sourceFile = file; content.minfo.error = makeError(error, file); @@ -539,13 +536,13 @@ public class ContentParser{ } void checkNullFields(Object object){ - if(object instanceof Number || object instanceof String || toBeParsed.contains(object)) return; + if(object == null || object instanceof Number || object instanceof String || toBeParsed.contains(object) || object.getClass().getName().startsWith("arc.")) return; parser.getFields(object.getClass()).values().toSeq().each(field -> { try{ if(field.field.getType().isPrimitive()) return; - if(field.field.isAnnotationPresent(NonNull.class) && field.field.get(object) == null){ + if(!field.field.isAnnotationPresent(Nullable.class) && field.field.get(object) == null && !implicitNullable.contains(field.field.getType())){ throw new RuntimeException("'" + field.field.getName() + "' in " + object.getClass().getSimpleName() + " is missing!"); } }catch(Exception e){ @@ -560,6 +557,8 @@ public class ContentParser{ } void readFields(Object object, JsonValue jsonMap){ + JsonValue research = jsonMap.remove("research"); + toBeParsed.remove(object); Class type = object.getClass(); ObjectMap fields = parser.getFields(type); @@ -590,6 +589,57 @@ public class ContentParser{ throw ex; } } + + + if(object instanceof UnlockableContent unlock && research != null){ + + //add research tech node + String researchName; + ItemStack[] customRequirements; + + //research can be a single string or an object with parent and requirements + if(research.isString()){ + researchName = research.asString(); + customRequirements = null; + }else{ + researchName = research.getString("parent"); + customRequirements = research.has("requirements") ? parser.readValue(ItemStack[].class, research.get("requirements")) : null; + } + + //remove old node + TechNode lastNode = TechTree.all.find(t -> t.content == unlock); + if(lastNode != null){ + lastNode.remove(); + } + + TechNode node = new TechNode(null, unlock, customRequirements == null ? unlock.researchRequirements() : customRequirements); + LoadedMod cur = currentMod; + + postreads.add(() -> { + currentContent = unlock; + currentMod = cur; + + //remove old node from parent + if(node.parent != null){ + node.parent.children.remove(node); + } + + + //find parent node. + TechNode parent = TechTree.all.find(t -> t.content.name.equals(researchName) || t.content.name.equals(currentMod.name + "-" + researchName)); + + if(parent == null){ + throw new IllegalArgumentException("Content '" + researchName + "' isn't in the tech tree, but '" + unlock.name + "' requires it to be researched."); + } + + //add this node to the parent + if(!parent.children.contains(node)){ + parent.children.add(node); + } + //reparent the node + node.parent = parent; + }); + } } /** Tries to resolve a class from a list of potential class names. */ diff --git a/core/src/mindustry/mod/ModLoadingMusic.java b/core/src/mindustry/mod/ModLoadingMusic.java index 8797456a18..9b51031783 100644 --- a/core/src/mindustry/mod/ModLoadingMusic.java +++ b/core/src/mindustry/mod/ModLoadingMusic.java @@ -2,10 +2,9 @@ package mindustry.mod; import arc.audio.*; import arc.mock.*; -import arc.util.ArcAnnotate.*; public class ModLoadingMusic implements Music{ - public @NonNull Music music = new MockMusic(); + public Music music = new MockMusic(); @Override public void play(){ diff --git a/core/src/mindustry/mod/ModLoadingSound.java b/core/src/mindustry/mod/ModLoadingSound.java index 7bae2f5a6b..543b75c154 100644 --- a/core/src/mindustry/mod/ModLoadingSound.java +++ b/core/src/mindustry/mod/ModLoadingSound.java @@ -3,10 +3,9 @@ package mindustry.mod; import arc.audio.*; import arc.math.geom.*; import arc.mock.*; -import arc.util.ArcAnnotate.*; public class ModLoadingSound implements Sound{ - public @NonNull Sound sound = new MockSound(); + public Sound sound = new MockSound(); @Override public float calcPan(float x, float y){ diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 433e66ca7a..12c33c7480 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -11,7 +11,6 @@ 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.*; @@ -25,7 +24,6 @@ import mindustry.type.*; import mindustry.ui.*; import java.io.*; -import java.net.*; import static mindustry.Vars.*; @@ -172,8 +170,7 @@ public class Mods implements Loadable{ //generate new icons for(Seq arr : content.getContentMap()){ arr.each(c -> { - if(c instanceof UnlockableContent && c.minfo.mod != null){ - UnlockableContent u = (UnlockableContent)c; + if(c instanceof UnlockableContent u && c.minfo.mod != null){ u.load(); u.createIcons(packer); } @@ -192,10 +189,10 @@ public class Mods implements Loadable{ private PageType getPage(AtlasRegion region){ return - region.getTexture() == Core.atlas.find("white").getTexture() ? PageType.main : - region.getTexture() == Core.atlas.find("stone1").getTexture() ? PageType.environment : - region.getTexture() == Core.atlas.find("clear-editor").getTexture() ? PageType.editor : - region.getTexture() == Core.atlas.find("whiteui").getTexture() ? PageType.ui : + region.texture == Core.atlas.find("white").texture ? PageType.main : + region.texture == Core.atlas.find("stone1").texture ? PageType.environment : + region.texture == Core.atlas.find("clear-editor").texture ? PageType.editor : + region.texture == Core.atlas.find("whiteui").texture ? PageType.ui : PageType.main; } @@ -400,7 +397,7 @@ public class Mods implements Loadable{ d.button("@details", Icon.downOpen, Styles.transt, () -> { new Dialog(""){{ setFillParent(true); - cont.pane(e -> e.add(c.minfo.error).wrap().grow()).grow(); + cont.pane(e -> e.add(c.minfo.error).wrap().grow().labelAlign(Align.center, Align.left)).grow(); cont.row(); cont.button("@ok", Icon.left, this::hide).size(240f, 60f); }}.show(); @@ -600,9 +597,14 @@ public class Mods implements Loadable{ zip = zip.list()[0]; } - Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json"); + Fi metaf = + zip.child("mod.json").exists() ? zip.child("mod.json") : + zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : + zip.child("plugin.json").exists() ? zip.child("plugin.json") : + zip.child("plugin.hjson"); + if(!metaf.exists()){ - Log.warn("Mod @ doesn't have a 'mod.json'/'mod.hjson'/'plugin.json' file, skipping.", sourceFile); + Log.warn("Mod @ doesn't have a '[mod/plugin].[h]json' file, skipping.", sourceFile); throw new IllegalArgumentException("Invalid file: No mod.json found."); } @@ -629,12 +631,11 @@ public class Mods implements Loadable{ //make sure the main class exists before loading it; if it doesn't just don't put it there if(mainFile.exists()){ //mobile versions don't support class mods - if(mobile){ - throw new IllegalArgumentException("Java class mods are not supported on mobile."); + if(ios){ + throw new IllegalArgumentException("Java class mods are not supported on iOS."); } - URLClassLoader classLoader = new URLClassLoader(new URL[]{sourceFile.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); - Class main = classLoader.loadClass(mainClass); + Class main = platform.loadJar(sourceFile, mainClass); metas.put(main, meta); mainMod = (Mod)main.getDeclaredConstructor().newInstance(); }else{ @@ -646,7 +647,9 @@ public class Mods implements Loadable{ meta.hidden = true; } - Log.info("Loaded mod '@' in @", meta.name, Time.elapsed()); + if(!headless){ + Log.info("Loaded mod '@' in @ms", meta.name, Time.elapsed()); + } return new LoadedMod(sourceFile, zip, mainMod, meta); }catch(Exception e){ @@ -707,14 +710,49 @@ public class Mods implements Loadable{ /** @return whether this mod is supported by the game verison */ public boolean isSupported(){ - if(Version.build <= 0 || meta.minGameVersion == null) return true; - if(meta.minGameVersion.contains(".")){ - String[] split = meta.minGameVersion.split("\\."); + if(isOutdated()) return false; + + int major = getMinMajor(), minor = getMinMinor(); + + if(Version.build <= 0) return true; + + return Version.build >= major && Version.revision >= minor; + } + + /** @return whether this mod is outdated, e.g. not compatible with v6. */ + public boolean isOutdated(){ + //must be at least 105 to indicate v6 compat + return getMinMajor() < 105; + } + + public int getMinMajor(){ + int major = 0; + + String ver = meta.minGameVersion == null ? "0" : meta.minGameVersion; + + if(ver.contains(".")){ + String[] split = ver.split("\\."); if(split.length == 2){ - return Version.build >= Strings.parseInt(split[0], 0) && Version.revision >= Strings.parseInt(split[1], 0); + major = Strings.parseInt(split[0], 0); + } + }else{ + major = Strings.parseInt(ver, 0); + } + + return major; + } + + public int getMinMinor(){ + String ver = meta.minGameVersion == null ? "0" : meta.minGameVersion; + + if(ver.contains(".")){ + String[] split = ver.split("\\."); + if(split.length == 2){ + return Strings.parseInt(split[1], 0); } } - return Version.build >= Strings.parseInt(meta.minGameVersion, 0); + + return 0; } @Override @@ -792,7 +830,7 @@ public class Mods implements Loadable{ /** Mod metadata information.*/ public static class ModMeta{ - public String name, displayName, author, description, version, main, minGameVersion; + public String name, displayName, author, description, version, main, minGameVersion = "0"; public Seq dependencies = Seq.with(); /** Hidden mods are only server-side or client-side, and do not support adding new content. */ public boolean hidden; diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index d2009187f7..1aa260e8fa 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -22,7 +22,7 @@ public class Scripts implements Disposable{ private final Seq blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", "runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system", ".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org."); - private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic."); + private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async.", "saveio"); private final Context context; private final Scriptable scope; private boolean errored; diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index fde1a9c4fc..f185744c28 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -3,7 +3,6 @@ package mindustry.net; import arc.*; import arc.func.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.Log.*; import arc.util.pooling.Pool.*; @@ -24,6 +23,7 @@ public class Administration{ public Seq chatFilters = new Seq<>(); public Seq actionFilters = new Seq<>(); public Seq subnetBans = new Seq<>(); + public ObjectMap kickedIPs = new ObjectMap<>(); /** All player info. Maps UUIDs to info. This persists throughout restarts. Do not access directly. */ private ObjectMap playerInfo = new ObjectMap<>(); @@ -86,6 +86,20 @@ public class Administration{ }); } + /** @return time at which a player would be pardoned for a kick (0 means they were never kicked) */ + public long getKickTime(String uuid, String ip){ + return Math.max(getInfo(uuid).lastKicked, kickedIPs.get(ip, 0L)); + } + + /** Sets up kick duration for a player. */ + public void handleKicked(String uuid, String ip, long duration){ + kickedIPs.put(ip, Math.max(kickedIPs.get(ip, 0L), Time.millis() + duration)); + + PlayerInfo info = getInfo(uuid); + info.timesKicked++; + info.lastKicked = Math.max(Time.millis() + duration, info.lastKicked); + } + public Seq getSubnetBans(){ return subnetBans; } @@ -680,9 +694,9 @@ public class Administration{ /** 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; + public Player player; + public ActionType type; + public Tile tile; /** valid for block placement events only */ public @Nullable Block block; diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java index ea0146312e..91043037e8 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -61,7 +61,7 @@ public class ArcNetProvider implements NetProvider{ try{ net.handleClientReceived(object); }catch(Throwable e){ - handleException(e); + net.handleException(e); } }); @@ -144,14 +144,14 @@ public class ArcNetProvider implements NetProvider{ try{ client.run(); }catch(Exception e){ - if(!(e instanceof ClosedSelectorException)) handleException(e); + if(!(e instanceof ClosedSelectorException)) net.handleException(e); } }); client.connect(5000, ip, port, port); success.run(); }catch(Exception e){ - handleException(e); + net.handleException(e); } }); } @@ -269,16 +269,6 @@ public class ArcNetProvider implements NetProvider{ return null; } - void handleException(Throwable e){ - if(e instanceof ArcNetException){ - Core.app.post(() -> net.showError(new IOException("mismatch"))); - }else if(e instanceof ClosedChannelException){ - Core.app.post(() -> net.showError(new IOException("alreadyconnected"))); - }else{ - Core.app.post(() -> net.showError(e)); - } - } - class ArcConnection extends NetConnection{ public final Connection connection; @@ -371,8 +361,7 @@ public class ArcNetProvider implements NetProvider{ } public void writeFramework(ByteBuffer buffer, FrameworkMessage message){ - if(message instanceof Ping){ - Ping p = (Ping)message; + if(message instanceof Ping p){ buffer.put((byte)0); buffer.putInt(p.id); buffer.put(p.isReply ? 1 : (byte)0); @@ -380,12 +369,10 @@ public class ArcNetProvider implements NetProvider{ buffer.put((byte)1); }else if(message instanceof KeepAlive){ buffer.put((byte)2); - }else if(message instanceof RegisterUDP){ - RegisterUDP p = (RegisterUDP)message; + }else if(message instanceof RegisterUDP p){ buffer.put((byte)3); buffer.putInt(p.connectionID); - }else if(message instanceof RegisterTCP){ - RegisterTCP p = (RegisterTCP)message; + }else if(message instanceof RegisterTCP p){ buffer.put((byte)4); buffer.putInt(p.connectionID); } diff --git a/core/src/mindustry/net/CrashSender.java b/core/src/mindustry/net/CrashSender.java index 24a82a9e07..0d2204890c 100644 --- a/core/src/mindustry/net/CrashSender.java +++ b/core/src/mindustry/net/CrashSender.java @@ -2,9 +2,9 @@ package mindustry.net; import arc.*; import arc.Net.*; -import arc.struct.*; import arc.files.*; import arc.func.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; import arc.util.serialization.*; @@ -20,18 +20,32 @@ import java.util.*; import static arc.Core.*; import static mindustry.Vars.net; +import static mindustry.Vars.*; public class CrashSender{ + public static String createReport(String error){ + String report = "Mindustry has crashed. How unfortunate.\n"; + if(mods.list().size == 0 && Version.build != -1){ + report += "Report this at " + Vars.reportIssueURL + "\n\n"; + } + return report + "Version: " + Version.combined() + (Vars.headless ? " (Server)" : "") + "\n" + + "OS: " + System.getProperty("os.name") + " x" + (OS.is64Bit ? "64" : "32") + "\n" + + "Java Version: " + System.getProperty("java.version") + "\n" + + "Java Architecture: " + System.getProperty("sun.arch.data.model") + "\n" + + mods.list().size + " Mods" + (mods.list().isEmpty() ? "" : ": " + mods.list().toString(", ", mod -> mod.name + ":" + mod.meta.version)) + + "\n\n" + error; + } + public static void log(Throwable exception){ try{ - Core.settings.getDataDirectory().child("crashes").child("crash_" + System.currentTimeMillis() + ".txt").writeString(Strings.neatError(exception)); + Core.settings.getDataDirectory().child("crashes").child("crash_" + System.currentTimeMillis() + ".txt") + .writeString(createReport(Strings.neatError(exception))); }catch(Throwable ignored){ } } public static void send(Throwable exception, Cons writeListener){ - try{ exception.printStackTrace(); @@ -70,7 +84,7 @@ public class CrashSender{ try{ File file = new File(OS.getAppDataDirectoryString(Vars.appName), "crashes/crash-report-" + new SimpleDateFormat("MM_dd_yyyy_HH_mm_ss").format(new Date()) + ".txt"); new Fi(OS.getAppDataDirectoryString(Vars.appName)).child("crashes").mkdirs(); - new Fi(file).writeString(parseException(exception)); + new Fi(file).writeString(createReport(parseException(exception))); writeListener.get(file); }catch(Throwable e){ Log.err("Failed to save local crash report.", e); @@ -130,7 +144,7 @@ public class CrashSender{ boolean[] sent = {false}; Log.info("Sending crash report."); - //post to crash report URL + //post to crash report URL, exit code indicates send success httpPost(Vars.crashReportURL, value.toJson(OutputType.json), r -> { Log.info("Crash sent successfully."); sent[0] = true; @@ -138,7 +152,7 @@ public class CrashSender{ }, t -> { t.printStackTrace(); sent[0] = true; - System.exit(1); + System.exit(-1); }); //sleep until report is sent diff --git a/core/src/mindustry/net/Host.java b/core/src/mindustry/net/Host.java index 123fdad341..f6124be052 100644 --- a/core/src/mindustry/net/Host.java +++ b/core/src/mindustry/net/Host.java @@ -1,6 +1,6 @@ package mindustry.net; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.*; import mindustry.game.*; diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index 8993b84f83..0bf782600e 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -1,10 +1,10 @@ package mindustry.net; import arc.*; -import arc.struct.*; import arc.func.*; +import arc.net.*; +import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.pooling.*; import mindustry.gen.*; import mindustry.net.Packets.*; @@ -13,6 +13,7 @@ import net.jpountz.lz4.*; import java.io.*; import java.nio.*; +import java.nio.channels.*; import static mindustry.Vars.*; @@ -36,6 +37,16 @@ public class Net{ this.provider = provider; } + public void handleException(Throwable e){ + if(e instanceof ArcNetException){ + Core.app.post(() -> showError(new IOException("mismatch"))); + }else if(e instanceof ClosedChannelException){ + Core.app.post(() -> showError(new IOException("alreadyconnected"))); + }else{ + Core.app.post(() -> showError(e)); + } + } + /** Display a network error. Call on the graphics thread. */ public void showError(Throwable e){ @@ -152,7 +163,9 @@ public class Net{ } public void disconnect(){ - Log.info("Disconnecting."); + if(active && !server){ + Log.info("Disconnecting."); + } provider.disconnectClient(); server = false; active = false; @@ -224,12 +237,10 @@ public class Net{ */ public void handleClientReceived(Object object){ - if(object instanceof StreamBegin){ - StreamBegin b = (StreamBegin)object; + if(object instanceof StreamBegin b){ streams.put(b.id, currentStream = new StreamBuilder(b)); - }else if(object instanceof StreamChunk){ - StreamChunk c = (StreamChunk)object; + }else if(object instanceof StreamChunk c){ StreamBuilder builder = streams.get(c.id); if(builder == null){ throw new RuntimeException("Received stream chunk without a StreamBegin beforehand!"); diff --git a/core/src/mindustry/net/NetConnection.java b/core/src/mindustry/net/NetConnection.java index 07de024e7f..cf1e47bbbd 100644 --- a/core/src/mindustry/net/NetConnection.java +++ b/core/src/mindustry/net/NetConnection.java @@ -1,7 +1,6 @@ package mindustry.net; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.entities.units.*; import mindustry.gen.*; @@ -65,9 +64,7 @@ public abstract class NetConnection{ Log.info("Kicking connection @; Reason: @", address, reason.replace("\n", " ")); - PlayerInfo info = netServer.admins.getInfo(uuid); - info.timesKicked++; - info.lastKicked = Math.max(Time.millis() + kickDuration, info.lastKicked); + netServer.admins.handleKicked(uuid, address, kickDuration); Call.kick(this, reason); diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index 05bd69fe32..3a32d5cb6b 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -1,6 +1,6 @@ package mindustry.net; -import arc.Core; +import arc.*; import arc.util.*; import arc.util.io.*; import mindustry.core.*; diff --git a/core/src/mindustry/net/Packet.java b/core/src/mindustry/net/Packet.java index 9058637a66..2aaa2a05c0 100644 --- a/core/src/mindustry/net/Packet.java +++ b/core/src/mindustry/net/Packet.java @@ -1,8 +1,8 @@ package mindustry.net; -import arc.util.pooling.Pool.Poolable; +import arc.util.pooling.Pool.*; -import java.nio.ByteBuffer; +import java.nio.*; public interface Packet extends Poolable{ default void read(ByteBuffer buffer){} diff --git a/core/src/mindustry/net/Registrator.java b/core/src/mindustry/net/Registrator.java index c0368497f5..2280d016e0 100644 --- a/core/src/mindustry/net/Registrator.java +++ b/core/src/mindustry/net/Registrator.java @@ -1,7 +1,7 @@ package mindustry.net; -import arc.struct.ObjectIntMap; -import arc.func.Prov; +import arc.func.*; +import arc.struct.*; import mindustry.net.Packets.*; public class Registrator{ diff --git a/core/src/mindustry/net/Streamable.java b/core/src/mindustry/net/Streamable.java index 18171b6cbf..52ce5d36d8 100644 --- a/core/src/mindustry/net/Streamable.java +++ b/core/src/mindustry/net/Streamable.java @@ -1,6 +1,6 @@ package mindustry.net; -import mindustry.net.Packets.StreamBegin; +import mindustry.net.Packets.*; import java.io.*; diff --git a/core/src/mindustry/type/AmmoType.java b/core/src/mindustry/type/AmmoType.java new file mode 100644 index 0000000000..afe0a9818a --- /dev/null +++ b/core/src/mindustry/type/AmmoType.java @@ -0,0 +1,28 @@ +package mindustry.type; + +import arc.graphics.*; +import mindustry.ctype.*; +import mindustry.gen.*; +import mindustry.graphics.*; + +/** Type of ammo that a unit uses. */ +public class AmmoType extends Content{ + public String icon = Iconc.itemCopper + ""; + public Color color = Pal.ammo; + public Color barColor = Pal.ammo; + + public AmmoType(char icon, Color color){ + this.icon = icon + ""; + this.color = color; + } + + public AmmoType(){ + } + + public void resupply(Unit unit){} + + @Override + public ContentType getContentType(){ + return ContentType.ammo; + } +} diff --git a/core/src/mindustry/type/AmmoTypes.java b/core/src/mindustry/type/AmmoTypes.java new file mode 100644 index 0000000000..5b7c885519 --- /dev/null +++ b/core/src/mindustry/type/AmmoTypes.java @@ -0,0 +1,85 @@ +package mindustry.type; + +import mindustry.*; +import mindustry.content.*; +import mindustry.ctype.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +public class AmmoTypes implements ContentList{ + public static AmmoType + powerLow, + power, + powerHigh, + copper, + thorium; + + @Override + public void load(){ + powerLow = new PowerAmmoType(500); + power = new PowerAmmoType(1000); + powerHigh = new PowerAmmoType(2000); + copper = new ItemAmmoType(Items.copper); + thorium = new ItemAmmoType(Items.thorium); + } + + public static class PowerAmmoType extends AmmoType{ + public float totalPower = 1000; + + public PowerAmmoType(){ + super(Iconc.power, Pal.powerLight); + barColor = color; + } + + public PowerAmmoType(float totalPower){ + this(); + this.totalPower = totalPower; + } + + @Override + public void resupply(Unit unit){ + float range = unit.hitSize + 60f; + Tile closest = Vars.indexer.findClosestFlag(unit.x, unit.y, unit.team, BlockFlag.powerRes); + + if(closest != null && closest.build != null && unit.within(closest.build, range) && closest.build.power != null){ + var build = closest.build; + + if(build.block.consumes.hasPower() && build.block.consumes.getPower().buffered){ + float amount = closest.build.power.status * build.block.consumes.getPower().capacity; + float powerPerAmmo = totalPower / unit.type().ammoCapacity; + float ammoRequired = unit.type().ammoCapacity - unit.ammo; + float powerRequired = ammoRequired * powerPerAmmo; + float powerTaken = Math.min(amount, powerRequired); + + if(powerTaken > 1){ + closest.build.power.status -= powerTaken / build.block.consumes.getPower().capacity; + unit.ammo += powerTaken / powerPerAmmo; + + Fx.itemTransfer.at(build.x, build.y, Math.max(powerTaken / 100f, 1f), Pal.power, unit); + } + } + } + } + } + + public static class ItemAmmoType extends AmmoType{ + public Item item; + + public ItemAmmoType(Item item){ + this.item = item; + this.color = item.color; + } + + public ItemAmmoType(){ + } + + @Override + public void load(){ + if(item != null){ + icon = item.emoji(); + } + } + } +} diff --git a/core/src/mindustry/type/Item.java b/core/src/mindustry/type/Item.java index 6558636343..9329efb47e 100644 --- a/core/src/mindustry/type/Item.java +++ b/core/src/mindustry/type/Item.java @@ -1,13 +1,13 @@ package mindustry.type; -import arc.struct.*; import arc.graphics.*; import arc.scene.ui.layout.*; +import arc.struct.*; import mindustry.ctype.*; import mindustry.ui.*; import mindustry.world.blocks.environment.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class Item extends UnlockableContent{ public final Color color; diff --git a/core/src/mindustry/type/ItemSeq.java b/core/src/mindustry/type/ItemSeq.java index 018d77a10f..0407f6a3f8 100644 --- a/core/src/mindustry/type/ItemSeq.java +++ b/core/src/mindustry/type/ItemSeq.java @@ -11,11 +11,14 @@ import mindustry.world.modules.ItemModule.*; import java.util.*; public class ItemSeq implements Iterable, Serializable{ - protected final int[] values; + protected final int[] values = new int[Vars.content.items().size]; public int total; public ItemSeq(){ - values = new int[Vars.content.items().size]; + } + + public ItemSeq(Seq stacks){ + stacks.each(this::add); } public void each(ItemConsumer cons){ @@ -26,6 +29,11 @@ public class ItemSeq implements Iterable, Serializable{ } } + public void clear(){ + total = 0; + Arrays.fill(values, 0); + } + public Seq toSeq(){ Seq out = new Seq<>(); for(int i = 0; i < values.length; i++){ @@ -90,8 +98,10 @@ public class ItemSeq implements Iterable, Serializable{ @Override public void read(Json json, JsonValue jsonData){ + total = 0; for(Item item : Vars.content.items()){ values[item.id] = jsonData.getInt(item.name, 0); + total += values[item.id]; } } diff --git a/core/src/mindustry/type/ItemStack.java b/core/src/mindustry/type/ItemStack.java index a8a765c4df..d5f4097b58 100644 --- a/core/src/mindustry/type/ItemStack.java +++ b/core/src/mindustry/type/ItemStack.java @@ -1,7 +1,7 @@ package mindustry.type; -import arc.struct.Seq; -import mindustry.content.Items; +import arc.struct.*; +import mindustry.content.*; public class ItemStack implements Comparable{ public static final ItemStack[] empty = {}; diff --git a/core/src/mindustry/type/Liquid.java b/core/src/mindustry/type/Liquid.java index f968a0f68a..19e77a9987 100644 --- a/core/src/mindustry/type/Liquid.java +++ b/core/src/mindustry/type/Liquid.java @@ -2,14 +2,14 @@ package mindustry.type; import arc.graphics.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; import mindustry.ctype.*; import mindustry.ui.*; public class Liquid extends UnlockableContent{ /** Color used in pipes and on the ground. */ - public final @NonNull Color color; + public final Color color; /** Color used in bars. */ public @Nullable Color barColor; /** Color used to draw lights. Note that the alpha channel is used to dictate brightness. */ diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index 570671de4f..8c4b40b4c2 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -1,24 +1,19 @@ package mindustry.type; import arc.*; -import arc.files.*; import arc.func.*; import arc.graphics.*; import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; -import arc.util.io.*; import arc.util.noise.*; -import mindustry.*; import mindustry.ctype.*; import mindustry.graphics.*; import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.maps.generators.*; -import mindustry.type.Sector.*; import static mindustry.Vars.*; @@ -28,7 +23,7 @@ public class Planet extends UnlockableContent{ /** intersect() temp var. */ private static final Vec3 intersectResult = new Vec3(); /** Mesh used for rendering. Created on load() - will be null on the server! */ - public PlanetMesh mesh; + public @Nullable PlanetMesh mesh; /** Position in global coordinates. Will be 0,0,0 until the Universe updates it. */ public Vec3 position = new Vec3(); /** Grid used for the sectors on the planet. Null if this planet can't be landed on. */ @@ -36,7 +31,7 @@ public class Planet extends UnlockableContent{ /** Generator that will make the planet. Can be null for planets that don't need to be landed on. */ public @Nullable PlanetGenerator generator; /** Array of sectors; directly maps to tiles in the grid. */ - public @NonNull Seq sectors; + public Seq sectors; /** Radius of this planet's sphere. Does not take into account sattelites. */ public float radius; /** Orbital radius around the sun. Do not change unless you know exactly what you are doing.*/ @@ -64,7 +59,7 @@ public class Planet extends UnlockableContent{ /** Parent body that this planet orbits around. If null, this planet is considered to be in the middle of the solar system.*/ public @Nullable Planet parent; /** The root parent of the whole solar system this planet is in. */ - public @NonNull Planet solarSystem; + public Planet solarSystem; /** All planets orbiting this one, in ascending order of radius. */ public Seq children = new Seq<>(); /** Sattelites orbiting this planet. */ @@ -83,25 +78,10 @@ public class Planet extends UnlockableContent{ sectors = new Seq<>(grid.tiles.length); for(int i = 0; i < grid.tiles.length; i++){ - sectors.add(new Sector(this, grid.tiles[i], new SectorData())); + sectors.add(new Sector(this, grid.tiles[i])); } sectorApproxRadius = sectors.first().tile.v.dst(sectors.first().tile.corners[0].v); - - //read data for sectors - Fi data = Vars.tree.get("planets/" + name + ".dat"); - if(data.exists()){ - try{ - try(Reads read = data.reads()){ - short dsize = read.s(); - for(int i = 0; i < dsize; i++){ - sectors.get(i).data.read(read); - } - } - }catch(Throwable t){ - t.printStackTrace(); - } - } }else{ sectors = new Seq<>(); } @@ -196,7 +176,7 @@ public class Planet extends UnlockableContent{ for(Sector sector : sectors){ float sum = 1f; for(Sector other : sector.inRange(2)){ - if(other.is(SectorAttribute.base)){ + if(other.generateEnemyBase){ sum += 1f; } } diff --git a/core/src/mindustry/type/Publishable.java b/core/src/mindustry/type/Publishable.java index 8c8b32edde..274b5f3f7c 100644 --- a/core/src/mindustry/type/Publishable.java +++ b/core/src/mindustry/type/Publishable.java @@ -1,14 +1,15 @@ package mindustry.type; -import arc.struct.*; import arc.files.*; -import arc.util.ArcAnnotate.*; +import arc.struct.*; +import arc.util.*; import mindustry.*; /** Defines a piece of content that can be published on the Workshop. */ public interface Publishable{ /** @return workshop item ID, or null if this isn't on the workshop. */ - @Nullable String getSteamID(); + @Nullable + String getSteamID(); /** adds a steam ID to this item once it's published. should save the item to make sure this change is persisted. */ void addSteamID(String id); /** removes the item ID; called when the item isn't found. */ @@ -16,7 +17,8 @@ public interface Publishable{ /** @return default title of the listing. */ String steamTitle(); /** @return standard steam listing description, may be null. this is editable by users after release.*/ - @Nullable String steamDescription(); + @Nullable + String steamDescription(); /** @return the tag that this content has. e.g. 'schematic' or 'map'. */ String steamTag(); /** @return a folder with everything needed for this piece of content in it; does not need to be a copy. */ diff --git a/core/src/mindustry/type/Satellite.java b/core/src/mindustry/type/Satellite.java index 4b2546c651..a30a44c136 100644 --- a/core/src/mindustry/type/Satellite.java +++ b/core/src/mindustry/type/Satellite.java @@ -1,12 +1,10 @@ package mindustry.type; -import arc.util.ArcAnnotate.*; - /** Any object that is orbiting a planet. */ public class Satellite{ - public @NonNull Planet planet; + public Planet planet; - public Satellite(@NonNull Planet orbiting){ + public Satellite(Planet orbiting){ this.planet = orbiting; } } diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index 856dd2219d..4c1df28945 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -3,16 +3,12 @@ package mindustry.type; import arc.*; import arc.func.*; import arc.math.geom.*; -import arc.struct.ObjectIntMap.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; -import arc.util.io.*; import mindustry.*; -import mindustry.ctype.*; import mindustry.game.Saves.*; import mindustry.graphics.g3d.PlanetGrid.*; -import mindustry.world.*; +import mindustry.world.modules.*; import static mindustry.Vars.*; @@ -27,24 +23,19 @@ public class Sector{ public final Ptile tile; public final int id; - public final SectorData data; - public @Nullable SaveSlot save; public @Nullable SectorPreset preset; /** Number 0-1 indicating the difficulty based on nearby bases. */ public float baseCoverage; + public boolean generateEnemyBase; - //TODO implement a dynamic launch period - public int launchPeriod = 10; - - public Sector(Planet planet, Ptile tile, SectorData data){ + public Sector(Planet planet, Ptile tile){ this.planet = planet; this.tile = tile; this.plane = new Plane(); this.rect = makeRect(); this.id = tile.id; - this.data = data; } public Seq inRange(int range){ @@ -100,12 +91,12 @@ public class Sector{ /** @return whether the enemy has a generated base here. */ public boolean hasEnemyBase(){ - return is(SectorAttribute.base) && (save == null || save.meta.rules.waves); + return generateEnemyBase && (save == null || save.meta.rules.waves); } public boolean isBeingPlayed(){ //after the launch dialog, a sector is no longer considered being played - return Vars.state.isGame() && Vars.state.rules.sector == this && !Vars.state.launched && !Vars.state.gameOver; + return Vars.state.isGame() && Vars.state.rules.sector == this && !Vars.state.gameOver; } public boolean isCaptured(){ @@ -139,16 +130,6 @@ public class Sector{ return res % 2 == 0 ? res : res + 1; } - //TODO implement - public boolean isLaunchWave(int wave){ - return metCondition() && wave % launchPeriod == 0; - } - - public boolean metCondition(){ - //TODO implement - return false; - } - //TODO this should be stored in a more efficient structure, and be updated each turn public ItemSeq getExtraItems(){ return Core.settings.getJson(key("extra-items"), ItemSeq.class, ItemSeq::new); @@ -163,14 +144,42 @@ public class Sector{ } public void removeItem(Item item, int amount){ + ItemSeq seq = new ItemSeq(); + seq.add(item, -amount); + addItems(seq); + } + + public void addItems(ItemSeq items){ if(isBeingPlayed()){ if(state.rules.defaultTeam.core() != null){ - state.rules.defaultTeam.items().remove(item, amount); + ItemModule storage = state.rules.defaultTeam.items(); + int cap = state.rules.defaultTeam.core().storageCapacity; + items.each((item, amount) -> storage.add(item, Math.min(cap - storage.get(item), amount))); } }else{ ItemSeq recv = getExtraItems(); - recv.remove(item, amount); + if(save != null){ + //"shave off" extra items + + ItemSeq count = new ItemSeq(); + + //add items already present + count.add(save.meta.secinfo.coreItems); + + count.add(calculateReceivedItems()); + + int capacity = save.meta.secinfo.storageCapacity; + + //when over capacity, add that to the extra items + count.each((i, a) -> { + if(a > capacity){ + recv.remove(i, (a - capacity)); + } + }); + } + + recv.add(items); setExtraItems(recv); } @@ -184,21 +193,19 @@ public class Sector{ count.add(state.rules.defaultTeam.items()); }else if(save != null){ //add items already present - for(Entry ent : save.meta.secinfo.coreItems){ - count.add(ent.key, ent.value); - } + count.add(save.meta.secinfo.coreItems); count.add(calculateReceivedItems()); int capacity = save.meta.secinfo.storageCapacity; //validation - for(Item item : content.items()){ + count.each((item, amount) -> { //ensure positive items - if(count.get(item) < 0) count.set(item, 0); + if(amount < 0) count.set(item, 0); //cap the items - if(count.get(item) > capacity) count.set(item, capacity); - } + if(amount > capacity) count.set(item, capacity); + }); } return count; @@ -214,7 +221,7 @@ public class Sector{ save.meta.secinfo.production.each((item, stat) -> count.add(item, (int)(stat.mean * seconds))); //add received items - getExtraItems().each(count::add); + count.add(getExtraItems()); } return count; @@ -262,14 +269,14 @@ public class Sector{ return Core.settings.getFloat(key("time-spent")); } - public void setSecondsPassed(long number){ - put("seconds-passed", number); + public void setSecondsPassed(int number){ + put("secondsi-passed", number); } /** @return how much time has passed in this sector without the player resuming here. * Used for resource production calculations. */ - public long getSecondsPassed(){ - return Core.settings.getLong(key("seconds-passed")); + public int getSecondsPassed(){ + return Core.settings.getInt(key("secondsi-passed")); } private String key(String key){ @@ -280,6 +287,10 @@ public class Sector{ Core.settings.put(key(key), value); } + public String toString(){ + return planet.name + "#" + id; + } + /** Projects this sector onto a 4-corner square for use in map gen. * Allocates a new object. Do not call in the main loop. */ private SectorRect makeRect(){ @@ -311,10 +322,6 @@ public class Sector{ return new SectorRect(radius, center, planeTop, planeRight, angle); } - public boolean is(SectorAttribute attribute){ - return (data.attributes & (1 << attribute.ordinal())) != 0; - } - public static class SectorRect{ public final Vec3 center, top, right; public final Vec3 result = new Vec3(); @@ -335,64 +342,4 @@ public class Sector{ return result.set(center).add(right, nx).add(top, ny); } } - - /** Cached data about a sector. */ - public static class SectorData{ - public UnlockableContent[] resources = {}; - public int spawnX, spawnY; - - public Block[] floors = {}; - public int[] floorCounts = {}; - public int attributes; - - public void write(Writes write){ - write.s(resources.length); - for(Content resource : resources){ - write.b(resource.getContentType().ordinal()); - write.s(resource.id); - } - write.s(spawnX); - write.s(spawnY); - write.s(floors.length); - for(int i = 0; i < floors.length; i++){ - write.s(floors[i].id); - write.i(floorCounts[i]); - } - - write.i(attributes); - } - - public void read(Reads read){ - resources = new UnlockableContent[read.s()]; - for(int i = 0; i < resources.length; i++){ - resources[i] = Vars.content.getByID(ContentType.all[read.b()], read.s()); - } - spawnX = read.s(); - spawnY = read.s(); - floors = new Block[read.s()]; - floorCounts = new int[floors.length]; - for(int i = 0; i < floors.length; i++){ - floors[i] = Vars.content.block(read.s()); - floorCounts[i] = read.i(); - } - attributes = read.i(); - } - } - - public enum SectorAttribute{ - /** Requires naval technology to land on, e.g. mostly water */ - naval, - /** Has rain. */ - rainy, - /** Has snow. */ - snowy, - /** Has sandstorms. */ - desert, - /** Has an enemy base. */ - base, - /** Has spore weather. */ - spores, - /** Path from core to spawns requires traversing water. */ - navalPath - } } diff --git a/core/src/mindustry/type/SectorPreset.java b/core/src/mindustry/type/SectorPreset.java index e67492dafa..c38ea7ad9f 100644 --- a/core/src/mindustry/type/SectorPreset.java +++ b/core/src/mindustry/type/SectorPreset.java @@ -3,7 +3,6 @@ package mindustry.type; import arc.func.*; import arc.graphics.g2d.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; @@ -11,9 +10,9 @@ import mindustry.maps.generators.*; import mindustry.ui.*; public class SectorPreset extends UnlockableContent{ - public @NonNull FileMapGenerator generator; - public @NonNull Planet planet; - public @NonNull Sector sector; + public FileMapGenerator generator; + public Planet planet; + public Sector sector; public int captureWave = 0; public Cons rules = rules -> rules.winWave = captureWave; diff --git a/core/src/mindustry/type/StatusEffect.java b/core/src/mindustry/type/StatusEffect.java index cce31e77c1..eb0bedb60c 100644 --- a/core/src/mindustry/type/StatusEffect.java +++ b/core/src/mindustry/type/StatusEffect.java @@ -13,8 +13,8 @@ import mindustry.gen.*; public class StatusEffect extends MappableContent{ /** Damage dealt by the unit with the effect. */ public float damageMultiplier = 1f; - /** Unit armor multiplier. */ - public float armorMultiplier = 1f; + /** Unit health multiplier. */ + public float healthMultiplier = 1f; /** Unit speed multiplier */ public float speedMultiplier = 1f; /** Unit speed multiplier */ @@ -56,7 +56,7 @@ public class StatusEffect extends MappableContent{ } if(effect != Fx.none && Mathf.chanceDelta(effectChance)){ - Tmp.v1.rnd(unit.type().hitsize/2f); + Tmp.v1.rnd(unit.type().hitSize /2f); effect.at(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y); } } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 80357dfab2..661e735fa7 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -11,14 +11,13 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.abilities.*; -import mindustry.entities.bullet.*; import mindustry.entities.units.*; import mindustry.game.*; import mindustry.gen.*; @@ -28,32 +27,34 @@ import mindustry.world.*; import mindustry.world.blocks.environment.*; import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.units.*; +import mindustry.world.consumers.*; import static mindustry.Vars.*; public class UnitType extends UnlockableContent{ - public static final float shadowTX = -12, shadowTY = -13, shadowColor = Color.toFloatBits(0, 0, 0, 0.22f); + public static final float shadowTX = -12, shadowTY = -13, outlineSpace = 0.01f; private static final Vec2 legOffset = new Vec2(); /** If true, the unit is always at elevation 1. */ public boolean flying; - public @NonNull Prov constructor; - public @NonNull Prov defaultController = () -> !flying ? new GroundAI() : new FlyingAI(); + public Prov constructor; + public Prov defaultController = () -> !flying ? new GroundAI() : new FlyingAI(); public float speed = 1.1f, boostMultiplier = 1f, rotateSpeed = 5f, baseRotateSpeed = 5f; public float drag = 0.3f, accel = 0.5f, landShake = 0f, rippleScale = 1f, fallSpeed = 0.018f; public float health = 200f, range = -1, armor = 0f; - public float crashDamageMultiplier = 3f; + public float crashDamageMultiplier = 1f; public boolean targetAir = true, targetGround = true; public boolean faceTarget = true, rotateShooting = true, isCounted = true, lowAltitude = false; public boolean canBoost = false; public boolean destructibleWreck = true; public float groundLayer = Layer.groundUnit; - public float sway = 1f; public float payloadCapacity = 8; - public int commandLimit = 24; + public float aimDst = -1f; + public int commandLimit = 8; public float visualElevation = -1f; public boolean allowLegStep = false; public boolean hovering = false; + public boolean omniMovement = true; public Effect fallEffect = Fx.fallSmoke; public Effect fallThrusterEffect = Fx.fallSmoke; public Seq abilities = new Seq<>(); @@ -62,22 +63,31 @@ public class UnitType extends UnlockableContent{ public float legLength = 10f, legSpeed = 0.1f, legTrns = 1f, legBaseOffset = 0f, legMoveSpace = 1f, legExtension = 0, legPairOffset = 0, legLengthScl = 1f, kinematicScl = 1f, maxStretch = 1.75f; public float legSplashDamage = 0f, legSplashRange = 5; public boolean flipBackLegs = true; - public float mechLegMoveScl = 1f; - public int itemCapacity = 30; - public int ammoCapacity = 220; + public int ammoResupplyAmount = 10; + public float ammoResupplyRange = 100f; + + public float mechSideSway = 0.54f, mechFrontSway = 0.1f; + public float mechStride = -1f; + public float mechStepShake = -1f; + public boolean mechStepParticles = false; + public Color mechLegColor = Pal.darkMetal; + + public int itemCapacity = -1; + public int ammoCapacity = -1; + public AmmoType ammoType = AmmoTypes.copper; public int mineTier = -1; public float buildSpeed = 1f, mineSpeed = 1f; + public float clipSize = -1; public boolean canDrown = true; public float engineOffset = 5f, engineSize = 2.5f; public float strafePenalty = 0.5f; - public float hitsize = 6f; + public float hitSize = 6f; public float itemOffsetY = 3f; public float lightRadius = 60f, lightOpacity = 0.6f; public Color lightColor = Pal.powerLight; public boolean drawCell = true, drawItems = true, drawShields = true; - public int parts = 0; public int trailLength = 3; public float trailX = 4f, trailY = -3f, trailScl = 1f; /** Whether the unit can heal blocks. Initialized in init() */ @@ -89,8 +99,8 @@ public class UnitType extends UnlockableContent{ public Seq weapons = new Seq<>(); public TextureRegion baseRegion, legRegion, region, shadowRegion, cellRegion, - occlusionRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion; - public TextureRegion[] partRegions, partCellRegions, wreckRegions; + occlusionRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion, outlineRegion; + public TextureRegion[] wreckRegions; public UnitType(String name){ super(name); @@ -112,16 +122,23 @@ public class UnitType extends UnlockableContent{ return unit; } + public Unit spawn(Team team, float x, float y){ + Unit out = create(team); + out.set(x, y); + out.add(); + return out; + } + + public Unit spawn(float x, float y){ + return spawn(state.rules.defaultTeam, x, y); + } + public boolean hasWeapons(){ return weapons.size > 0; } public void update(Unit unit){ - if(abilities.size > 0){ - for(Ability a : abilities){ - a.update(unit); - } - } + } public void landed(Unit unit){} @@ -135,33 +152,30 @@ public class UnitType extends UnlockableContent{ table.row(); table.table(bars -> { - bars.defaults().growX().height(18f).pad(4); + bars.defaults().growX().height(20f).pad(4); bars.add(new Bar("blocks.health", Pal.health, unit::healthf).blink(Color.white)); bars.row(); if(state.rules.unitAmmo){ - bars.add(new Bar("blocks.ammo", Pal.ammo, () -> unit.ammo / ammoCapacity)); + bars.add(new Bar(ammoType.icon + " " + Core.bundle.get("blocks.ammo"), ammoType.barColor, () -> unit.ammo / ammoCapacity)); bars.row(); } }).growX(); - - table.row(); - if(unit.deactivated){ - table.table(d -> { - d.left(); - d.label(() -> Core.bundle.format("bar.limitreached", unit.count(), unit.cap(), Fonts.getUnicodeStr(name))); - }).left().visible(() -> unit.deactivated); + + if(unit.controller() instanceof LogicAI){ + table.row(); + table.add(Blocks.microProcessor.emoji() + " " + Core.bundle.get("units.processorcontrol")).growX().left(); } + table.row(); } @Override public void getDependencies(Cons cons){ //units require reconstructors being researched for(Block block : content.blocks()){ - if(block instanceof Reconstructor){ - Reconstructor r = (Reconstructor)block; + if(block instanceof Reconstructor r){ for(UnitType[] recipe : r.upgrades){ //result of reconstruction is this, so it must be a dependency if(recipe[1] == this){ @@ -183,17 +197,43 @@ public class UnitType extends UnlockableContent{ public void init(){ if(constructor == null) throw new IllegalArgumentException("no constructor set up for unit '" + name + "'"); + Unit example = constructor.get(); + + //water preset + if(example instanceof WaterMovec){ + canDrown = false; + omniMovement = false; + immunities.add(StatusEffects.wet); + } + singleTarget = weapons.size <= 1; + if(itemCapacity < 0){ + itemCapacity = Math.max(Mathf.round(hitSize * 4, 10), 10); + } + //set up default range if(range < 0){ range = Float.MAX_VALUE; for(Weapon weapon : weapons){ - range = Math.min(range, weapon.bullet.range() + hitsize/2f); + range = Math.min(range, weapon.bullet.range() + hitSize /2f); } } - canHeal = weapons.contains(w -> w.bullet instanceof HealBulletType); + if(mechStride < 0){ + mechStride = 4f + (hitSize -8f)/2.1f; + } + + if(aimDst < 0){ + aimDst = weapons.contains(w -> !w.rotate) ? hitSize * 2f : hitSize / 2f; + } + + if(mechStepShake < 0){ + mechStepShake = Mathf.round((hitSize - 11f) / 9f); + mechStepParticles = hitSize > 15f; + } + + canHeal = weapons.contains(w -> w.bullet.healPercent > 0f); //add mirrored weapon variants Seq mapped = new Seq<>(); @@ -217,6 +257,15 @@ public class UnitType extends UnlockableContent{ } } this.weapons = mapped; + + //dynamically create ammo capacity based on firing rate + if(ammoCapacity < 0){ + float shotsPerSecond = weapons.sumf(w -> 60f / w.reload); + //duration of continuous fire without reload + float targetSeconds = 30; + + ammoCapacity = Math.max(1, (int)(shotsPerSecond * targetSeconds)); + } } @CallSuper @@ -232,22 +281,43 @@ public class UnitType extends UnlockableContent{ baseRegion = Core.atlas.find(name + "-base"); cellRegion = Core.atlas.find(name + "-cell", Core.atlas.find("power-cell")); occlusionRegion = Core.atlas.find("circle-shadow"); + outlineRegion = Core.atlas.find(name + "-outline"); shadowRegion = icon(Cicon.full); - partRegions = new TextureRegion[parts]; - partCellRegions = new TextureRegion[parts]; - - for(int i = 0; i < parts; i++){ - partRegions[i] = Core.atlas.find(name + "-part" + i); - partCellRegions[i] = Core.atlas.find(name + "-cell" + i); - } - wreckRegions = new TextureRegion[3]; for(int i = 0; i < wreckRegions.length; i++){ wreckRegions[i] = Core.atlas.find(name + "-wreck" + i); } } + @Override + public ItemStack[] researchRequirements(){ + ItemStack[] stacks = null; + + //calculate costs based on reconstructors or factories found + Block rec = content.blocks().find(b -> b instanceof Reconstructor && ((Reconstructor)b).upgrades.contains(u -> u[1] == this)); + + if(rec != null && rec.consumes.has(ConsumeType.item) && rec.consumes.get(ConsumeType.item) instanceof ConsumeItems){ + stacks = ((ConsumeItems)rec.consumes.get(ConsumeType.item)).items; + }else{ + UnitFactory factory = (UnitFactory)content.blocks().find(u -> u instanceof UnitFactory && ((UnitFactory)u).plans.contains(p -> p.unit == this)); + if(factory != null){ + stacks = factory.plans.find(p -> p.unit == this).requirements; + } + } + + if(stacks != null){ + ItemStack[] out = new ItemStack[stacks.length]; + for(int i = 0; i < out.length; i++){ + out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.1) * 50))); + } + + return out; + } + + return super.researchRequirements(); + } + @Override public ContentType getContentType(){ return ContentType.unit; @@ -257,7 +327,7 @@ public class UnitType extends UnlockableContent{ public void draw(Unit unit){ Mechc mech = unit instanceof Mechc ? (Mechc)unit : null; - float z = unit.elevation > 0.5f ? (lowAltitude ? Layer.flyingUnitLow : Layer.flyingUnit) : groundLayer + Mathf.clamp(hitsize/4000f, 0, 0.01f); + float z = unit.elevation > 0.5f ? (lowAltitude ? Layer.flyingUnitLow : Layer.flyingUnit) : groundLayer + Mathf.clamp(hitSize / 4000f, 0, 0.01f); if(unit.controller().isBeingControlled(player.unit())){ drawControl(unit); @@ -271,10 +341,14 @@ public class UnitType extends UnlockableContent{ Draw.z(z - 0.02f); if(mech != null){ - drawMech((Unit & Mechc)mech); + drawMech(mech); + + //side + legOffset.trns(mech.baseRotation(), 0f, Mathf.lerp(Mathf.sin(mech.walkExtend(true), 2f/Mathf.PI, 1) * mechSideSway, 0f, unit.elevation)); + + //front + legOffset.add(Tmp.v1.trns(mech.baseRotation() + 90, 0f, Mathf.lerp(Mathf.sin(mech.walkExtend(true), 1f/Mathf.PI, 1) * mechFrontSway, 0f, unit.elevation))); - float ft = Mathf.sin(mech.walkTime(), 3f * mechLegMoveScl, 3f); - legOffset.trns(mech.baseRotation(), 0f, Mathf.lerp(ft * 0.18f * sway, 0f, unit.elevation)); unit.trns(legOffset.x, legOffset.y); } @@ -290,6 +364,10 @@ public class UnitType extends UnlockableContent{ drawOcclusion(unit); + Draw.z(z - outlineSpace); + + drawOutline(unit); + Draw.z(z); if(engineSize > 0) drawEngine(unit); drawBody(unit); @@ -306,12 +384,8 @@ public class UnitType extends UnlockableContent{ unit.trns(-legOffset.x, -legOffset.y); } - if(unit.deactivated){ - drawDeactive(unit); - } - - if(abilities.size > 0){ - for(Ability a : abilities){ + if(unit.abilities.size > 0){ + for(Ability a : unit.abilities){ Draw.reset(); a.draw(unit); } @@ -320,16 +394,6 @@ public class UnitType extends UnlockableContent{ } } - public void drawDeactive(Unit unit){ - Draw.color(Color.scarlet); - Draw.alpha(0.8f); - - float size = 8f; - Draw.rect(Icon.warning.getRegion(), unit.x, unit.y, size, size); - - Draw.reset(); - } - public void drawPayload(T unit){ if(unit.hasPayload()){ Payload pay = unit.payloads().first(); @@ -354,7 +418,7 @@ public class UnitType extends UnlockableContent{ } public void drawShadow(Unit unit){ - Draw.color(shadowColor); + Draw.color(Pal.shadow); float e = Math.max(unit.elevation, visualElevation); Draw.rect(shadowRegion, unit.x + shadowTX * e, unit.y + shadowTY * e, unit.rotation - 90); Draw.color(); @@ -363,7 +427,7 @@ public class UnitType extends UnlockableContent{ public void drawOcclusion(Unit unit){ Draw.color(0, 0, 0, 0.4f); float rad = 1.6f; - float size = Math.max(region.getWidth(), region.getHeight()) * Draw.scl; + float size = Math.max(region.width, region.height) * Draw.scl; Draw.rect(occlusionRegion, unit, size * rad, size * rad); Draw.color(); } @@ -435,7 +499,6 @@ public class UnitType extends UnlockableContent{ float rotation = unit.rotation - 90; float weaponRotation = rotation + (weapon.rotate ? mount.rotation : 0); - float width = weapon.region.getWidth(); float recoil = -((mount.reload) / weapon.reload * weapon.recoil); float wx = unit.x + Angles.trnsx(rotation, weapon.x, weapon.y) + Angles.trnsx(weaponRotation, 0, recoil), wy = unit.y + Angles.trnsy(rotation, weapon.x, weapon.y) + Angles.trnsy(weaponRotation, 0, recoil); @@ -444,19 +507,53 @@ public class UnitType extends UnlockableContent{ Drawf.shadow(wx, wy, weapon.occlusion); } - Draw.rect(weapon.region, wx, wy, - width * Draw.scl * -Mathf.sign(weapon.flipSprite), - weapon.region.getHeight() * Draw.scl, + if(weapon.outlineRegion.found()){ + float z = Draw.z(); + if(!weapon.top) Draw.z(z - outlineSpace); + + Draw.rect(weapon.outlineRegion, + wx, wy, + weapon.outlineRegion.width * Draw.scl * -Mathf.sign(weapon.flipSprite), + weapon.region.height * Draw.scl, + weaponRotation); + + Draw.z(z); + } + + Draw.rect(weapon.region, + wx, wy, + weapon.region.width * Draw.scl * -Mathf.sign(weapon.flipSprite), + weapon.region.height * Draw.scl, weaponRotation); + + if(weapon.heatRegion.found() && mount.heat > 0){ + Draw.color(weapon.heatColor, mount.heat); + Draw.blend(Blending.additive); + Draw.rect(weapon.heatRegion, + wx, wy, + weapon.heatRegion.width * Draw.scl * -Mathf.sign(weapon.flipSprite), + weapon.heatRegion.height * Draw.scl, + weaponRotation); + Draw.blend(); + Draw.color(); + } } Draw.reset(); } + public void drawOutline(Unit unit){ + Draw.reset(); + + if(Core.atlas.isFound(outlineRegion)){ + Draw.rect(outlineRegion, unit.x, unit.y, unit.rotation - 90); + } + } + public void drawBody(Unit unit){ applyColor(unit); - Draw.rect(region, unit, unit.rotation - 90); + Draw.rect(region, unit.x, unit.y, unit.rotation - 90); Draw.reset(); } @@ -465,7 +562,7 @@ public class UnitType extends UnlockableContent{ applyColor(unit); Draw.color(cellColor(unit)); - Draw.rect(cellRegion, unit, unit.rotation - 90); + Draw.rect(cellRegion, unit.x, unit.y, unit.rotation - 90); Draw.reset(); } @@ -475,7 +572,7 @@ public class UnitType extends UnlockableContent{ public void drawLight(Unit unit){ if(lightRadius > 0){ - Drawf.light(unit.team, unit, lightRadius, lightColor, lightOpacity); + Drawf.light(unit.team, unit.x, unit.y, lightRadius, lightColor, lightOpacity); } } @@ -484,18 +581,13 @@ public class UnitType extends UnlockableContent{ Leg[] legs = unit.legs(); - float ssize = footRegion.getWidth() * Draw.scl * 1.5f; + float ssize = footRegion.width * Draw.scl * 1.5f; float rotation = unit.baseRotation(); for(Leg leg : legs){ Drawf.shadow(leg.base.x, leg.base.y, ssize); } - //TODO should be below/above legs - if(baseRegion.found()){ - Draw.rect(baseRegion, unit.x, unit.y, rotation); - } - //legs are drawn front first for(int j = legs.length - 1; j >= 0; j--){ int i = (j % 2 == 0 ? j/2 : legs.length - 1 - j/2); @@ -511,18 +603,18 @@ public class UnitType extends UnlockableContent{ if(leg.moving && visualElevation > 0){ float scl = visualElevation; float elev = Mathf.slope(1f - leg.stage) * scl; - Draw.color(shadowColor); + Draw.color(Pal.shadow); Draw.rect(footRegion, leg.base.x + shadowTX * elev, leg.base.y + shadowTY * elev, position.angleTo(leg.base)); Draw.color(); } Draw.rect(footRegion, leg.base.x, leg.base.y, position.angleTo(leg.base)); - Lines.stroke(legRegion.getHeight() * Draw.scl * flips); - Lines.line(legRegion, position.x, position.y, leg.joint.x, leg.joint.y, false, 0); + Lines.stroke(legRegion.height * Draw.scl * flips); + Lines.line(legRegion, position.x, position.y, leg.joint.x, leg.joint.y, false); - Lines.stroke(legBaseRegion.getHeight() * Draw.scl * flips); - Lines.line(legBaseRegion, leg.joint.x + Tmp.v1.x, leg.joint.y + Tmp.v1.y, leg.base.x, leg.base.y, false, 0); + Lines.stroke(legBaseRegion.height * Draw.scl * flips); + Lines.line(legBaseRegion, leg.joint.x + Tmp.v1.x, leg.joint.y + Tmp.v1.y, leg.base.x, leg.base.y, false); if(jointRegion.found()){ Draw.rect(jointRegion, leg.joint.x, leg.joint.y); @@ -533,17 +625,22 @@ public class UnitType extends UnlockableContent{ } } + if(baseRegion.found()){ + Draw.rect(baseRegion, unit.x, unit.y, rotation - 90); + } + Draw.reset(); } - public void drawMech(T unit){ + public void drawMech(Mechc mech){ + Unit unit = (Unit)mech; + Draw.reset(); - Draw.mixcol(Color.white, unit.hitTime); - float e = unit.elevation; - float sin = Mathf.lerp(Mathf.sin(unit.walkTime(), 3f * mechLegMoveScl, 1f), 0f, e); - float ft = sin*(2.5f + (unit.hitSize-8f)/2f); + + float sin = Mathf.lerp(Mathf.sin(mech.walkExtend(true), 2f / Mathf.PI, 1f), 0f, e); + float extension = Mathf.lerp(mech.walkExtend(false), 0, e); float boostTrns = e * 2f; Floor floor = unit.isFlying() ? Blocks.air.asFloor() : unit.floorOn(); @@ -553,21 +650,25 @@ public class UnitType extends UnlockableContent{ } for(int i : Mathf.signs){ + Draw.mixcol(Tmp.c1.set(mechLegColor).lerp(Color.white, Mathf.clamp(unit.hitTime)), Math.max(Math.max(0, i * extension / mechStride), unit.hitTime)); + Draw.rect(legRegion, - unit.x + Angles.trnsx(unit.baseRotation(), ft * i - boostTrns, -boostTrns*i), - unit.y + Angles.trnsy(unit.baseRotation(), ft * i - boostTrns, -boostTrns*i), - legRegion.getWidth() * i * Draw.scl, - legRegion.getHeight() * Draw.scl - Math.max(-sin * i, 0) * legRegion.getHeight() * 0.5f * Draw.scl, - unit.baseRotation() - 90 + 35f*i*e); + unit.x + Angles.trnsx(mech.baseRotation(), extension * i - boostTrns, -boostTrns*i), + unit.y + Angles.trnsy(mech.baseRotation(), extension * i - boostTrns, -boostTrns*i), + legRegion.width * i * Draw.scl, + legRegion.height * Draw.scl - Math.max(-sin * i, 0) * legRegion.height * 0.5f * Draw.scl, + mech.baseRotation() - 90 + 35f*i*e); } + Draw.mixcol(Color.white, unit.hitTime); + if(floor.isLiquid){ Draw.color(Color.white, floor.mapColor, unit.drownTime() * 0.4f); }else{ Draw.color(Color.white); } - Draw.rect(baseRegion, unit, unit.baseRotation() - 90); + Draw.rect(baseRegion, unit, mech.baseRotation() - 90); Draw.mixcol(); } diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index b83478cd24..2038374ad5 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -2,19 +2,20 @@ package mindustry.type; import arc.*; import arc.audio.*; +import arc.graphics.*; import arc.graphics.g2d.*; -import arc.util.ArcAnnotate.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.bullet.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.io.*; public class Weapon{ /** displayed weapon region */ public String name; /** bullet shot */ - public @NonNull BulletType bullet; + public BulletType bullet; /** shell ejection effect */ public Effect ejectEffect = Fx.none; /** whether to create a flipped copy of this weapon upon initialization. default: true */ @@ -25,6 +26,10 @@ public class Weapon{ public boolean alternate = true; /** whether to rotate toward the target independently of unit */ public boolean rotate = false; + /** whether to draw the outline on top. */ + public boolean top = true; + /** whether to hold the bullet in place while firing */ + public boolean continuous; /** rotation speed of weapon when rotation is enabled, in degrees/t*/ public float rotateSpeed = 20f; /** weapon reload in frames */ @@ -43,14 +48,20 @@ public class Weapon{ public float shootX = 0f, shootY = 3f; /** offsets of weapon position on unit */ public float x = 5f, y = 0f; + /** random spread on the X axis */ + public float xRand = 0f; /** radius of occlusion drawn under the weapon; <0 to diable */ public float occlusion = -1f; /** fraction of velocity that is random */ public float velocityRnd = 0f; /** delay in ticks between shots */ + public float firstShotDelay = 0; + /** delay in ticks between shots */ public float shotDelay = 0; /** The half-radius of the cone in which shooting will start. */ public float shootCone = 5f; + /** ticks to cool down the heat region */ + public float cooldownTime = 20f; /** whether shooter rotation is ignored when shooting. */ public boolean ignoreRotation = false; /** min velocity required for this weapon to shoot */ @@ -59,8 +70,22 @@ public class Weapon{ public int otherSide = -1; /** sound used for shooting */ public Sound shootSound = Sounds.pew; + /** sound used for weapons that have a delay */ + public Sound chargeSound = Sounds.none; + /** sound played when there is nothing to shoot */ + public Sound noAmmoSound = Sounds.click; /** displayed region (autoloaded) */ public TextureRegion region; + /** heat region, must be same size as region (optional) */ + public TextureRegion heatRegion; + /** outline region to display if top is false */ + public TextureRegion outlineRegion; + /** heat region tint */ + public Color heatColor = Pal.turretHeat; + /** status effect applied when shooting */ + public StatusEffect shootStatus = StatusEffects.none; + /** status effect duration when shot */ + public float shootStatusDuration = 60f * 5f; public Weapon(String name){ this.name = name; @@ -78,6 +103,8 @@ public class Weapon{ public void load(){ region = Core.atlas.find(name, Core.atlas.find("clear")); + heatRegion = Core.atlas.find(name + "-heat"); + outlineRegion = Core.atlas.find(name + "-outline"); } } diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 163fa7f211..8fb30aecb6 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -4,6 +4,7 @@ import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -14,9 +15,10 @@ import mindustry.world.blocks.*; import static mindustry.Vars.*; -public abstract class Weather extends MappableContent{ +public abstract class Weather extends UnlockableContent{ /** Default duration of this weather event in ticks. */ public float duration = 9f * Time.toMinutes; + public float opacityMultiplier = 1f; public Attributes attrs = new Attributes(); //internals @@ -89,14 +91,24 @@ public abstract class Weather extends MappableContent{ } + @Override + public void displayInfo(Table table){ + //do not + } + + @Override + public boolean isHidden(){ + return true; + } + @Override public ContentType getContentType(){ return ContentType.weather; } @Remote(called = Loc.server) - public static void createWeather(Weather weather, float intensity, float duration){ - weather.create(intensity, duration); + public static void createWeather(Weather weather, float intensity, float duration, float windX, float windY){ + weather.create(intensity, duration).windVector.set(windX, windY); } public static class WeatherEntry{ @@ -104,14 +116,14 @@ public abstract class Weather extends MappableContent{ public Weather weather; /** Minimum and maximum spacing between weather events. Does not include the time of the event itself. */ public float minFrequency, maxFrequency, minDuration, maxDuration; - /** Cooldown time before the next weather event takes place. */ + /** Cooldown time before the next weather event takes place This is *state*, not configuration. */ public float cooldown; /** Intensity of the weather produced. */ public float intensity = 1f; /** Creates a weather entry with some approximate weather values. */ public WeatherEntry(Weather weather){ - this(weather, weather.duration * 1f, weather.duration * 3f, weather.duration / 2f, weather.duration * 1.5f); + this(weather, weather.duration * 3f, weather.duration * 6f, weather.duration / 2f, weather.duration * 1.5f); } public WeatherEntry(Weather weather, float minFrequency, float maxFrequency, float minDuration, float maxDuration){ @@ -132,12 +144,12 @@ public abstract class Weather extends MappableContent{ @EntityDef(value = {WeatherStatec.class}, pooled = true, isFinal = false) @Component(base = true) - abstract static class WeatherStateComp implements Drawc{ + abstract static class WeatherStateComp implements Drawc, Syncc{ private static final float fadeTime = 60 * 4; Weather weather; float intensity = 1f, opacity = 0f, life, effectTimer; - Vec2 windVector = new Vec2(); + Vec2 windVector = new Vec2().setToRandomDirection(); void init(Weather weather){ this.weather = weather; @@ -146,15 +158,15 @@ public abstract class Weather extends MappableContent{ @Override public void update(){ if(life < fadeTime){ - opacity = life / fadeTime; + opacity = Math.min(life / fadeTime, opacity); }else{ opacity = Mathf.lerpDelta(opacity, 1f, 0.004f); } life -= Time.delta; - weather.update(base()); - weather.updateEffect(base()); + weather.update(self()); + weather.updateEffect(self()); if(life < 0){ remove(); @@ -166,15 +178,15 @@ public abstract class Weather extends MappableContent{ if(renderer.weatherAlpha() > 0.0001f){ Draw.draw(Layer.weather, () -> { weather.rand.setSeed(0); - Draw.alpha(renderer.weatherAlpha() * opacity); - weather.drawOver(base()); + Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier); + weather.drawOver(self()); Draw.reset(); }); Draw.draw(Layer.debris, () -> { weather.rand.setSeed(0); - Draw.alpha(renderer.weatherAlpha() * opacity); - weather.drawUnder(base()); + Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier); + weather.drawUnder(self()); Draw.reset(); }); } diff --git a/core/src/mindustry/ui/Bar.java b/core/src/mindustry/ui/Bar.java index 7c54dac2da..d58ad53c37 100644 --- a/core/src/mindustry/ui/Bar.java +++ b/core/src/mindustry/ui/Bar.java @@ -21,7 +21,7 @@ public class Bar extends Element{ public Bar(String name, Color color, Floatp fraction){ this.fraction = fraction; - this.name = Core.bundle.get(name); + this.name = Core.bundle.get(name, name); this.blinkColor.set(color); lastValue = value = fraction.get(); setColor(color); @@ -80,11 +80,11 @@ public class Bar extends Element{ Drawable top = Tex.barTop; float topWidth = width * value; - if(topWidth > Core.atlas.find("bar-top").getWidth()){ + if(topWidth > Core.atlas.find("bar-top").width){ top.draw(x, y, topWidth, height); }else{ if(ScissorStack.push(scissor.set(x, y, topWidth, height))){ - top.draw(x, y, Core.atlas.find("bar-top").getWidth(), height); + top.draw(x, y, Core.atlas.find("bar-top").width, height); ScissorStack.pop(); } } diff --git a/core/src/mindustry/ui/BorderImage.java b/core/src/mindustry/ui/BorderImage.java index fc1c94f044..262a02a197 100644 --- a/core/src/mindustry/ui/BorderImage.java +++ b/core/src/mindustry/ui/BorderImage.java @@ -2,9 +2,9 @@ package mindustry.ui; import arc.graphics.*; import arc.graphics.g2d.*; -import arc.scene.ui.Image; -import arc.scene.ui.layout.Scl; -import mindustry.graphics.Pal; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.graphics.*; public class BorderImage extends Image{ public float thickness = 4f; diff --git a/core/src/mindustry/ui/ContentDisplay.java b/core/src/mindustry/ui/ContentDisplay.java index 9a3edace27..6eefedcd53 100644 --- a/core/src/mindustry/ui/ContentDisplay.java +++ b/core/src/mindustry/ui/ContentDisplay.java @@ -1,10 +1,11 @@ package mindustry.ui; import arc.*; -import arc.struct.*; import arc.graphics.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; +import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; @@ -129,7 +130,7 @@ public class ContentDisplay{ public static void displayUnit(Table table, UnitType unit){ table.table(title -> { - title.image(unit.icon(Cicon.xlarge)).size(8 * 6); + title.image(unit.icon(Cicon.xlarge)).size(8 * 6).scaling(Scaling.fit); title.add("[accent]" + unit.localizedName).padLeft(5); }); @@ -149,10 +150,16 @@ public class ContentDisplay{ table.left().defaults().fillX(); - table.add(Core.bundle.format("unit.health", unit.health)); - table.row(); - table.add(Core.bundle.format("unit.speed", Strings.fixed(unit.speed, 1))); - table.row(); + Unit inst = unit.constructor.get(); + + //TODO more stats + table.add(Core.bundle.format("unit.health", unit.health)).row(); + table.add(Core.bundle.format("unit.speed", Strings.fixed(unit.speed, 1))).row(); + table.add(Core.bundle.format("unit.itemcapacity", unit.itemCapacity)).row(); + + if(inst instanceof Minerc) table.add(Core.bundle.format("unit.minespeed", (int)(unit.mineSpeed * 100f))).row(); + if(inst instanceof Builderc) table.add(Core.bundle.format("unit.buildspeed", (int)(unit.buildSpeed * 100f))).row(); + table.row(); } } diff --git a/core/src/mindustry/ui/CoreItemsDisplay.java b/core/src/mindustry/ui/CoreItemsDisplay.java index 99f5624114..7322f15e70 100644 --- a/core/src/mindustry/ui/CoreItemsDisplay.java +++ b/core/src/mindustry/ui/CoreItemsDisplay.java @@ -39,7 +39,8 @@ public class CoreItemsDisplay extends Table{ for(Item item : content.items()){ if(usedItems.contains(item)){ image(item.icon(Cicon.small)).padRight(3); - label(() -> core == null ? "0" : UI.formatAmount(core.items.get(item))).padRight(3); + //TODO leaks garbage + label(() -> core == null ? "0" : UI.formatAmount(core.items.get(item))).padRight(3).left(); if(++i % 4 == 0){ row(); diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index 15a7389b8f..cbc0100943 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -72,7 +72,7 @@ public class Fonts{ public static void loadContentIcons(){ Seq fonts = Seq.with(Fonts.chat, Fonts.def, Fonts.outline); - Texture uitex = Core.atlas.find("logo").getTexture(); + Texture uitex = Core.atlas.find("logo").texture; int size = (int)(Fonts.def.getData().lineHeight/Fonts.def.getData().scaleY); try(Scanner scan = new Scanner(Core.files.internal("icons/icons.properties").read(512))){ @@ -84,7 +84,7 @@ public class Fonts{ int ch = Integer.parseInt(character); TextureRegion region = Core.atlas.find(texture); - if(region.getTexture() != uitex){ + if(region.texture != uitex){ continue; //throw new IllegalArgumentException("Font icon '" + texture + "' is not in the UI texture."); } @@ -98,10 +98,10 @@ public class Fonts{ glyph.srcY = 0; glyph.width = size; glyph.height = size; - glyph.u = region.getU(); - glyph.v = region.getV2(); - glyph.u2 = region.getU2(); - glyph.v2 = region.getV(); + glyph.u = region.u; + glyph.v = region.v2; + glyph.u2 = region.u2; + glyph.v2 = region.v; glyph.xoffset = 0; glyph.yoffset = -size; glyph.xadvance = size; @@ -115,7 +115,9 @@ public class Fonts{ /** Called from a static context for use in the loading screen.*/ public static void loadDefaultFont(){ - UI.packer = new PixmapPacker(2048, 2048, Format.rgba8888, 2, true); + int max = Gl.getInt(Gl.maxTextureSize); + + UI.packer = new PixmapPacker(max >= 4096 ? 4096 : 2048, 2048, Format.rgba8888, 2, true); FileHandleResolver resolver = new InternalFileHandleResolver(); Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver)); Core.assets.setLoader(Font.class, null, new FreetypeFontLoader(resolver){ @@ -160,21 +162,21 @@ public class Fonts{ //grab all textures from the ui page, remove all the regions assigned to it, then copy them over to Fonts.packer and replace the texture in this atlas. //grab old UI texture and regions... - Texture texture = atlas.find("logo").getTexture(); + Texture texture = atlas.find("logo").texture; Page page = UI.packer.getPages().first(); - Seq regions = atlas.getRegions().select(t -> t.getTexture() == texture); + Seq regions = atlas.getRegions().select(t -> t.texture == texture); for(AtlasRegion region : regions){ //get new pack rect page.setDirty(false); Rect rect = UI.packer.pack(region.name + (region.splits != null ? ".9" : ""), atlas.getPixmap(region)); //set new texture - region.setTexture(UI.packer.getPages().first().getTexture()); + region.texture = UI.packer.getPages().first().getTexture(); //set its new position region.set((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height); //add old texture - atlas.getTextures().add(region.getTexture()); + atlas.getTextures().add(region.texture); } //remove old texture, it will no longer be used @@ -191,7 +193,7 @@ public class Fonts{ if(g == null) throw new IllegalArgumentException("No glyph: " + glyph + " (" + (int)glyph + ")"); float size = Math.max(g.width, g.height); - TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(font.getRegion().getTexture(), g.u, g.v2, g.u2, g.v)){ + TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(font.getRegion().texture, g.u, g.v2, g.u2, g.v)){ @Override public void draw(float x, float y, float width, float height){ Draw.color(Tmp.c1.set(tint).mul(Draw.getColor()).toFloatBits()); diff --git a/core/src/mindustry/ui/GridImage.java b/core/src/mindustry/ui/GridImage.java index 13d786a5be..f80262d5ac 100644 --- a/core/src/mindustry/ui/GridImage.java +++ b/core/src/mindustry/ui/GridImage.java @@ -1,7 +1,7 @@ package mindustry.ui; -import arc.graphics.g2d.Fill; -import arc.scene.Element; +import arc.graphics.g2d.*; +import arc.scene.*; public class GridImage extends Element{ private int imageWidth, imageHeight; diff --git a/core/src/mindustry/ui/IntFormat.java b/core/src/mindustry/ui/IntFormat.java index 187e21993f..2ca0e9de1f 100644 --- a/core/src/mindustry/ui/IntFormat.java +++ b/core/src/mindustry/ui/IntFormat.java @@ -1,8 +1,8 @@ package mindustry.ui; -import arc.Core; -import arc.func.Func; +import arc.*; +import arc.func.*; /** * A low-garbage way to format bundle strings. diff --git a/core/src/mindustry/ui/ItemDisplay.java b/core/src/mindustry/ui/ItemDisplay.java index 6407a95d0a..d0cedc5ba1 100644 --- a/core/src/mindustry/ui/ItemDisplay.java +++ b/core/src/mindustry/ui/ItemDisplay.java @@ -1,8 +1,7 @@ package mindustry.ui; -import arc.scene.ui.layout.Table; -import mindustry.type.Item; -import mindustry.type.ItemStack; +import arc.scene.ui.layout.*; +import mindustry.type.*; /** An item image with text. */ public class ItemDisplay extends Table{ @@ -14,7 +13,7 @@ public class ItemDisplay extends Table{ } public ItemDisplay(Item item, int amount, boolean showName){ - add(new ItemImage(new ItemStack(item, amount))).size(8 * 4).padRight(amount > 99 ? 12 : 0); + add(new ItemImage(new ItemStack(item, amount))); if(showName) add(item.localizedName).padLeft(4 + amount > 99 ? 4 : 0); this.item = item; diff --git a/core/src/mindustry/ui/ItemImage.java b/core/src/mindustry/ui/ItemImage.java index aed8997f5f..fb26769c98 100644 --- a/core/src/mindustry/ui/ItemImage.java +++ b/core/src/mindustry/ui/ItemImage.java @@ -8,11 +8,17 @@ import mindustry.type.*; public class ItemImage extends Stack{ public ItemImage(TextureRegion region, int amount){ - Table t = new Table().left().bottom(); - t.add(amount + "").name("item-label"); - add(new Image(region)); - add(t); + add(new Table(o -> { + o.left(); + o.add(new Image(region)).size(32f); + })); + + add(new Table(t -> { + t.left().bottom(); + t.add(amount + ""); + t.pack(); + })); } public ItemImage(TextureRegion region){ @@ -23,12 +29,18 @@ public class ItemImage extends Stack{ } public ItemImage(ItemStack stack){ - add(new Image(stack.item.icon(Cicon.medium))); + + add(new Table(o -> { + o.left(); + o.add(new Image(stack.item.icon(Cicon.medium))).size(32f); + })); if(stack.amount != 0){ - Table t = new Table().left().bottom(); - t.add(stack.amount + "").name("item-label").style(Styles.outlineLabel); - add(t); + add(new Table(t -> { + t.left().bottom(); + t.add(stack.amount + "").style(Styles.outlineLabel); + t.pack(); + })); } } } diff --git a/core/src/mindustry/ui/ItemsDisplay.java b/core/src/mindustry/ui/ItemsDisplay.java index a1dc45d7a0..a6dec71bc7 100644 --- a/core/src/mindustry/ui/ItemsDisplay.java +++ b/core/src/mindustry/ui/ItemsDisplay.java @@ -5,7 +5,7 @@ import arc.math.*; import arc.scene.actions.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.core.*; import mindustry.gen.*; import mindustry.graphics.*; diff --git a/core/src/mindustry/ui/Links.java b/core/src/mindustry/ui/Links.java index 4f14c746d5..dd12c675d5 100644 --- a/core/src/mindustry/ui/Links.java +++ b/core/src/mindustry/ui/Links.java @@ -1,11 +1,11 @@ package mindustry.ui; -import arc.Core; +import arc.*; +import arc.graphics.*; import arc.scene.style.*; -import arc.util.Strings; -import arc.graphics.Color; +import arc.util.*; import mindustry.gen.*; -import mindustry.graphics.Pal; +import mindustry.graphics.*; public class Links{ private static LinkEntry[] links; diff --git a/core/src/mindustry/ui/LiquidDisplay.java b/core/src/mindustry/ui/LiquidDisplay.java index 6c645e6218..c2d71fee25 100644 --- a/core/src/mindustry/ui/LiquidDisplay.java +++ b/core/src/mindustry/ui/LiquidDisplay.java @@ -1,12 +1,11 @@ package mindustry.ui; -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; +import arc.graphics.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.type.*; +import mindustry.world.meta.*; /** An ItemDisplay, but for liquids. */ public class LiquidDisplay extends Table{ diff --git a/core/src/mindustry/ui/Minimap.java b/core/src/mindustry/ui/Minimap.java index dfec82c9fd..53736910f1 100644 --- a/core/src/mindustry/ui/Minimap.java +++ b/core/src/mindustry/ui/Minimap.java @@ -1,9 +1,9 @@ package mindustry.ui; -import arc.Core; -import arc.graphics.g2d.Draw; -import arc.input.KeyCode; -import arc.scene.Element; +import arc.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.scene.*; import arc.scene.event.*; import arc.scene.ui.layout.*; import mindustry.gen.*; diff --git a/core/src/mindustry/ui/MobileButton.java b/core/src/mindustry/ui/MobileButton.java index 736247d45b..5174613b88 100644 --- a/core/src/mindustry/ui/MobileButton.java +++ b/core/src/mindustry/ui/MobileButton.java @@ -1,8 +1,8 @@ package mindustry.ui; import arc.scene.style.*; -import arc.scene.ui.ImageButton; -import arc.util.Align; +import arc.scene.ui.*; +import arc.util.*; public class MobileButton extends ImageButton{ diff --git a/core/src/mindustry/ui/MultiReqImage.java b/core/src/mindustry/ui/MultiReqImage.java index ebbb4fc359..a887a85299 100644 --- a/core/src/mindustry/ui/MultiReqImage.java +++ b/core/src/mindustry/ui/MultiReqImage.java @@ -1,8 +1,8 @@ package mindustry.ui; -import arc.struct.Seq; -import arc.scene.ui.layout.Stack; -import arc.util.Time; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; public class MultiReqImage extends Stack{ private Seq displays = new Seq<>(); diff --git a/core/src/mindustry/ui/ReqImage.java b/core/src/mindustry/ui/ReqImage.java index eef8591f63..a02ad7e5d0 100644 --- a/core/src/mindustry/ui/ReqImage.java +++ b/core/src/mindustry/ui/ReqImage.java @@ -1,12 +1,11 @@ package mindustry.ui; -import arc.func.Boolp; +import arc.func.*; 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; +import arc.scene.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.graphics.*; public class ReqImage extends Stack{ private final Boolp valid; diff --git a/core/src/mindustry/ui/Styles.java b/core/src/mindustry/ui/Styles.java index 6d47121165..13e97202e5 100644 --- a/core/src/mindustry/ui/Styles.java +++ b/core/src/mindustry/ui/Styles.java @@ -1,7 +1,6 @@ package mindustry.ui; import arc.*; -import mindustry.annotations.Annotations.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.graphics.g2d.TextureAtlas.*; @@ -16,6 +15,7 @@ import arc.scene.ui.ScrollPane.*; import arc.scene.ui.Slider.*; import arc.scene.ui.TextButton.*; import arc.scene.ui.TextField.*; +import mindustry.annotations.Annotations.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -54,9 +54,9 @@ public class Styles{ }}; waveb = new ButtonStyle(){{ - up = buttonEdge4; - over = buttonEdgeOver4; - disabled = buttonEdge4; + up = wavepane; + over = wavepane; //TODO wrong + disabled = wavepane; }}; defaultt = new TextButtonStyle(){{ @@ -183,6 +183,9 @@ public class Styles{ over = buttonRightOver; down = buttonRightDown; up = buttonRight; + disabled = buttonRightDisabled; + imageDisabledColor = Color.clear; + imageUpColor = Color.white; }}; emptyi = new ImageButtonStyle(){{ imageDownColor = Pal.accent; diff --git a/core/src/mindustry/ui/dialogs/AboutDialog.java b/core/src/mindustry/ui/dialogs/AboutDialog.java index 3ba3b5d7e2..0e86d0ee64 100644 --- a/core/src/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/mindustry/ui/dialogs/AboutDialog.java @@ -1,10 +1,10 @@ package mindustry.ui.dialogs; import arc.*; -import arc.struct.*; import arc.graphics.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.game.EventType.*; import mindustry.gen.*; diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index 947afa0141..0ee1960f9f 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -1,8 +1,8 @@ package mindustry.ui.dialogs; -import arc.scene.ui.ScrollPane; -import arc.scene.ui.layout.Table; -import mindustry.ctype.UnlockableContent; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.ctype.*; public class ContentInfoDialog extends BaseDialog{ diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 25dc6408b6..42fac7be72 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -3,24 +3,29 @@ package mindustry.ui.dialogs; import arc.*; import arc.func.*; import arc.graphics.*; +import arc.math.*; import arc.scene.style.*; import arc.scene.ui.*; +import arc.scene.ui.ImageButton.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.content.*; +import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.type.Weather.*; import mindustry.ui.*; import mindustry.world.*; +import static arc.util.Time.*; import static mindustry.Vars.*; public class CustomRulesDialog extends BaseDialog{ - private Table main; Rules rules; + private Table main; private Prov resetter; private LoadoutDialog loadoutDialog; private BaseDialog banDialog; @@ -135,6 +140,7 @@ public class CustomRulesDialog extends BaseDialog{ title("@rules.title.resourcesbuilding"); check("@rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources); check("@rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions); + check("@rules.schematic", b-> rules.schematicsAllowed = b, () -> rules.schematicsAllowed); number("@rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources); number("@rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier); number("@rules.deconstructrefundmultiplier", false, f -> rules.deconstructRefundMultiplier = f, () -> rules.deconstructRefundMultiplier, () -> !rules.infiniteResources); @@ -160,10 +166,14 @@ public class CustomRulesDialog extends BaseDialog{ title("@rules.title.enemy"); check("@rules.attack", b -> rules.attackMode = b, () -> rules.attackMode); + check("@rules.buildai", b -> rules.teams.get(rules.waveTeam).ai = rules.teams.get(rules.waveTeam).infiniteResources = b, () -> rules.teams.get(rules.waveTeam).ai); number("@rules.enemycorebuildradius", f -> rules.enemyCoreBuildRadius = f * tilesize, () -> Math.min(rules.enemyCoreBuildRadius / tilesize, 200)); title("@rules.title.environment"); + check("@rules.explosions", b -> rules.damageExplosions = b, () -> rules.damageExplosions); + check("@rules.fire", b -> rules.fire = b, () -> rules.fire); check("@rules.lighting", b -> rules.lighting = b, () -> rules.lighting); + check("@rules.enemyLights", b -> rules.enemyLights = b, () -> rules.enemyLights); main.button(b -> { b.left(); @@ -173,10 +183,9 @@ public class CustomRulesDialog extends BaseDialog{ }}).grow(); }).margin(4).size(50f).padRight(10); b.add("@rules.ambientlight"); - }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f); - main.row(); + }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f).row(); - //TODO add weather patterns + main.button("@rules.weather", this::weatherDialog).width(250f).left().row(); } void number(String text, Floatc cons, Floatp prov){ @@ -211,4 +220,120 @@ public class CustomRulesDialog extends BaseDialog{ main.image().color(Pal.accent).height(3f).padRight(100f).padBottom(20); main.row(); } + + Cell field(Table table, float value, Floatc setter){ + return table.field(Strings.autoFixed(value, 2), v -> setter.get(Strings.parseFloat(v))) + .valid(Strings::canParsePositiveFloat) + .size(90f, 40f).pad(2f).addInputDialog(); + } + + void weatherDialog(){ + BaseDialog dialog = new BaseDialog("@rules.weather"); + Runnable[] rebuild = {null}; + + dialog.cont.pane(base -> { + + rebuild[0] = () -> { + base.clearChildren(); + int cols = Math.max(1, Core.graphics.getWidth() / 460); + int idx = 0; + + for(WeatherEntry entry : rules.weather){ + base.top(); + //main container + base.table(Tex.pane, c -> { + c.margin(0); + + //icons to perform actions + c.table(Tex.whiteui, t -> { + t.setColor(Pal.gray); + + t.top().left(); + t.add(entry.weather.localizedName).left().padLeft(6); + + t.add().growX(); + + ImageButtonStyle style = Styles.geni; + t.defaults().size(42f); + + t.button(Icon.cancel, style, () -> { + rules.weather.remove(entry); + rebuild[0].run(); + }); + }).growX(); + + c.row(); + + //all the options + c.table(f -> { + f.marginLeft(4); + f.left().top(); + + f.defaults().padRight(4).left(); + + f.add("@rules.weather.duration"); + field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes); + f.add("@waves.to"); + field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes); + f.add("@unit.minutes"); + + f.row(); + + f.add("@rules.weather.frequency"); + field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes); + f.add("@waves.to"); + field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes); + f.add("@unit.minutes"); + + //intensity can't currently be customized + + }).grow().left().pad(6).top(); + }).width(410f).pad(3).top().left().fillY(); + + if(++idx % cols == 0){ + base.row(); + } + } + }; + + rebuild[0].run(); + }).grow(); + + dialog.addCloseButton(); + + dialog.buttons.button("@add", Icon.add, () -> { + BaseDialog addd = new BaseDialog("@add"); + addd.cont.pane(t -> { + t.background(Tex.button); + int i = 0; + for(Weather weather : content.getBy(ContentType.weather)){ + + t.button(weather.localizedName, Styles.cleart, () -> { + rules.weather.add(new WeatherEntry(weather)); + rebuild[0].run(); + + addd.hide(); + }).size(140f, 50f); + if(++i % 2 == 0) t.row(); + } + }); + addd.addCloseButton(); + addd.show(); + }).width(170f); + + //reset cooldown to random number + dialog.hidden(() -> { + float sum = 0; + Seq sh = rules.weather.copy(); + sh.shuffle(); + + for(WeatherEntry w : sh){ + //add the previous cooldowns to the sum so weather events are staggered and don't happen all at once. + w.cooldown = sum + Mathf.random(w.minFrequency, w.maxFrequency); + sum += w.cooldown; + } + }); + + dialog.show(); + } } diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java index 2506da87d9..1a718e318a 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -1,12 +1,13 @@ package mindustry.ui.dialogs; import arc.*; -import arc.input.*; -import arc.struct.*; import arc.graphics.*; +import arc.input.*; +import arc.math.*; import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.ctype.*; @@ -14,7 +15,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; -import static mindustry.Vars.ui; +import static mindustry.Vars.*; public class DatabaseDialog extends BaseDialog{ @@ -49,14 +50,13 @@ public class DatabaseDialog extends BaseDialog{ table.table(list -> { list.left(); - int maxWidth = Core.graphics.isPortrait() ? 7 : 13; - + int cols = Mathf.clamp((Core.graphics.getWidth() - 30) / (32 + 10), 1, 18); int count = 0; for(int i = 0; i < array.size; i++){ UnlockableContent unlock = (UnlockableContent)array.get(i); - Image image = unlocked(unlock) ? new Image(unlock.icon(Cicon.medium)) : new Image(Icon.lock, Pal.gray); + Image image = unlocked(unlock) ? new Image(unlock.icon(Cicon.medium)).setScaling(Scaling.fit) : new Image(Icon.lock, Pal.gray); list.add(image).size(8*4).pad(3); ClickListener listener = new ClickListener(); image.addListener(listener); @@ -77,7 +77,7 @@ public class DatabaseDialog extends BaseDialog{ image.addListener(new Tooltip(t -> t.background(Tex.button).add(unlock.localizedName))); } - if((++count) % maxWidth == 0){ + if((++count) % cols == 0){ list.row(); } } diff --git a/core/src/mindustry/ui/dialogs/DiscordDialog.java b/core/src/mindustry/ui/dialogs/DiscordDialog.java index 3413a4a67b..600fe39e16 100644 --- a/core/src/mindustry/ui/dialogs/DiscordDialog.java +++ b/core/src/mindustry/ui/dialogs/DiscordDialog.java @@ -1,10 +1,10 @@ package mindustry.ui.dialogs; -import arc.Core; -import arc.graphics.Color; -import arc.scene.ui.Dialog; +import arc.*; +import arc.graphics.*; +import arc.scene.ui.*; import mindustry.gen.*; -import mindustry.graphics.Pal; +import mindustry.graphics.*; import static mindustry.Vars.*; diff --git a/core/src/mindustry/ui/dialogs/FileChooser.java b/core/src/mindustry/ui/dialogs/FileChooser.java index 78a3c1a459..2c8f2954b9 100644 --- a/core/src/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/mindustry/ui/dialogs/FileChooser.java @@ -17,7 +17,7 @@ import java.util.*; public class FileChooser extends BaseDialog{ private static final Fi homeDirectory = Core.files.absolute(Core.files.getExternalStoragePath()); - static Fi lastDirectory = homeDirectory; + static Fi lastDirectory = Core.files.absolute(Core.settings.getString("lastDirectory", homeDirectory.absolutePath())); private Table files; Fi directory = lastDirectory; @@ -108,7 +108,7 @@ public class FileChooser extends BaseDialog{ ImageButton home = new ImageButton(Icon.home); home.clicked(() -> { directory = homeDirectory; - lastDirectory = directory; + setLastDirectory(directory); updateFiles(true); }); @@ -187,7 +187,7 @@ public class FileChooser extends BaseDialog{ TextButton upbutton = new TextButton(".." + directory.toString(), Styles.clearTogglet); upbutton.clicked(() -> { directory = directory.parent(); - lastDirectory = directory; + setLastDirectory(directory); updateFiles(true); }); @@ -217,7 +217,7 @@ public class FileChooser extends BaseDialog{ updateFileFieldStatus(); }else{ directory = directory.child(filename); - lastDirectory = directory; + setLastDirectory(directory); updateFiles(true); } }); @@ -242,6 +242,11 @@ public class FileChooser extends BaseDialog{ if(open) filefield.clearText(); } + public static void setLastDirectory(Fi directory){ + lastDirectory = directory; + Core.settings.put("lastDirectory", directory.absolutePath()); + } + private String shorten(String string){ int max = 30; if(string.length() <= max){ @@ -269,14 +274,14 @@ public class FileChooser extends BaseDialog{ if(!canBack()) return; index--; directory = history.get(index - 1); - lastDirectory = directory; + setLastDirectory(directory); updateFiles(false); } public void forward(){ if(!canForward()) return; directory = history.get(index); - lastDirectory = directory; + setLastDirectory(directory); index++; updateFiles(false); } diff --git a/core/src/mindustry/ui/dialogs/GameOverDialog.java b/core/src/mindustry/ui/dialogs/GameOverDialog.java index b53627b835..b9967e6564 100644 --- a/core/src/mindustry/ui/dialogs/GameOverDialog.java +++ b/core/src/mindustry/ui/dialogs/GameOverDialog.java @@ -29,7 +29,7 @@ public class GameOverDialog extends BaseDialog{ } void rebuild(){ - title.setText(state.launched ? "@launch.title" : "@gameover"); + title.setText("@gameover"); buttons.clear(); cont.clear(); @@ -79,7 +79,7 @@ public class GameOverDialog extends BaseDialog{ } if(state.hasSector()){ - RankResult result = state.stats.calculateRank(state.getSector(), state.launched); + RankResult result = state.stats.calculateRank(state.getSector(), true); t.add(Core.bundle.format("stat.rank", result.rank + result.modifier)); t.row(); } diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 92776ab729..1c80418708 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -30,6 +30,7 @@ public class JoinDialog extends BaseDialog{ Table global = new Table(); Table hosts = new Table(); int totalHosts; + int refreshes; public JoinDialog(){ super("@joingame"); @@ -95,6 +96,8 @@ public class JoinDialog extends BaseDialog{ } void refreshAll(){ + refreshes ++; + refreshLocal(); refreshRemote(); refreshGlobal(); @@ -262,14 +265,10 @@ public class JoinDialog extends BaseDialog{ cont.clear(); cont.table(t -> { t.add("@name").padRight(10); - if(!steam){ - t.field(Core.settings.getString("name"), text -> { - player.name(text); - Core.settings.put("name", text); - }).grow().pad(8).addInputDialog(maxNameLength); - }else{ - t.add(player.name).update(l -> l.setColor(player.color())).grow().pad(8); - } + t.field(Core.settings.getString("name"), text -> { + player.name(text); + Core.settings.put("name", text); + }).grow().pad(8).addInputDialog(maxNameLength); ImageButton button = t.button(Tex.whiteui, Styles.clearFulli, 40, () -> { new PaletteDialog().show(color -> { @@ -331,12 +330,15 @@ public class JoinDialog extends BaseDialog{ } void refreshGlobal(){ + int cur = refreshes; + global.clear(); global.background(null); for(String host : defaultServers){ String resaddress = host.contains(":") ? host.split(":")[0] : host; int resport = host.contains(":") ? Strings.parseInt(host.split(":")[1]) : port; net.pingHost(resaddress, resport, res -> { + if(refreshes != cur) return; res.port = resport; addGlobalHost(res); }, e -> {}); @@ -410,7 +412,7 @@ public class JoinDialog extends BaseDialog{ void safeConnect(String ip, int port, int version){ if(version != Version.build && Version.build != -1 && version != -1){ ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" + - Core.bundle.format("server.versions", Version.build, version)); + Core.bundle.format("server.versions", Version.build, version)); }else{ connect(ip, port); } @@ -431,7 +433,7 @@ public class JoinDialog extends BaseDialog{ } //get servers - Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonURL, result -> { + Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonV6URL, result -> { try{ Jval val = Jval.read(result.getResultAsString()); Core.app.post(() -> { diff --git a/core/src/mindustry/ui/dialogs/LanguageDialog.java b/core/src/mindustry/ui/dialogs/LanguageDialog.java index 979f35a7a9..41519c32fd 100644 --- a/core/src/mindustry/ui/dialogs/LanguageDialog.java +++ b/core/src/mindustry/ui/dialogs/LanguageDialog.java @@ -1,17 +1,15 @@ package mindustry.ui.dialogs; -import arc.Core; -import arc.struct.*; +import arc.*; import arc.scene.ui.*; -import arc.scene.ui.layout.Table; -import arc.util.Log; -import arc.util.Strings; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; import mindustry.ui.*; -import java.util.Locale; +import java.util.*; -import static mindustry.Vars.locales; -import static mindustry.Vars.ui; +import static mindustry.Vars.*; public class LanguageDialog extends BaseDialog{ private Locale lastLocale; diff --git a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java index 9634777ab9..acb240d7c9 100644 --- a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java +++ b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java @@ -18,10 +18,8 @@ import static mindustry.Vars.*; /** Dialog for selecting loadout at sector launch. */ public class LaunchLoadoutDialog extends BaseDialog{ LoadoutDialog loadout = new LoadoutDialog(); - //total as a map - ObjectIntMap totalMap = new ObjectIntMap<>(); //total required items - Seq total = new Seq<>(); + ItemSeq total = new ItemSeq(); //currently selected schematic Schematic selected; //validity of loadout items @@ -34,21 +32,14 @@ public class LaunchLoadoutDialog extends BaseDialog{ public void show(CoreBlock core, Building build, Runnable confirm){ cont.clear(); buttons.clear(); - totalMap.clear(); - - Seq stacks = universe.getLaunchResources(); addCloseButton(); //updates sum requirements Runnable update = () -> { - totalMap.clear(); total.clear(); - selected.requirements().each(i -> totalMap.increment(i.item, i.amount)); - universe.getLaunchResources().each(i -> totalMap.increment(i.item, i.amount)); - for(Item item : content.items()){ - if(totalMap.containsKey(item)) total.add(new ItemStack(item, totalMap.get(item))); - } + selected.requirements().each(total::add); + universe.getLaunchResources().each(total::add); valid = build.items.has(total); }; @@ -56,10 +47,18 @@ public class LaunchLoadoutDialog extends BaseDialog{ table.clearChildren(); int i = 0; + ItemSeq schems = selected.requirements(); + ItemSeq launches = universe.getLaunchResources(); + for(ItemStack s : total){ table.image(s.item.icon(Cicon.small)).left(); - table.add((build.items.has(s.item, s.amount)) ? "[lightgray]" + s.amount + "" : - "[scarlet]" + (Math.min(build.items.get(s.item), s.amount) + "[lightgray]/" + s.amount)).padLeft(2).left().padRight(4); + int as = schems.get(s.item), al = launches.get(s.item); + + String amountStr = "[lightgray]" + (al + " + [accent]" + as + "[lightgray]"); + + table.add( + build.items.has(s.item, s.amount) ? amountStr : + "[scarlet]" + (Math.min(build.items.get(s.item), s.amount) + "[lightgray]/" + amountStr)).padLeft(2).left().padRight(4); if(++i % 4 == 0){ table.row(); @@ -72,8 +71,11 @@ public class LaunchLoadoutDialog extends BaseDialog{ Runnable rebuildItems = () -> rebuild.get(items); buttons.button("@resources", Icon.terrain, () -> { - loadout.show(core.itemCapacity, stacks, UnlockableContent::unlocked, stacks::clear, () -> {}, () -> { - universe.updateLaunchResources(stacks); + ItemSeq stacks = universe.getLaunchResources(); + Seq out = stacks.toSeq(); + + loadout.show(core.itemCapacity, out, UnlockableContent::unlocked, out::clear, () -> {}, () -> { + universe.updateLaunchResources(new ItemSeq(out)); update.run(); rebuildItems.run(); }); diff --git a/core/src/mindustry/ui/dialogs/LoadDialog.java b/core/src/mindustry/ui/dialogs/LoadDialog.java index 2d3f653fab..6e2e56e2d8 100644 --- a/core/src/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/mindustry/ui/dialogs/LoadDialog.java @@ -104,7 +104,7 @@ public class LoadDialog extends BaseDialog{ button.left().add(new BorderImage(def, 4f)).update(im -> { TextureRegionDrawable draw = (TextureRegionDrawable)im.getDrawable(); - if(draw.getRegion().getTexture().isDisposed()){ + if(draw.getRegion().texture.isDisposed()){ draw.setRegion(def); } diff --git a/core/src/mindustry/ui/dialogs/LoadoutDialog.java b/core/src/mindustry/ui/dialogs/LoadoutDialog.java index eb0182ee2a..d818f5ecda 100644 --- a/core/src/mindustry/ui/dialogs/LoadoutDialog.java +++ b/core/src/mindustry/ui/dialogs/LoadoutDialog.java @@ -16,6 +16,7 @@ public class LoadoutDialog extends BaseDialog{ private Runnable hider; private Runnable resetter; private Runnable updater; + //TODO use itemseqs private Seq stacks = new Seq<>(); private Seq originalStacks = new Seq<>(); private Boolf validator = i -> true; diff --git a/core/src/mindustry/ui/dialogs/MapPlayDialog.java b/core/src/mindustry/ui/dialogs/MapPlayDialog.java index 509b4ba1ea..8655e07208 100644 --- a/core/src/mindustry/ui/dialogs/MapPlayDialog.java +++ b/core/src/mindustry/ui/dialogs/MapPlayDialog.java @@ -4,7 +4,6 @@ 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.*; @@ -15,7 +14,7 @@ import static mindustry.Vars.*; public class MapPlayDialog extends BaseDialog{ CustomRulesDialog dialog = new CustomRulesDialog(); Rules rules; - @NonNull Gamemode selectedGamemode = Gamemode.survival; + Gamemode selectedGamemode = Gamemode.survival; Map lastMap; public MapPlayDialog(){ diff --git a/core/src/mindustry/ui/dialogs/MapsDialog.java b/core/src/mindustry/ui/dialogs/MapsDialog.java index 24b1cf3609..c03c01e799 100644 --- a/core/src/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/mindustry/ui/dialogs/MapsDialog.java @@ -54,7 +54,7 @@ public class MapsDialog extends BaseDialog{ Runnable show = () -> ui.loadAnd(() -> { hide(); ui.editor.show(); - ui.editor.editor.getTags().put("name", text); + ui.editor.editor.tags.put("name", text); Events.fire(new MapMakeEvent()); }); diff --git a/core/src/mindustry/ui/dialogs/MinimapDialog.java b/core/src/mindustry/ui/dialogs/MinimapDialog.java index d19dd5a1dd..703d896bfa 100644 --- a/core/src/mindustry/ui/dialogs/MinimapDialog.java +++ b/core/src/mindustry/ui/dialogs/MinimapDialog.java @@ -8,7 +8,7 @@ import arc.scene.event.*; import arc.scene.ui.layout.*; import mindustry.gen.*; -import static mindustry.Vars.renderer; +import static mindustry.Vars.*; public class MinimapDialog extends BaseDialog{ diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index f674fa5f86..866c3460e4 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -107,11 +107,13 @@ public class ModsDialog extends BaseDialog{ Core.settings.put("lastmod", text); ui.loadfrag.show(); - // Try to download the 6.0 branch first, but if it doesnt exist try master. + //Try to download the 6.0 branch first, but if it doesn't exist try master. githubImport("6.0", text, e1 -> { githubImport("master", text, e2 -> { - ui.showErrorMessage(Core.bundle.format("connectfail", e2)); - ui.loadfrag.hide(); + githubImport("main", text, e3 -> { + ui.showErrorMessage(Core.bundle.format("connectfail", e2)); + ui.loadfrag.hide(); + }); }); }); }); @@ -162,11 +164,17 @@ public class ModsDialog extends BaseDialog{ }}).size(h - 8f).padTop(-8f).padLeft(-8f).padRight(8f); title.table(text -> { - text.add("" + mod.meta.displayName() + "\n[lightgray]v" + mod.meta.version + (mod.enabled() ? "" : "\n" + Core.bundle.get("mod.disabled") + "")) + boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors(); + + text.add("" + mod.meta.displayName() + "\n[lightgray]v" + mod.meta.version + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + "")) .wrap().top().width(300f).growX().left(); text.row(); - if(!mod.isSupported()){ + + if(mod.isOutdated()){ + text.labelWrap("@mod.outdated").growX(); + text.row(); + }else if(!mod.isSupported()){ text.labelWrap(Core.bundle.format("mod.requiresversion", mod.meta.minGameVersion)).growX(); text.row(); }else if(mod.hasUnmetDependencies()){ diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index 0d5f873562..f09e2fe185 100644 --- a/core/src/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/mindustry/ui/dialogs/PausedDialog.java @@ -35,17 +35,18 @@ public class PausedDialog extends BaseDialog{ if(!mobile){ //TODO localize - cont.label(() -> state.getSector() == null ? "" : - ("[lightgray]Next turn in [accent]" + state.getSector().displayTimeRemaining() + - (state.rules.winWave > 0 && !state.getSector().isCaptured() ? "\n[lightgray]Reach wave[accent] " + state.rules.winWave + "[] to capture" : ""))) - .visible(() -> state.getSector() != null).colspan(2); + //TODO capturing is disabled, remove? + //cont.label(() -> state.getSector() == null ? "" : + //("[lightgray]Next turn in [accent]" + state.getSector().displayTimeRemaining() + + // (state.rules.winWave > 0 && !state.getSector().isCaptured() ? "\n[lightgray]Reach wave[accent] " + state.rules.winWave + "[] to capture" : ""))) + // .visible(() -> state.getSector() != null).colspan(2); cont.row(); float dw = 220f; cont.defaults().width(dw).height(55).pad(5f); - cont.button("@back", Icon.left, this::hide); - cont.button("@settings", Icon.settings, ui.settings::show); + cont.button("@back", Icon.left, this::hide).name("back"); + cont.button("@settings", Icon.settings, ui.settings::show).name("settings"); if(!state.rules.tutorial){ if(!state.isCampaign() && !state.isEditor()){ @@ -87,8 +88,8 @@ public class PausedDialog extends BaseDialog{ }else if(state.isCampaign()){ cont.buttonRow("@launchcore", Icon.up, () -> { hide(); - ui.planet.show(state.getSector(), player.team().core()); - }).disabled(b -> player.team().core() == null || !player.team().core().items.has(player.team().core().block.requirements)); + ui.planet.showLaunch(state.getSector(), player.team().core()); + }).disabled(b -> player.team().core() == null); cont.row(); diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 4cd4f61877..dd63a1afeb 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -1,6 +1,7 @@ package mindustry.ui.dialogs; import arc.*; +import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.graphics.gl.*; @@ -12,7 +13,6 @@ import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.core.*; import mindustry.ctype.*; import mindustry.game.*; @@ -29,17 +29,21 @@ import static mindustry.graphics.g3d.PlanetRenderer.*; import static mindustry.ui.dialogs.PlanetDialog.Mode.*; public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ - private final FrameBuffer buffer = new FrameBuffer(2, 2, true); - final PlanetRenderer planets = renderer.planets; - private final LaunchLoadoutDialog loadouts = new LaunchLoadoutDialog(); - private final Table stable = new Table().background(Styles.black3); + //if true, enables launching anywhere for testing + public static boolean debugSelect = false; - private int launchRange; - private float zoom = 1f, selectAlpha = 1f; - @Nullable Sector selected, hovered, launchSector; - private CoreBuild launcher; - Mode mode = look; - private boolean launching; + public final FrameBuffer buffer = new FrameBuffer(2, 2, true); + public final PlanetRenderer planets = renderer.planets; + public final LaunchLoadoutDialog loadouts = new LaunchLoadoutDialog(); + public final Table stable = new Table().background(Styles.black3); + + public int launchRange; + public float zoom = 1f, selectAlpha = 1f; + public @Nullable Sector selected, hovered, launchSector; + public CoreBuild launcher; + public Mode mode = look; + public boolean launching; + public Cons listener = s -> {}; public PlanetDialog(){ super("", Styles.fullDialog); @@ -93,7 +97,27 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ return super.show(); } - public void show(Sector sector, CoreBuild launcher){ + public void showSelect(Sector sector, Cons listener){ + selected = null; + hovered = null; + launching = false; + this.listener = listener; + + //update view to sector + lookAt(sector); + zoom = 1f; + planets.zoom = 2f; + selectAlpha = 0f; + launchSector = sector; + + mode = select; + + super.show(); + } + + public void showLaunch(Sector sector, CoreBuild launcher){ + if(launcher == null) return; + this.launcher = launcher; selected = null; hovered = null; @@ -116,7 +140,9 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ planets.camPos.set(Tmp.v33.set(sector.tile.v).rotate(Vec3.Y, -sector.planet.getRotation())); } - boolean canLaunch(Sector sector){ + boolean canSelect(Sector sector){ + if(mode == select) return sector.hasBase(); + return mode == launch && (sector.tile.v.within(launchSector.tile.v, (launchRange + 0.5f) * planets.planet.sectorApproxRadius*2) //within range || (sector.preset != null && sector.preset.unlocked())); //is an unlocked preset @@ -126,25 +152,27 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ public void renderSectors(Planet planet){ //draw all sector stuff - for(Sector sec : planet.sectors){ + if(!debugSelect){ + for(Sector sec : planet.sectors){ - if(selectAlpha > 0.01f){ - if(canLaunch(sec) || sec.unlocked()){ - if(sec.baseCoverage > 0){ - planets.fill(sec, Tmp.c1.set(Team.crux.color).a(0.5f * sec.baseCoverage * selectAlpha), -0.002f); + if(selectAlpha > 0.01f){ + if(canSelect(sec) || sec.unlocked()){ + if(sec.baseCoverage > 0){ + planets.fill(sec, Tmp.c1.set(Team.crux.color).a(0.5f * sec.baseCoverage * selectAlpha), -0.002f); + } + + Color color = + sec.hasBase() ? Team.sharded.color : + sec.preset != null ? Team.derelict.color : + sec.hasEnemyBase() ? Team.crux.color : + null; + + if(color != null){ + planets.drawSelection(sec, Tmp.c1.set(color).mul(0.8f).a(selectAlpha), 0.026f, -0.001f); + } + }else{ + planets.fill(sec, Tmp.c1.set(shadowColor).mul(1, 1, 1, selectAlpha), -0.001f); } - - Color color = - sec.hasBase() ? Team.sharded.color : - sec.preset != null ? Team.derelict.color : - sec.hasEnemyBase() ? Team.crux.color : - null; - - if(color != null){ - planets.drawSelection(sec, Tmp.c1.set(color).mul(0.8f).a(selectAlpha), 0.026f, -0.001f); - } - }else{ - planets.fill(sec, Tmp.c1.set(shadowColor).mul(1, 1, 1, selectAlpha), -0.001f); } } } @@ -167,8 +195,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ planets.batch.flush(Gl.triangles); - if(mode == launch){ - if(hovered != launchSector && hovered != null && canLaunch(hovered)){ + if(mode == launch || mode == select){ + if(hovered != launchSector && hovered != null && canSelect(hovered)){ planets.drawArc(planet, launchSector.tile.v, hovered.tile.v); } } @@ -191,7 +219,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ planets.drawPlane(hovered, () -> { Draw.color(Color.white, Pal.accent, Mathf.absin(5f, 1f)); - TextureRegion icon = hovered.locked() && !canLaunch(hovered) ? Icon.lock.getRegion() : null; + TextureRegion icon = hovered.locked() && !canSelect(hovered) ? Icon.lock.getRegion() : null; if(icon != null){ Draw.rect(icon, 0, 0); @@ -209,7 +237,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ cont.clear(); titleTable.remove(); - cont.stack( new Element(){ { @@ -217,7 +244,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ addListener(new ElementGestureListener(){ @Override public void tap(InputEvent event, float x, float y, int count, KeyCode button){ - if(hovered != null && (mode == launch ? canLaunch(hovered) && hovered != launchSector : hovered.unlocked())){ + if(hovered != null && ((mode == launch ? canSelect(hovered) && hovered != launchSector : hovered.unlocked()) || debugSelect)){ selected = hovered; } @@ -235,9 +262,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } }, new Table(t -> { + t.touchable = Touchable.disabled; //TODO localize t.top(); - t.label(() -> mode == launch ? "Select Launch Sector" : "Turn " + universe.turn()).style(Styles.outlineLabel).color(Pal.accent); + t.label(() -> mode == select ? "@sectors.select" : mode == launch ? "Select Launch Sector" : "").style(Styles.outlineLabel).color(Pal.accent); })).grow(); } @@ -306,7 +334,12 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ stable.add("[accent]" + (sector.preset == null ? sector.id : sector.preset.localizedName)).row(); stable.image().color(Pal.accent).fillX().height(3f).pad(3f).row(); stable.add(sector.save != null ? sector.save.getPlayTime() : "@sectors.unexplored").row(); + if(sector.hasWaves() || sector.hasEnemyBase()){ + stable.add("[accent]Difficulty: " + (int)(sector.baseCoverage * 10)).row(); + } + //TODO sector damage is disabled, remove when finalized + /* if(sector.hasBase() && sector.hasWaves()){ //TODO localize when finalized //these mechanics are likely to change and as such are not added to the bundle @@ -314,18 +347,27 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ stable.row(); stable.add("[accent]" + Mathf.ceil(sectorDestructionTurns - (sector.getSecondsPassed() * 60) / turnDuration) + " turn(s)\nuntil destruction"); stable.row(); - } + }*/ - stable.add("@sectors.resources").row(); - stable.table(t -> { - t.left(); - int idx = 0; - int max = 5; - for(UnlockableContent c : sector.data.resources){ - t.image(c.icon(Cicon.small)).padRight(3); - if(++idx % max == 0) t.row(); - } - }).fillX().row(); + if(sector.save != null){ + stable.add("@sectors.resources").row(); + stable.table(t -> { + + if(sector.save != null && sector.save.meta.secinfo != null && sector.save.meta.secinfo.resources.any()){ + t.left(); + int idx = 0; + int max = 5; + for(UnlockableContent c : sector.save.meta.secinfo.resources){ + t.image(c.icon(Cicon.small)).padRight(3); + if(++idx % max == 0) t.row(); + } + }else{ + t.add("@unknown").color(Color.lightGray); + } + + + }).fillX().row(); + } //production if(sector.hasBase() && sector.save.meta.hasProduction){ @@ -345,7 +387,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } //stored resources - if(sector.hasBase() && sector.save.meta.secinfo.coreItems.size > 0){ + if(sector.hasBase() && sector.save.meta.secinfo.coreItems.total > 0){ stable.add("@sectors.stored").row(); stable.table(t -> { t.left(); @@ -368,13 +410,13 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ stable.row(); - if((sector.hasBase() && mode == look) || canLaunch(sector) || (sector.preset != null && sector.preset.alwaysUnlocked)){ - stable.button(sector.hasBase() ? "@sectors.resume" : "@sectors.launch", Styles.transt, () -> { + if((sector.hasBase() && mode == look) || canSelect(sector) || (sector.preset != null && sector.preset.alwaysUnlocked) || debugSelect){ + stable.button(mode == select ? "@sectors.select" : sector.hasBase() ? "@sectors.resume" : "@sectors.launch", Styles.transt, () -> { boolean shouldHide = true; //save before launch. - if(control.saves.getCurrent() != null && state.isGame()){ + if(control.saves.getCurrent() != null && state.isGame() && mode != select){ try{ control.saves.getCurrent().save(); }catch(Throwable e){ @@ -394,12 +436,14 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ ui.hudfrag.showLaunchDirect(); Time.runTask(launchDuration, () -> control.playSector(current, sector)); }); + }else if(mode == select){ + listener.get(sector); }else{ control.playSector(sector); } if(shouldHide) hide(); - }).growX().padTop(2f).height(50f).minWidth(170f); + }).growX().padTop(2f).height(50f).minWidth(170f).disabled(b -> state.rules.sector == sector && !state.isMenu()); } stable.pack(); @@ -426,10 +470,12 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ stable.act(0f); } - enum Mode{ + public enum Mode{ /** Look around for existing sectors. Can only deploy. */ look, /** Launch to a new location. */ - launch + launch, + /** Select a sector for some purpose. */ + select } } diff --git a/core/src/mindustry/ui/dialogs/ResearchDialog.java b/core/src/mindustry/ui/dialogs/ResearchDialog.java index d2bd13c101..9c5e6fd3ed 100644 --- a/core/src/mindustry/ui/dialogs/ResearchDialog.java +++ b/core/src/mindustry/ui/dialogs/ResearchDialog.java @@ -14,7 +14,6 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import mindustry.content.*; import mindustry.content.TechTree.*; import mindustry.core.*; @@ -32,14 +31,14 @@ import java.util.*; import static mindustry.Vars.*; public class ResearchDialog extends BaseDialog{ - final float nodeSize = Scl.scl(60f); - ObjectSet nodes = new ObjectSet<>(); - TechTreeNode root = new TechTreeNode(TechTree.root, null); - Rect bounds = new Rect(); - ItemsDisplay itemDisplay; - View view; + public final float nodeSize = Scl.scl(60f); + public ObjectSet nodes = new ObjectSet<>(); + public TechTreeNode root = new TechTreeNode(TechTree.root, null); + public Rect bounds = new Rect(); + public ItemsDisplay itemDisplay; + public View view; - ItemSeq items; + public ItemSeq items; public ResearchDialog(){ super(""); @@ -115,7 +114,7 @@ public class ResearchDialog extends BaseDialog{ buttons.button("@database", Icon.book, () -> { hide(); ui.database.show(); - }).size(210f, 64f); + }).size(210f, 64f).name("database"); //scaling/drag input addListener(new InputListener(){ @@ -163,6 +162,19 @@ public class ResearchDialog extends BaseDialog{ }); } + @Override + public Dialog show(){ + Core.app.post(() -> { + if(net.client()){ + //TODO make this not display every time + //TODO rework this in the future + ui.showInfo("@campaign.multiplayer"); + } + }); + + return super.show(); + } + void treeLayout(){ float spacing = 20f; LayoutNode node = new LayoutNode(root, null); @@ -238,7 +250,7 @@ public class ResearchDialog extends BaseDialog{ return node.content.unlocked() || !node.objectives.contains(i -> !i.complete()); } - void showToast(String info){ + public void showToast(String info){ Table table = new Table(); table.actions(Actions.fadeOut(0.5f, Interp.fade), Actions.remove()); table.top().add(info); @@ -267,11 +279,11 @@ public class ResearchDialog extends BaseDialog{ } } - class TechTreeNode extends TreeNode{ - final TechNode node; - boolean visible = true, selectable = true; + public class TechTreeNode extends TreeNode{ + public final TechNode node; + public boolean visible = true, selectable = true; - TechTreeNode(TechNode node, TechTreeNode parent){ + public TechTreeNode(TechNode node, TechTreeNode parent){ this.node = node; this.parent = parent; this.width = this.height = nodeSize; @@ -285,11 +297,11 @@ public class ResearchDialog extends BaseDialog{ } } - class View extends Group{ - float panX = 0, panY = -200, lastZoom = -1; - boolean moved = false; - ImageButton hoverNode; - Table infoTable = new Table(); + public class View extends Group{ + public float panX = 0, panY = -200, lastZoom = -1; + public boolean moved = false; + public ImageButton hoverNode; + public Table infoTable = new Table(); { infoTable.touchable = Touchable.enabled; @@ -340,7 +352,7 @@ public class ResearchDialog extends BaseDialog{ button.update(() -> { float offset = (Core.graphics.getHeight() % 2) / 2f; button.setPosition(node.x + panX + width / 2f, node.y + panY + height / 2f + offset, Align.center); - button.getStyle().up = !locked(node.node) ? Tex.buttonOver : selectable(node.node) && !canSpend(node.node) ? Tex.buttonRed : Tex.button; + button.getStyle().up = !locked(node.node) ? Tex.buttonOver : !selectable(node.node) || !canSpend(node.node) ? Tex.buttonRed : Tex.button; ((TextureRegionDrawable)button.getStyle().imageUp).setRegion(node.selectable ? node.node.content.icon(Cicon.medium) : Icon.lock.getRegion()); button.getImage().setColor(!locked(node.node) ? Color.white : node.selectable ? Color.gray : Pal.gray); @@ -377,8 +389,19 @@ public class ResearchDialog extends BaseDialog{ } boolean canSpend(TechNode node){ - //can spend when there's at least 1 item that can be spent - return selectable(node) && (node.requirements.length == 0 || Structs.contains(node.requirements, i -> items.has(i.item))); + if(!selectable(node)) return false; + + if(node.requirements.length == 0) return true; + + //can spend when there's at least 1 item that can be spent (non complete) + for(int i = 0; i < node.requirements.length; i++){ + if(node.finishedRequirements[i].amount < node.requirements[i].amount && items.has(node.requirements[i].item)){ + return true; + } + } + + //can always spend when locked + return node.content.locked(); } void spend(TechNode node){ @@ -392,7 +415,7 @@ public class ResearchDialog extends BaseDialog{ ItemStack completed = node.finishedRequirements[i]; //amount actually taken from inventory - int used = Math.min(req.amount - completed.amount, items.get(req.item)); + int used = Math.max(Math.min(req.amount - completed.amount, items.get(req.item)), 0); items.remove(req.item, used); completed.amount += used; diff --git a/core/src/mindustry/ui/dialogs/SaveDialog.java b/core/src/mindustry/ui/dialogs/SaveDialog.java index 909dd113d1..a29a2069f7 100644 --- a/core/src/mindustry/ui/dialogs/SaveDialog.java +++ b/core/src/mindustry/ui/dialogs/SaveDialog.java @@ -1,9 +1,9 @@ package mindustry.ui.dialogs; -import arc.Core; -import arc.scene.ui.TextButton; -import arc.util.Time; -import mindustry.game.Saves.SaveSlot; +import arc.*; +import arc.scene.ui.*; +import arc.util.*; +import mindustry.game.Saves.*; import mindustry.gen.*; import static mindustry.Vars.*; diff --git a/core/src/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/mindustry/ui/dialogs/SchematicsDialog.java index 3d920d1f14..8c99272e89 100644 --- a/core/src/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/mindustry/ui/dialogs/SchematicsDialog.java @@ -4,14 +4,15 @@ import arc.*; import arc.graphics.*; import arc.graphics.Texture.*; import arc.graphics.g2d.*; +import arc.input.*; import arc.math.*; 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.struct.*; import arc.util.*; +import mindustry.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -64,8 +65,12 @@ public class SchematicsDialog extends BaseDialog{ t.update(() -> { if(Core.input.keyTap(Binding.chat) && Core.scene.getKeyboardFocus() == searchField && firstSchematic != null){ - control.input.useSchematic(firstSchematic); - hide(); + if(!Vars.state.rules.schematicsAllowed){ + ui.showInfo("@schematic.disabled"); + }else{ + control.input.useSchematic(firstSchematic); + hide(); + } } }); @@ -102,18 +107,36 @@ public class SchematicsDialog extends BaseDialog{ }); buttons.button(Icon.pencil, style, () -> { - ui.showTextInput("@schematic.rename", "@name", s.name(), res -> { - Schematic replacement = schematics.all().find(other -> other.name().equals(res) && other != s); - if(replacement != null){ - //renaming to an existing schematic is not allowed, as it is not clear how the tags would be merged, and which one should be removed - ui.showErrorMessage("@schematic.exists"); - return; - } + new Dialog("@schematic.rename"){{ + cont.margin(30).add("@name").padRight(6f); + TextField nameField = cont.field(s.name(), null).size(400f, 55f).addInputDialog().get(); - s.tags.put("name", res); - s.save(); - rebuildPane[0].run(); - }); + cont.row(); + + cont.margin(30).add("@editor.description").padRight(6f); + TextField descripionField = cont.area(s.description(), Styles.areaField, t -> {}).size(400f, 140f).addInputDialog().get(); + + Runnable accept = () -> { + s.tags.put("name", nameField.getText()); + s.tags.put("description", descripionField.getText()); + s.save(); + hide(); + rebuildPane[0].run(); + }; + + buttons.defaults().size(120, 54).pad(4); + buttons.button("@ok", accept).disabled(b -> nameField.getText().isEmpty()); + buttons.button("@cancel", this::hide); + + keyDown(KeyCode.enter, () -> { + if(!nameField.getText().isEmpty() && Core.scene.getKeyboardFocus() != descripionField){ + accept.run(); + } + }); + keyDown(KeyCode.escape, this::hide); + keyDown(KeyCode.back, this::hide); + show(); + }}; }); if(s.hasSteamID()){ @@ -146,8 +169,12 @@ public class SchematicsDialog extends BaseDialog{ if(state.isMenu()){ showInfo(s); }else{ - control.input.useSchematic(s); - hide(); + if(!Vars.state.rules.schematicsAllowed){ + ui.showInfo("@schematic.disabled"); + }else{ + control.input.useSchematic(s); + hide(); + } } }).pad(4).style(Styles.cleari).get(); @@ -333,7 +360,7 @@ public class SchematicsDialog extends BaseDialog{ cont.add(new SchematicImage(schem)).maxSize(800f); cont.row(); - Seq arr = schem.requirements(); + ItemSeq arr = schem.requirements(); cont.table(r -> { int i = 0; for(ItemStack s : arr){ diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 10cd96366f..8dd9753fda 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -86,14 +86,14 @@ public class SettingsMenuDialog extends SettingsDialog{ dataDialog.addCloseButton(); dataDialog.cont.table(Tex.button, t -> { - t.defaults().size(270f, 60f).left(); + t.defaults().size(280f, 60f).left(); TextButtonStyle style = Styles.cleart; t.button("@settings.cleardata", Icon.trash, style, () -> ui.showConfirm("@confirm", "@settings.clearall.confirm", () -> { ObjectMap map = new ObjectMap<>(); for(String value : Core.settings.keys()){ if(value.contains("usid") || value.contains("uuid")){ - map.put(value, Core.settings.getString(value)); + map.put(value, Core.settings.get(value, null)); } } Core.settings.clear(); @@ -419,6 +419,9 @@ public class SettingsMenuDialog extends SettingsDialog{ zipped.walk(f -> f.copyTo(base.child(f.path()))); dest.delete(); + + //load data so it's saved on exit + settings.load(); } private void back(){ diff --git a/core/src/mindustry/ui/dialogs/TraceDialog.java b/core/src/mindustry/ui/dialogs/TraceDialog.java index 4bc0945020..c6582aa005 100644 --- a/core/src/mindustry/ui/dialogs/TraceDialog.java +++ b/core/src/mindustry/ui/dialogs/TraceDialog.java @@ -1,9 +1,9 @@ package mindustry.ui.dialogs; -import arc.Core; -import arc.scene.ui.layout.Table; +import arc.*; +import arc.scene.ui.layout.*; import mindustry.gen.*; -import mindustry.net.Administration.TraceInfo; +import mindustry.net.Administration.*; public class TraceDialog extends BaseDialog{ diff --git a/core/src/mindustry/ui/fragments/BlockConfigFragment.java b/core/src/mindustry/ui/fragments/BlockConfigFragment.java index 6719add761..1523508aa4 100644 --- a/core/src/mindustry/ui/fragments/BlockConfigFragment.java +++ b/core/src/mindustry/ui/fragments/BlockConfigFragment.java @@ -7,6 +7,7 @@ import arc.scene.actions.*; import arc.scene.ui.layout.*; import arc.util.*; import mindustry.content.*; +import mindustry.game.EventType.*; import mindustry.gen.*; import static mindustry.Vars.*; @@ -32,6 +33,11 @@ public class BlockConfigFragment extends Fragment{ } } }); + + Events.on(ResetEvent.class, e -> { + table.visible = false; + configTile = null; + }); } public boolean isShown(){ @@ -61,7 +67,7 @@ public class BlockConfigFragment extends Fragment{ } table.setOrigin(Align.center); - if(configTile == null || configTile.block() == Blocks.air || !configTile.isValid()){ + if(configTile == null || configTile.block == Blocks.air || !configTile.isValid()){ hideConfig(); }else{ configTile.updateTableAlign(table); diff --git a/core/src/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/mindustry/ui/fragments/BlockInventoryFragment.java index 08079ba7a7..a4a97553bd 100644 --- a/core/src/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/mindustry/ui/fragments/BlockInventoryFragment.java @@ -10,16 +10,12 @@ import arc.scene.*; import arc.scene.actions.*; import arc.scene.event.*; import arc.scene.ui.*; -import arc.scene.ui.layout.*; import arc.scene.ui.layout.Stack; +import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import mindustry.annotations.Annotations.*; -import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.gen.*; -import mindustry.net.Administration.*; -import mindustry.net.*; import mindustry.type.*; import mindustry.ui.*; @@ -42,29 +38,6 @@ public class BlockInventoryFragment extends Fragment{ Events.on(WorldLoadEvent.class, e -> hide()); } - @Remote(called = Loc.server, targets = Loc.both, forward = true) - public static void requestItem(Player player, Building tile, Item item, int amount){ - if(player == null || tile == null || !tile.interactable(player.team())) return; - amount = Math.min(player.unit().maxAccepted(item), amount); - int fa = amount; - - if(amount == 0) return; - - if(net.server() && (!Units.canInteract(player, tile) || - !netServer.admins.allowAction(player, ActionType.withdrawItem, tile.tile(), action -> { - action.item = item; - action.itemAmount = fa; - }))) throw new ValidateException(player, "Player cannot request items."); - - int removed = tile.removeStack(item, amount); - - player.unit().addItem(item, removed); - Events.fire(new WithdrawEvent(tile, player, item, amount)); - for(int j = 0; j < Mathf.clamp(removed / 3, 1, 8); j++){ - Time.run(j * 3f, () -> Call.transferItemEffect(item, tile.x, tile.y, player.unit())); - } - } - @Override public void build(Group parent){ table.name = "inventory"; @@ -79,7 +52,7 @@ public class BlockInventoryFragment extends Fragment{ return; } this.tile = t; - if(tile == null || !tile.block().isAccessible() || tile.items.total() == 0) + if(tile == null || !tile.block.isAccessible() || tile.items.total() == 0) return; rebuild(true); } @@ -108,7 +81,7 @@ public class BlockInventoryFragment extends Fragment{ table.touchable = Touchable.enabled; table.update(() -> { - if(state.isMenu() || tile == null || !tile.isValid() || !tile.block().isAccessible() || emptyTime >= holdShrink){ + if(state.isMenu() || tile == null || !tile.isValid() || !tile.block.isAccessible() || emptyTime >= holdShrink){ hide(); }else{ if(tile.items.total() == 0){ @@ -131,7 +104,7 @@ public class BlockInventoryFragment extends Fragment{ } updateTablePosition(); - if(tile.block().hasItems){ + if(tile.block.hasItems){ boolean dirty = false; if(shrinkHoldTimes.length != content.items().size) shrinkHoldTimes = new float[content.items().size]; @@ -157,7 +130,7 @@ public class BlockInventoryFragment extends Fragment{ table.margin(4f); table.defaults().size(8 * 5).pad(4f); - if(tile.block().hasItems){ + if(tile.block.hasItems){ for(int i = 0; i < content.items().size; i++){ Item item = content.item(i); @@ -165,7 +138,7 @@ public class BlockInventoryFragment extends Fragment{ container.add(i); - Boolp canPick = () -> player.unit().acceptsItem(item) && !state.isPaused(); + Boolp canPick = () -> player.unit().acceptsItem(item) && !state.isPaused() && player.within(tile, itemTransferRange); HandCursorListener l = new HandCursorListener(); l.setEnabled(canPick); @@ -233,7 +206,7 @@ public class BlockInventoryFragment extends Fragment{ } private void updateTablePosition(){ - Vec2 v = Core.input.mouseScreen(tile.x + tile.block().size * tilesize / 2f, tile.y + tile.block().size * tilesize / 2f); + Vec2 v = Core.input.mouseScreen(tile.x + tile.block.size * tilesize / 2f, tile.y + tile.block.size * tilesize / 2f); table.pack(); table.setPosition(v.x, v.y, Align.topLeft); } diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index e07c5dc310..be9115293e 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -2,7 +2,6 @@ package mindustry.ui.fragments; import arc.*; import arc.Input.*; -import arc.struct.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -10,6 +9,7 @@ import arc.scene.*; import arc.scene.ui.*; import arc.scene.ui.Label.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.gen.*; @@ -57,7 +57,7 @@ public class ChatFragment extends Table{ } } - return net.active(); + return net.active() && ui.hudfrag.shown; }); update(() -> { @@ -227,6 +227,7 @@ public class ChatFragment extends Table{ } public void addMessage(String message, String sender){ + if(sender == null && message == null) return; messages.insert(0, new ChatMessage(message, sender)); fadetime += 1f; @@ -244,7 +245,7 @@ public class ChatFragment extends Table{ this.message = message; this.sender = sender; if(sender == null){ //no sender, this is a server message? - formattedMessage = message; + formattedMessage = message == null ? "" : message; }else{ formattedMessage = "[coral][[" + sender + "[coral]]:[white] " + message; } diff --git a/core/src/mindustry/ui/fragments/Fragment.java b/core/src/mindustry/ui/fragments/Fragment.java index 2e66da0652..367b6f0cfa 100644 --- a/core/src/mindustry/ui/fragments/Fragment.java +++ b/core/src/mindustry/ui/fragments/Fragment.java @@ -1,6 +1,6 @@ package mindustry.ui.fragments; -import arc.scene.Group; +import arc.scene.*; public abstract class Fragment{ public abstract void build(Group parent); diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index a2adb4a41d..f56d507c4d 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -1,8 +1,9 @@ package mindustry.ui.fragments; import arc.*; +import arc.func.*; import arc.graphics.*; -import arc.input.*; +import arc.graphics.g2d.*; import arc.math.*; import arc.scene.*; import arc.scene.actions.*; @@ -14,6 +15,7 @@ import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; import mindustry.core.GameState.*; import mindustry.ctype.*; import mindustry.game.EventType.*; @@ -24,29 +26,48 @@ import mindustry.input.*; import mindustry.net.Packets.*; import mindustry.type.*; import mindustry.ui.*; -import mindustry.ui.dialogs.*; import static mindustry.Vars.*; public class HudFragment extends Fragment{ - private static final float dsize = 47f; + private static final float dsize = 65f; public final PlacementFragment blockfrag = new PlacementFragment(); + public boolean shown = true; private ImageButton flip; - private Table lastUnlockTable; - private Table lastUnlockLayout; - private boolean shown = true; private CoreItemsDisplay coreItems = new CoreItemsDisplay(); private String hudText = ""; private boolean showHudText; + private Table lastUnlockTable; + private Table lastUnlockLayout; private long lastToast; @Override public void build(Group parent){ + //warn about guardian/boss waves + Events.on(WaveEvent.class, e -> { + int max = 10; + outer: + for(int i = state.wave - 1; i <= state.wave + max; i++){ + for(SpawnGroup group : state.rules.spawns){ + if(group.effect == StatusEffects.boss && group.getUnitsSpawned(i) > 0){ + int diff = (i + 2) - state.wave; + + //increments at which to warn about incoming guardian + if(diff == 1 || diff == 2 || diff == 5 || diff == 10){ + showToast(Icon.warning, Core.bundle.format("wave.guardianwarn" + (diff == 1 ? ".one" : ""), diff)); + } + + break outer; + } + } + } + }); + //TODO details and stuff Events.on(SectorCaptureEvent.class, e ->{ //TODO localize @@ -58,22 +79,33 @@ public class HudFragment extends Fragment{ showToast(Icon.warning, "Sector " + e.sector.id + " [scarlet]lost!"); }); - //TODO full implementation Events.on(ResetEvent.class, e -> { coreItems.resetUsed(); coreItems.clear(); }); - Events.on(TurnEvent.class, e -> { - ui.announce("[accent][[ Turn " + universe.turn() + " ]"); - }); - //paused table parent.fill(t -> { - t.top().visible(() -> state.isPaused() && !state.isOutOfTime()).touchable = Touchable.disabled; + t.name = "paused"; + t.top().visible(() -> state.isPaused()).touchable = Touchable.disabled; t.table(Styles.black5, top -> top.add("@paused").style(Styles.outlineLabel).pad(8f)).growX(); }); + //minimap + position + parent.fill(t -> { + t.name = "minimap/position"; + t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown); + //minimap + t.add(new Minimap()).name("minimap"); + t.row(); + //position + t.label(() -> player.tileX() + "," + player.tileY()) + .visible(() -> Core.settings.getBool("position") && !state.rules.tutorial) + .touchable(Touchable.disabled) + .name("position"); + t.top().right(); + }); + //TODO tear this all down //menu at top left parent.fill(cont -> { @@ -82,15 +114,18 @@ public class HudFragment extends Fragment{ if(mobile){ cont.table(select -> { + select.name = "mobile buttons"; select.left(); select.defaults().size(dsize).left(); ImageButtonStyle style = Styles.clearTransi; - select.button(Icon.menu, style, ui.paused::show); + select.button(Icon.menu, style, ui.paused::show).name("menu"); flip = select.button(Icon.upOpen, style, this::toggleMenus).get(); + flip.name = "flip"; - select.button(Icon.paste, style, ui.schematics::show); + select.button(Icon.paste, style, ui.schematics::show) + .name("schematics"); select.button(Icon.pause, style, () -> { if(net.active()){ @@ -119,7 +154,7 @@ public class HudFragment extends Fragment{ }else{ ui.database.show(); } - }).update(i -> { + }).name("chat").update(i -> { if(net.active() && mobile){ i.getStyle().imageUp = Icon.chat; }else if(state.isCampaign()){ @@ -145,85 +180,86 @@ public class HudFragment extends Fragment{ Table wavesMain, editorMain; - cont.stack(wavesMain = new Table(), editorMain = new Table()).height(wavesMain.getPrefHeight()); + cont.stack(wavesMain = new Table(), editorMain = new Table()).height(wavesMain.getPrefHeight()) + .name("waves/editor"); - { - wavesMain.visible(() -> shown && !state.isEditor()); - wavesMain.top().left(); - Stack stack = new Stack(); - Button waves = new Button(Styles.waveb); - Table btable = new Table().margin(0); + wavesMain.visible(() -> shown && !state.isEditor()); + wavesMain.top().left().name = "waves"; - stack.add(waves); - stack.add(btable); + wavesMain.table(s -> { + //wave info button with text + s.add(makeStatusTable()).grow().name("status"); - addWaveTable(waves); - addPlayButton(btable); - wavesMain.add(stack).width(dsize * 5 + 4f); - wavesMain.row(); - wavesMain.table(Tex.button, t -> t.margin(10f).add(new Bar("boss.health", Pal.health, () -> state.boss() == null ? 0f : state.boss().healthf()).blink(Color.white)) - .grow()).fillX().visible(() -> state.rules.waves && state.boss() != null).height(60f).get(); - wavesMain.row(); - } + //table with button to skip wave + s.button(Icon.play, Styles.righti, 30f, () -> { + if(net.client() && player.admin){ + Call.adminRequest(player, AdminAction.wave); + }else{ + logic.skipWave(); + } + }).growY().fillX().right().width(40f).disabled(b -> !canSkipWave()) + .visible(() -> state.rules.waves).name("skip"); + }).width(dsize * 5 + 4f); - { - editorMain.table(Tex.buttonEdge4, t -> { - //t.margin(0f); - t.add("@editor.teams").growX().left(); - t.row(); - t.table(teams -> { - teams.left(); - int i = 0; - for(Team team : Team.baseTeams){ - ImageButton button = teams.button(Tex.whiteui, Styles.clearTogglePartiali, 40f, () -> Call.setPlayerTeamEditor(player, team)) - .size(50f).margin(6f).get(); - button.getImageCell().grow(); - button.getStyle().imageUpColor = team.color; - button.update(() -> button.setChecked(player.team() == team)); + wavesMain.row(); - if(++i % 3 == 0){ - teams.row(); - } + wavesMain.table(Tex.button, t -> t.margin(10f).add(new Bar("boss.health", Pal.health, () -> state.boss() == null ? 0f : state.boss().healthf()).blink(Color.white)) + .grow()).fillX().visible(() -> state.rules.waves && state.boss() != null).height(60f).get() + .name = "boss"; + + wavesMain.row(); + + editorMain.name = "editor"; + editorMain.table(Tex.buttonEdge4, t -> { + //t.margin(0f); + t.name = "teams"; + t.add("@editor.teams").growX().left(); + t.row(); + t.table(teams -> { + teams.left(); + int i = 0; + for(Team team : Team.baseTeams){ + ImageButton button = teams.button(Tex.whiteui, Styles.clearTogglePartiali, 40f, () -> Call.setPlayerTeamEditor(player, team)) + .size(50f).margin(6f).get(); + button.getImageCell().grow(); + button.getStyle().imageUpColor = team.color; + button.update(() -> button.setChecked(player.team() == team)); + + if(++i % 3 == 0){ + teams.row(); } - }).left(); - }).width(dsize * 5 + 4f); - editorMain.visible(() -> shown && state.isEditor()); - } + } + }).left(); + }).width(dsize * 5 + 4f); + editorMain.visible(() -> shown && state.isEditor()); //fps display cont.table(info -> { + info.name = "fps/ping"; info.touchable = Touchable.disabled; info.top().left().margin(4).visible(() -> Core.settings.getBool("fps") && shown); info.update(() -> info.setTranslation(state.rules.waves || state.isEditor() ? 0f : -Scl.scl(dsize * 4 + 3), 0)); IntFormat fps = new IntFormat("fps"); IntFormat ping = new IntFormat("ping"); - info.label(() -> fps.get(Core.graphics.getFramesPerSecond())).left().style(Styles.outlineLabel); + info.label(() -> fps.get(Core.graphics.getFramesPerSecond())).left() + .style(Styles.outlineLabel).name("fps"); info.row(); - info.label(() -> ping.get(netClient.getPing())).visible(net::client).left().style(Styles.outlineLabel); + info.label(() -> ping.get(netClient.getPing())).visible(net::client).left() + .style(Styles.outlineLabel).name("ping"); }).top().left(); }); - parent.fill(t -> { - t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown); - //minimap - t.add(new Minimap()); - t.row(); - //position - t.label(() -> player.tileX() + "," + player.tileY()) - .visible(() -> Core.settings.getBool("position") && !state.rules.tutorial) - .touchable(Touchable.disabled); - t.top().right(); - }); - //core items parent.fill(t -> { + t.name = "coreitems"; t.top().add(coreItems); t.visible(() -> Core.settings.getBool("coreitems") && !mobile && !state.isPaused() && shown); }); //spawner warning parent.fill(t -> { + t.name = "nearpoint"; t.touchable = Touchable.disabled; t.table(Styles.black, c -> c.add("@nearpoint") .update(l -> l.setColor(Tmp.c1.set(Color.white).lerp(Color.scarlet, Mathf.absin(Time.time(), 10f, 1f)))) @@ -232,12 +268,14 @@ public class HudFragment extends Fragment{ }); parent.fill(t -> { + t.name = "waiting"; t.visible(() -> netServer.isWaitingForPlayers()); t.table(Tex.button, c -> c.add("@waiting.players")); }); //'core is under attack' table parent.fill(t -> { + t.name = "coreattack"; t.touchable = Touchable.disabled; float notifDuration = 240f; float[] coreAttackTime = {0}; @@ -248,6 +286,7 @@ public class HudFragment extends Fragment{ }); t.top().visible(() -> { + if(!shown) return false; if(state.isMenu() || !state.teams.get(player.team()).hasCore()){ coreAttackTime[0] = 0f; return false; @@ -268,29 +307,9 @@ public class HudFragment extends Fragment{ .update(label -> label.color.set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled); }); - //paused table for when the player is out of time - parent.fill(t -> { - t.top().visible(() -> state.isOutOfTime()); - t.table(Styles.black5, top -> { - //TODO localize when done - top.add("Out of sector time.").style(Styles.outlineLabel).color(Pal.accent).update(l -> l.color.a = Mathf.absin(Time.globalTime(), 7f, 1f)).colspan(2); - top.row(); - - top.defaults().pad(2).size(150f, 54f); - top.button("Next Turn", () -> { - universe.runTurn(); - state.set(State.playing); - }); - - top.button("Back to Planet", () -> { - ui.paused.runExitSave(); - ui.planet.show(); - }); - }).margin(8).growX(); - }); - //tutorial text parent.fill(t -> { + t.name = "tutorial"; Runnable resize = () -> { t.clearChildren(); t.top().right().visible(() -> state.rules.tutorial); @@ -313,11 +332,13 @@ public class HudFragment extends Fragment{ //'saving' indicator parent.fill(t -> { + t.name = "saving"; t.bottom().visible(() -> control.saves.isSaving()); t.add("@saving").style(Styles.outlineLabel); }); parent.fill(p -> { + p.name = "hudtext"; p.top().table(Styles.black3, t -> t.margin(4).label(() -> hudText) .style(Styles.outlineLabel)).padTop(10).visible(p.color.a >= 0.001f); p.update(() -> { @@ -331,7 +352,9 @@ public class HudFragment extends Fragment{ }); //TODO DEBUG: rate table + if(false) parent.fill(t -> { + t.name = "rates"; t.bottom().left(); t.table(Styles.black6, c -> { Bits used = new Bits(content.items().size); @@ -426,10 +449,6 @@ public class HudFragment extends Fragment{ }); } - public boolean shown(){ - return shown; - } - /** Show unlock notification for a new recipe. */ public void showUnlock(UnlockableContent content){ //some content may not have icons... yet @@ -556,40 +575,6 @@ public class HudFragment extends Fragment{ Core.scene.add(image); } - private void showLaunchConfirm(){ - BaseDialog dialog = new BaseDialog("@launch"); - dialog.update(() -> { - if(!inLaunchWave()){ - dialog.hide(); - } - }); - dialog.cont.add("@launch.confirm").width(500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center); - dialog.buttons.defaults().size(200f, 54f).pad(2f); - dialog.setFillParent(false); - dialog.buttons.button("@cancel", dialog::hide); - dialog.buttons.button("@ok", () -> { - dialog.hide(); - Call.launchZone(); - }); - dialog.keyDown(KeyCode.escape, dialog::hide); - dialog.keyDown(KeyCode.back, dialog::hide); - dialog.show(); - } - - //TODO launching is disabled, possibly forever - private boolean inLaunchWave(){ - return false; - /* - return state.hasSector() && - state.getSector().metCondition() && - !net.client() && - state.wave % state.getSector().launchPeriod == 0 && !spawner.isSpawning();*/ - } - - private boolean canLaunch(){ - return inLaunchWave() && state.enemies <= 0; - } - private void toggleMenus(){ if(flip != null){ flip.getStyle().imageUp = shown ? Icon.downOpen : Icon.upOpen; @@ -598,7 +583,9 @@ public class HudFragment extends Fragment{ shown = !shown; } - private void addWaveTable(Button table){ + private Table makeStatusTable(){ + Button table = new Button(Styles.waveb); + StringBuilder ibuild = new StringBuilder(); IntFormat wavef = new IntFormat("wave"); @@ -625,27 +612,111 @@ public class HudFragment extends Fragment{ StringBuilder builder = new StringBuilder(); table.name = "waves"; + + table.marginTop(0).marginBottom(4).marginLeft(4); + + class SideBar extends Element{ + public final Floatp amount; + public final boolean flip; + public final Boolp flash; + + float last, blink, value; + + public SideBar(Floatp amount, Boolp flash, boolean flip){ + this.amount = amount; + this.flip = flip; + this.flash = flash; + + setColor(Pal.health); + } + + @Override + public void draw(){ + float next = amount.get(); + + if(next < last && flash.get()){ + blink = 1f; + } + + blink = Mathf.lerpDelta(blink, 0f, 0.2f); + value = Mathf.lerpDelta(value, next, 0.15f); + last = next; + + drawInner(Pal.darkishGray); + + Draw.beginStencil(); + + Fill.crect(x, y, width, height * value); + + Draw.beginStenciled(); + + drawInner(Tmp.c1.set(color).lerp(Color.white, blink)); + + Draw.endStencil(); + } + + void drawInner(Color color){ + if(flip){ + x += width; + width = -width; + } + + float stroke = width * 0.35f; + float bh = height/2f; + Draw.color(color); + + Fill.quad( + x, y, + x + stroke, y, + x + width, y + bh, + x + width - stroke, y + bh + ); + + Fill.quad( + x + width, y + bh, + x + width - stroke, y + bh, + x, y + height, + x + stroke, y + height + ); + + Draw.reset(); + + if(flip){ + width = -width; + x -= width; + } + } + } + + table.stack( + new Element(){ + @Override + public void draw(){ + Draw.color(Pal.darkerGray); + Fill.poly(x + width/2f, y + height/2f, 6, height / Mathf.sqrt3); + Draw.reset(); + Drawf.shadow(x + width/2f, y + height/2f, height * 1.13f); + } + }, + new Table(t -> { + float bw = 40f; + float pad = -20; + t.margin(0); + + t.add(new SideBar(() -> player.unit().healthf(), () -> true, true)).width(bw).growY().padRight(pad); + t.image(() -> player.icon()).scaling(Scaling.bounded).grow().maxWidth(54f); + t.add(new SideBar(() -> player.dead() ? 0f : player.displayAmmo() ? player.unit().ammof() : player.unit().healthf(), () -> !player.displayAmmo(), false)).width(bw).growY().padLeft(pad).update(b -> { + b.color.set(player.displayAmmo() ? player.dead() || player.unit() instanceof BlockUnitc ? Pal.ammo : player.unit().type().ammoType.color : Pal.health); + }); + + t.getChildren().get(1).toFront(); + })).size(120f, 80).padRight(4); + table.labelWrap(() -> { builder.setLength(0); builder.append(wavef.get(state.wave)); builder.append("\n"); - 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); - builder.append("]"); - - if(!canLaunch()){ - builder.append(Core.bundle.get("launch.unable2")); - }else{ - builder.append(Core.bundle.get("launch")); - builder.append("\n"); - builder.append(Core.bundle.format("launch.next", state.wave + state.getSector().launchPeriod)); - builder.append("\n"); - } - builder.append("[]\n"); - } - if(state.enemies > 0){ if(state.enemies == 1){ builder.append(enemyf.get(state.enemies)); @@ -664,29 +735,14 @@ public class HudFragment extends Fragment{ return builder; }).growX().pad(8f); - table.setDisabled(() -> !canLaunch()); + table.setDisabled(true); table.visible(() -> state.rules.waves); - table.clicked(() -> { - if(canLaunch()){ - showLaunchConfirm(); - } - }); + + return table; } private boolean canSkipWave(){ return state.rules.waves && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning() && !state.rules.tutorial; } - private void addPlayButton(Table table){ - table.right().button(Icon.play, Styles.righti, 30f, () -> { - if(net.client() && player.admin){ - Call.adminRequest(player, AdminAction.wave); - }else if(inLaunchWave()){ - ui.showConfirm("@confirm", "@launch.skip.confirm", () -> !canSkipWave(), () -> logic.skipWave()); - }else{ - logic.skipWave(); - } - }).growY().fillX().right().width(40f) - .visible(this::canSkipWave); - } } diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index f66a6c7777..cd8d13be0d 100644 --- a/core/src/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -45,6 +45,7 @@ public class MenuFragment extends Fragment{ parent.fill(c -> { container = c; + c.name = "menu container"; if(!mobile){ buildDesktop(); @@ -57,8 +58,8 @@ public class MenuFragment extends Fragment{ //info icon if(mobile){ - parent.fill(c -> c.bottom().left().button("", Styles.infot, ui.about::show).size(84, 45)); - parent.fill(c -> c.bottom().right().button("", Styles.discordt, ui.discord::show).size(84, 45)); + parent.fill(c -> c.bottom().left().button("", Styles.infot, ui.about::show).size(84, 45).name("info")); + parent.fill(c -> c.bottom().right().button("", Styles.discordt, ui.discord::show).size(84, 45).name("discord")); }else if(becontrol.active()){ parent.fill(c -> c.bottom().right().button("@be.check", Icon.refresh, () -> { ui.loadfrag.show(); @@ -68,18 +69,17 @@ public class MenuFragment extends Fragment{ ui.showInfo("@be.noupdates"); } }); - }).size(200, 60).update(t -> { + }).size(200, 60).name("becheck").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)); - + String versionText = ((Version.build == -1) ? "[#fc8140aa]" : "[#ffffffba]") + Version.combined(); parent.fill((x, y, w, h) -> { TextureRegion logo = Core.atlas.find("logo"); float logoscl = Scl.scl(1); - float logow = Math.min(logo.getWidth() * logoscl, Core.graphics.getWidth() - Scl.scl(20)); - float logoh = logow * (float)logo.getHeight() / logo.getWidth(); + float logow = Math.min(logo.width * logoscl, Core.graphics.getWidth() - Scl.scl(20)); + float logoh = logow * (float)logo.height / logo.width; float fx = (int)(Core.graphics.getWidth() / 2f); float fy = (int)(Core.graphics.getHeight() - 6 - logoh) + logoh / 2 - (Core.graphics.isPortrait() ? Scl.scl(30f) : 0f); @@ -94,6 +94,7 @@ public class MenuFragment extends Fragment{ private void buildMobile(){ container.clear(); + container.name = "buttons"; container.setSize(Core.graphics.getWidth(), Core.graphics.getHeight()); float size = 120f; @@ -154,7 +155,6 @@ public class MenuFragment extends Fragment{ container.clear(); container.setSize(Core.graphics.getWidth(), Core.graphics.getHeight()); - float width = 230f; Drawable background = Styles.black6; @@ -162,6 +162,7 @@ public class MenuFragment extends Fragment{ container.add().width(Core.graphics.getWidth()/10f); container.table(background, t -> { t.defaults().width(width).height(70f); + t.name = "buttons"; buttons(t, new Buttoni("@play", Icon.play, @@ -184,6 +185,7 @@ public class MenuFragment extends Fragment{ container.table(background, t -> { submenu = t; + t.name = "submenu"; t.color.a = 0f; t.top(); t.defaults().width(width).height(70f); diff --git a/core/src/mindustry/ui/fragments/MinimapFragment.java b/core/src/mindustry/ui/fragments/MinimapFragment.java index 68ac728af7..43ad3163b0 100644 --- a/core/src/mindustry/ui/fragments/MinimapFragment.java +++ b/core/src/mindustry/ui/fragments/MinimapFragment.java @@ -18,7 +18,7 @@ public class MinimapFragment extends Fragment{ private boolean shown; float panx, pany, zoom = 1f, lastZoom = -1; private float baseSize = Scl.scl(5f); - private Element elem; + public Element elem; @Override public void build(Group parent){ @@ -32,7 +32,7 @@ public class MinimapFragment extends Fragment{ if(renderer.minimap.getTexture() != null){ Draw.color(); - float ratio = (float)renderer.minimap.getTexture().getHeight() / renderer.minimap.getTexture().getWidth(); + float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width; 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); @@ -113,7 +113,7 @@ public class MinimapFragment extends Fragment{ public void toggle(){ if(Core.settings.getBool("mapcenter")){ float size = baseSize * zoom * world.width(); - float ratio = (float)renderer.minimap.getTexture().getHeight() / renderer.minimap.getTexture().getWidth(); + float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width; panx = (size/2f - player.x() / (world.width() * tilesize) * size) / zoom; pany = (size*ratio/2f - player.y() / (world.height() * tilesize) * size*ratio) / zoom; } diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 85324de349..7b53a24012 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -10,7 +10,6 @@ import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.core.*; import mindustry.entities.*; @@ -31,7 +30,8 @@ public class PlacementFragment extends Fragment{ final int rowWidth = 4; public Category currentCategory = Category.distribution; - Seq returnArray = new Seq<>(); + + Seq returnArray = new Seq<>(), returnArray2 = new Seq<>(); Seq returnCatArray = new Seq<>(); boolean[] categoryEmpty = new boolean[Category.all.length]; ObjectMap selectedBlocks = new ObjectMap<>(); @@ -81,6 +81,10 @@ public class PlacementFragment extends Fragment{ }); } + public Displayable hover(){ + return hover; + } + void rebuild(){ currentCategory = Category.turret; Group group = toggler.parent; @@ -95,7 +99,7 @@ public class PlacementFragment extends Fragment{ if(Core.input.keyDown(Binding.pick) && player.isBuilder()){ //mouse eyedropper select Building tile = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); - Block tryRecipe = tile == null ? null : tile.block() instanceof ConstructBlock ? ((ConstructBuild)tile).cblock : tile.block; + Block tryRecipe = tile == null ? null : tile.block instanceof ConstructBlock ? ((ConstructBuild)tile).cblock : tile.block; Object tryConfig = tile == null ? null : tile.config(); for(BuildPlan req : player.builder().plans()){ @@ -124,18 +128,17 @@ public class PlacementFragment extends Fragment{ for(int j = 0; j < blocks.size; j++){ if(blocks.get(j) == currentBlock){ switch(i){ - case 10: //left - j = (j - 1 + blocks.size) % blocks.size; - break; - case 11: //right - j = (j + 1) % blocks.size; - break; - case 12: //up + //left + case 10 -> j = (j - 1 + blocks.size) % blocks.size; + //right + case 11 -> j = (j + 1) % blocks.size; + //up + case 12 -> { j = (j > 3 ? j - 4 : blocks.size - blocks.size % 4 + j); j -= (j < blocks.size ? 0 : 4); - break; - case 13: //down - j = (j < blocks.size - 4 ? j + 4 : j % 4); + } + //down + case 13 -> j = (j < blocks.size - 4 ? j + 4 : j % 4); } input.block = blocks.get(j); selectedBlocks.put(currentCategory, input.block); @@ -194,7 +197,7 @@ public class PlacementFragment extends Fragment{ public void build(Group parent){ parent.fill(full -> { toggler = full; - full.bottom().right().visible(() -> ui.hudfrag.shown()); + full.bottom().right().visible(() -> ui.hudfrag.shown); full.table(frame -> { @@ -422,7 +425,7 @@ public class PlacementFragment extends Fragment{ } Seq getUnlockedByCategory(Category cat){ - return returnArray.selectFrom(content.blocks(), block -> block.category == cat && block.isVisible() && unlocked(block)).sort((b1, b2) -> Boolean.compare(!b1.isPlaceable(), !b2.isPlaceable())); + return returnArray2.selectFrom(content.blocks(), block -> block.category == cat && block.isVisible() && unlocked(block)).sort((b1, b2) -> Boolean.compare(!b1.isPlaceable(), !b2.isPlaceable())); } Block getSelectedBlock(Category cat){ diff --git a/core/src/mindustry/ui/fragments/PlayerListFragment.java b/core/src/mindustry/ui/fragments/PlayerListFragment.java index 87ac5d068d..c006dcf3ff 100644 --- a/core/src/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/mindustry/ui/fragments/PlayerListFragment.java @@ -24,7 +24,9 @@ public class PlayerListFragment extends Fragment{ @Override public void build(Group parent){ + content.name = "players"; parent.fill(cont -> { + cont.name = "playerlist"; cont.visible(() -> visible); cont.update(() -> { if(!(net.active() && state.isGame())){ @@ -36,7 +38,7 @@ public class PlayerListFragment extends Fragment{ rebuild(); content.pack(); content.act(Core.graphics.getDeltaTime()); - //TODO hack + //hacky Core.scene.act(0f); } }); @@ -47,6 +49,7 @@ public class PlayerListFragment extends Fragment{ sField = pane.field(null, text -> { rebuild(); }).grow().pad(8).get(); + sField.name = "search"; sField.setMaxLength(maxNameLength); sField.setMessageText(Core.bundle.format("players.search")); @@ -56,6 +59,7 @@ public class PlayerListFragment extends Fragment{ pane.table(menu -> { menu.defaults().growX().height(50f).fillY(); + menu.name = "menu"; menu.button("@server.bans", ui.bans::show).disabled(b -> net.client()); menu.button("@server.admins", ui.admins::show).disabled(b -> net.client()); @@ -99,6 +103,7 @@ public class PlayerListFragment extends Fragment{ }; table.margin(8); table.add(new Image(user.icon()).setScaling(Scaling.bounded)).grow(); + table.name = user.name(); button.add(table).size(h); button.labelWrap("[#" + user.color().toString().toUpperCase() + "]" + user.name()).width(170f).pad(10); @@ -115,13 +120,9 @@ public class PlayerListFragment extends Fragment{ t.defaults().size(bs); t.button(Icon.hammer, Styles.clearPartiali, - () -> { - ui.showConfirm("@confirm", Core.bundle.format("confirmban", user.name()), () -> Call.adminRequest(user, AdminAction.ban)); - }); + () -> ui.showConfirm("@confirm", Core.bundle.format("confirmban", user.name()), () -> Call.adminRequest(user, AdminAction.ban))); t.button(Icon.cancel, Styles.clearPartiali, - () -> { - ui.showConfirm("@confirm", Core.bundle.format("confirmkick", user.name()), () -> Call.adminRequest(user, AdminAction.kick)); - }); + () -> ui.showConfirm("@confirm", Core.bundle.format("confirmkick", user.name()), () -> Call.adminRequest(user, AdminAction.kick))); t.row(); diff --git a/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java index 73861538e3..3f33dd1b4b 100644 --- a/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java +++ b/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -39,7 +39,6 @@ public class ScriptConsoleFragment extends Table{ }; public ScriptConsoleFragment(){ - setFillParent(true); font = Fonts.def; diff --git a/core/src/mindustry/ui/layout/BranchTreeLayout.java b/core/src/mindustry/ui/layout/BranchTreeLayout.java index c2739fbada..9c598086cd 100644 --- a/core/src/mindustry/ui/layout/BranchTreeLayout.java +++ b/core/src/mindustry/ui/layout/BranchTreeLayout.java @@ -1,7 +1,7 @@ package mindustry.ui.layout; -import arc.struct.*; import arc.math.geom.*; +import arc.struct.*; /** * Algorithm taken from TreeLayout. diff --git a/core/src/mindustry/ui/layout/RadialTreeLayout.java b/core/src/mindustry/ui/layout/RadialTreeLayout.java index 88b13a5efa..2b1360ff53 100644 --- a/core/src/mindustry/ui/layout/RadialTreeLayout.java +++ b/core/src/mindustry/ui/layout/RadialTreeLayout.java @@ -1,7 +1,7 @@ package mindustry.ui.layout; -import arc.struct.*; import arc.math.*; +import arc.struct.*; public class RadialTreeLayout implements TreeLayout{ private static ObjectSet visited = new ObjectSet<>(); diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 255e269ecb..95d9a426e0 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -12,9 +12,9 @@ import arc.scene.ui.layout.*; import arc.struct.EnumSet; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.pooling.*; import mindustry.annotations.Annotations.*; +import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.units.*; @@ -193,10 +193,16 @@ public class Block extends UnlockableContent{ public BuildPlaceability buildPlaceability = BuildPlaceability.always; /** Multiplier for speed of building this block. */ public float buildCostMultiplier = 1f; + /** Multiplier for cost of research in tech tree. */ + public float researchCostMultiplier = 1; /** Whether this block has instant transfer.*/ public boolean instantTransfer = false; + /** Whether you can rotate this block with Keybind rotateplaced + Scroll Wheel. */ + public boolean quickRotate = true; + /** Main subclass. Non-anonymous. */ + public @Nullable Class subclass; - protected Prov entityType = null; //initialized later + public Prov buildType = null; //initialized later public ObjectMap, Cons2> configurations = new ObjectMap<>(); protected TextureRegion[] generatedIcons; @@ -206,6 +212,7 @@ public class Block extends UnlockableContent{ public @Load("@-team") TextureRegion teamRegion; public TextureRegion[] teamRegions; + //TODO make this not static public static TextureRegion[][] cracks; protected static final Seq tempTiles = new Seq<>(); protected static final Seq tempTileEnts = new Seq<>(); @@ -217,7 +224,7 @@ public class Block extends UnlockableContent{ public Block(String name){ super(name); - initEntity(); + initBuilding(); } public void drawBase(Tile tile){ @@ -366,7 +373,8 @@ public class Block extends UnlockableContent{ } public boolean canReplace(Block other){ - return (other != this || rotate) && this.group != BlockGroup.none && other.group == this.group && size == other.size; + if(other.alwaysReplace) return true; + return (other != this || rotate) && this.group != BlockGroup.none && other.group == this.group && (size == other.size || (size >= other.size && subclass != null && subclass == other.subclass)); } /** @return a possible replacement for this block when placed in a line by the player. */ @@ -460,8 +468,7 @@ public class Block extends UnlockableContent{ /** Never use outside of the editor! */ public TextureRegion editorIcon(){ - if(editorIcon == null) editorIcon = Core.atlas.find(name + "-icon-editor"); - return editorIcon; + return editorIcon == null ? (editorIcon = Core.atlas.find(name + "-icon-editor")) : editorIcon; } /** Never use outside of the editor! */ @@ -478,29 +485,24 @@ public class Block extends UnlockableContent{ } protected TextureRegion[] icons(){ - return new TextureRegion[]{region}; + //use team region in vanilla team blocks + return teamRegion.found() && minfo.mod == null ? new TextureRegion[]{region, teamRegions[Team.sharded.id]} : new TextureRegion[]{region}; } public TextureRegion[] getGeneratedIcons(){ - if(generatedIcons == null){ - generatedIcons = icons(); - } - return generatedIcons; + return generatedIcons == null ? (generatedIcons = icons()) : generatedIcons; } public TextureRegion[] variantRegions(){ - if(variantRegions == null){ - variantRegions = new TextureRegion[]{icon(Cicon.full)}; - } - return variantRegions; + return variantRegions == null ? (variantRegions = new TextureRegion[]{icon(Cicon.full)}) : variantRegions; } - public boolean hasEntity(){ + public boolean hasBuilding(){ return destructible || update; } - public final Building newEntity(){ - return entityType.get(); + public final Building newBuilding(){ + return buildType.get(); } public Rect bounds(int x, int y, Rect rect){ @@ -576,7 +578,7 @@ public class Block extends UnlockableContent{ Arrays.sort(requirements, Structs.comparingInt(i -> i.item.id)); } - protected void initEntity(){ + protected void initBuilding(){ //attempt to find the first declared class and use it as the entity type try{ Class current = getClass(); @@ -585,13 +587,15 @@ public class Block extends UnlockableContent{ current = current.getSuperclass(); } - while(entityType == null && Block.class.isAssignableFrom(current)){ + subclass = current; + + while(buildType == null && Block.class.isAssignableFrom(current)){ //first class that is subclass of Building Class type = Structs.find(current.getDeclaredClasses(), t -> Building.class.isAssignableFrom(t) && !t.isInterface()); if(type != null){ //these are inner classes, so they have an implicit parameter generated Constructor cons = (Constructor)type.getDeclaredConstructor(type.getDeclaringClass()); - entityType = () -> { + buildType = () -> { try{ return cons.newInstance(this); }catch(Exception e){ @@ -607,12 +611,24 @@ public class Block extends UnlockableContent{ }catch(Throwable ignored){ } - if(entityType == null){ + if(buildType == null){ //assign default value - entityType = Building::create; + buildType = Building::create; } } + @Override + public ItemStack[] researchRequirements(){ + ItemStack[] out = new ItemStack[requirements.length]; + for(int i = 0; i < out.length; i++){ + int quantity = 40 + Mathf.round(Mathf.pow(requirements[i].amount, 1.25f) * 20 * researchCostMultiplier, 10); + + out[i] = new ItemStack(requirements[i].item, UI.roundAmount(quantity)); + } + + return out; + } + @Override public void getDependencies(Cons cons){ //just requires items @@ -671,7 +687,7 @@ public class Block extends UnlockableContent{ public void load(){ region = Core.atlas.find(name); - if(cracks == null || (cracks[0][0].getTexture() != null && cracks[0][0].getTexture().isDisposed())){ + if(cracks == null || (cracks[0][0].texture != null && cracks[0][0].texture.isDisposed())){ cracks = new TextureRegion[maxCrackSize][crackRegions]; for(int size = 1; size <= maxCrackSize; size++){ for(int i = 0; i < crackRegions; i++){ diff --git a/core/src/mindustry/world/Build.java b/core/src/mindustry/world/Build.java index 39c4f8024b..070ddab553 100644 --- a/core/src/mindustry/world/Build.java +++ b/core/src/mindustry/world/Build.java @@ -3,18 +3,21 @@ package mindustry.world; import arc.*; import arc.math.*; import arc.math.geom.*; +import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.game.*; +import mindustry.gen.*; import mindustry.world.blocks.*; import mindustry.world.blocks.ConstructBlock.*; import static mindustry.Vars.*; public class Build{ + private static final IntSet tmp = new IntSet(); @Remote(called = Loc.server) public static void beginBreak(Team team, int x, int y){ @@ -36,7 +39,8 @@ public class Build{ tile.setBlock(sub, team, rotation); tile.bc().setDeconstruct(previous); - tile.build.health(tile.build.maxHealth() * prevPercent); + tile.build.health = tile.build.maxHealth * prevPercent; + Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, true))); } @@ -55,11 +59,23 @@ public class Build{ Block previous = tile.block(); Block sub = ConstructBlock.get(result.size); + Seq prevBuild = new Seq<>(9); result.beforePlaceBegan(tile, previous); + tmp.clear(); + + tile.getLinkedTilesAs(result, t -> { + if(t.build != null && t.build.team == team && tmp.add(t.build.id)){ + prevBuild.add(t.build); + } + }); tile.setBlock(sub, team, rotation); - tile.bc().setConstruct(previous, result); + + ConstructBuild build = tile.bc(); + + build.setConstruct(previous.size == sub.size ? previous : Blocks.air, result); + build.prevBuild = prevBuild; result.placeBegan(tile, previous); @@ -68,8 +84,13 @@ public class Build{ /** Returns whether a tile can be placed at this location by this team. */ public static boolean validPlace(Block type, Team team, int x, int y, int rotation){ + return validPlace(type, team, x, y, rotation, true); + } + + /** Returns whether a tile can be placed at this location by this team. */ + public static boolean validPlace(Block type, Team team, int x, int y, int rotation, boolean checkVisible){ //the wave team can build whatever they want as long as it's visible - banned blocks are not applicable - if(type == null || (!type.isPlaceable() && !(state.rules.waves && team == state.rules.waveTeam && type.isVisible()))){ + if(type == null || (checkVisible && (!type.isPlaceable() && !(state.rules.waves && team == state.rules.waveTeam && type.isVisible())))){ return false; } @@ -90,65 +111,39 @@ public class Build{ return false; } - if(type.isMultiblock()){ - if((type.canReplace(tile.block()) || (tile.block instanceof ConstructBlock && tile.bc().cblock == type)) && - type.canPlaceOn(tile, team) && tile.interactable(team)){ - - //if the block can be replaced but the sizes differ, check all the spaces around the block to make sure it can fit - if(type.size != tile.block().size){ - int offsetx = -(type.size - 1) / 2; - int offsety = -(type.size - 1) / 2; - - //this does not check *all* the conditions for placeability yet - for(int dx = 0; dx < type.size; dx++){ - for(int dy = 0; dy < type.size; dy++){ - int wx = dx + offsetx + x, wy = dy + offsety + y; - - Tile check = world.tile(wx, wy); - if(check == null || (!check.block.alwaysReplace && check.block != tile.block)) return false; - } - } - } - - //make sure that the new block can fit the old one - return type.bounds(x, y, Tmp.r1).grow(0.01f).contains(tile.block.bounds(tile.centerX(), tile.centerY(), Tmp.r2)); - } - - if(!type.requiresWater && !contactsShallows(tile.x, tile.y, type) && !type.placeableLiquid){ - return false; - } - - if(!type.canPlaceOn(tile, team)){ - return false; - } - - int offsetx = -(type.size - 1) / 2; - int offsety = -(type.size - 1) / 2; - for(int dx = 0; dx < type.size; dx++){ - for(int dy = 0; dy < type.size; dy++){ - Tile other = world.tile(x + dx + offsetx, y + dy + offsety); - if( - other == null || - !other.block().alwaysReplace || - !other.floor().placeableOn || - (other.floor().isDeep() && !type.floating && !type.requiresWater && !type.placeableLiquid) || - (type.requiresWater && tile.floor().liquidDrop != Liquids.water) - ){ - return false; - } - } - } - return true; - }else{ - return tile.interactable(team) - && (contactsShallows(tile.x, tile.y, type) || type.requiresWater || type.placeableLiquid) - && (!tile.floor().isDeep() || type.floating || type.requiresWater || type.placeableLiquid) - && tile.floor().placeableOn - && (!type.requiresWater || tile.floor().liquidDrop == Liquids.water) - && (((type.canReplace(tile.block()) || (tile.block instanceof ConstructBlock && tile.bc().cblock == type)) - && !(type == tile.block() && (tile.build != null && rotation == tile.build.rotation) && type.rotate)) || tile.block().alwaysReplace || tile.block() == Blocks.air) - && tile.block().isMultiblock() == type.isMultiblock() && type.canPlaceOn(tile, team); + if(!type.requiresWater && !contactsShallows(tile.x, tile.y, type) && !type.placeableLiquid){ + return false; } + + if(!type.canPlaceOn(tile, team)){ + return false; + } + + int offsetx = -(type.size - 1) / 2; + int offsety = -(type.size - 1) / 2; + + for(int dx = 0; dx < type.size; dx++){ + for(int dy = 0; dy < type.size; dy++){ + int wx = dx + offsetx + tile.x, wy = dy + offsety + tile.y; + + + Tile check = world.tile(wx, wy); + + if( + check == null || //nothing there + (check.floor().isDeep() && !type.floating && !type.requiresWater && !type.placeableLiquid) || //deep water + (type == check.block() && check.build != null && rotation == check.build.rotation && type.rotate) || //same block, same rotation + !check.interactable(team) || //cannot interact + !check.floor().placeableOn || //solid wall + !((type.canReplace(check.block()) || //can replace type + (check.block instanceof ConstructBlock && check.bc().cblock == type && check.centerX() == tile.x && check.centerY() == tile.y)) && //same type in construction + type.bounds(tile.x, tile.y, Tmp.r1).grow(0.01f).contains(check.block.bounds(check.centerX(), check.centerY(), Tmp.r2))) || //no replacement + (type.requiresWater && check.floor().liquidDrop != Liquids.water) //requires water but none found + ) return false; + } + } + + return true; } public static boolean contactsGround(int x, int y, Block block){ diff --git a/core/src/mindustry/world/CachedTile.java b/core/src/mindustry/world/CachedTile.java index 7e25c78b3b..3c14ade132 100644 --- a/core/src/mindustry/world/CachedTile.java +++ b/core/src/mindustry/world/CachedTile.java @@ -26,7 +26,7 @@ public class CachedTile extends Tile{ Block block = block(); - if(block.hasEntity()){ + if(block.hasBuilding()){ Building n = entityprov.get(); n.cons(new ConsumeModule(build)); n.tile(this); diff --git a/core/src/mindustry/world/DirectionalItemBuffer.java b/core/src/mindustry/world/DirectionalItemBuffer.java index 433a016ec7..4b7a7bca2f 100644 --- a/core/src/mindustry/world/DirectionalItemBuffer.java +++ b/core/src/mindustry/world/DirectionalItemBuffer.java @@ -6,7 +6,7 @@ import mindustry.annotations.Annotations.*; import mindustry.gen.*; import mindustry.type.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class DirectionalItemBuffer{ public final long[][] buffers; diff --git a/core/src/mindustry/world/Edges.java b/core/src/mindustry/world/Edges.java index 4b45ca3a32..c08b71cdce 100644 --- a/core/src/mindustry/world/Edges.java +++ b/core/src/mindustry/world/Edges.java @@ -6,7 +6,7 @@ import mindustry.gen.*; import java.util.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; public class Edges{ private static final int maxSize = 14; @@ -51,7 +51,7 @@ public class Edges{ } public static Tile getFacingEdge(Building tile, Building other){ - return getFacingEdge(tile.block(), tile.tileX(), tile.tileY(), other.tile()); + return getFacingEdge(tile.block, tile.tileX(), tile.tileY(), other.tile()); } public static Tile getFacingEdge(Tile tile, Tile other){ diff --git a/core/src/mindustry/world/ItemBuffer.java b/core/src/mindustry/world/ItemBuffer.java index a52495a1b7..6ab014bd2f 100644 --- a/core/src/mindustry/world/ItemBuffer.java +++ b/core/src/mindustry/world/ItemBuffer.java @@ -4,7 +4,7 @@ import arc.util.*; import arc.util.io.*; import mindustry.type.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class ItemBuffer{ private long[] buffer; diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index 268888a45e..7478f81db4 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -7,7 +7,7 @@ import arc.math.geom.QuadTree.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.game.*; @@ -26,9 +26,9 @@ public class Tile implements Position, QuadTreeObject, Displayable{ /** Tile entity, usually null. */ public @Nullable Building build; public short x, y; - protected @NonNull Block block; - protected @NonNull Floor floor; - protected @NonNull Floor overlay; + protected Block block; + protected Floor floor; + protected Floor overlay; protected boolean changing = false; public Tile(int x, int y){ @@ -45,7 +45,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ this.block = wall; //update entity and create it if needed - changeEntity(Team.derelict, wall::newEntity, 0); + changeEntity(Team.derelict, wall::newBuilding, 0); changed(); } @@ -130,15 +130,15 @@ public class Tile implements Position, QuadTreeObject, Displayable{ return block.solid && !block.synthetic() && block.fillsTile; } - public @NonNull Floor floor(){ + public Floor floor(){ return floor; } - public @NonNull Block block(){ + public Block block(){ return block; } - public @NonNull Floor overlay(){ + public Floor overlay(){ return overlay; } @@ -173,11 +173,11 @@ public class Tile implements Position, QuadTreeObject, Displayable{ return team().id; } - public void setBlock(@NonNull Block type, Team team, int rotation){ - setBlock(type, team, rotation, type::newEntity); + public void setBlock(Block type, Team team, int rotation){ + setBlock(type, team, rotation, type::newBuilding); } - public void setBlock(@NonNull Block type, Team team, int rotation, Prov entityprov){ + public void setBlock(Block type, Team team, int rotation, Prov entityprov){ changing = true; if(type.isStatic() || this.block.isStatic()){ @@ -232,16 +232,16 @@ public class Tile implements Position, QuadTreeObject, Displayable{ changing = false; } - public void setBlock(@NonNull Block type, Team team){ + public void setBlock(Block type, Team team){ setBlock(type, team, 0); } - public void setBlock(@NonNull Block type){ + public void setBlock(Block type){ setBlock(type, Team.derelict, 0); } /** This resets the overlay! */ - public void setFloor(@NonNull Floor type){ + public void setFloor(Floor type){ this.floor = type; this.overlay = (Floor)Blocks.air; @@ -252,7 +252,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } /** Sets the floor, preserving overlay.*/ - public void setFloorUnder(@NonNull Floor floor){ + public void setFloorUnder(Floor floor){ Block overlay = this.overlay; setFloor(floor); setOverlay(overlay); @@ -326,7 +326,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ setOverlay(content.block(ore)); } - public void setOverlay(@NonNull Block block){ + public void setOverlay(Block block){ this.overlay = (Floor)block; recache(); @@ -346,7 +346,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } public boolean solid(){ - return block.solid || (build != null && build.checkSolid()); + return block.solid || floor.solid || (build != null && build.checkSolid()); } public boolean breakable(){ @@ -389,19 +389,27 @@ public class Tile implements Position, QuadTreeObject, Displayable{ */ public Seq getLinkedTilesAs(Block block, Seq tmpArray){ tmpArray.clear(); + getLinkedTilesAs(block, tmpArray::add); + return tmpArray; + } + + /** + * Returns the list of all tiles linked to this multiblock if it were this block. + * The result contains all linked tiles, including this tile itself. + */ + public void getLinkedTilesAs(Block block, Cons tmpArray){ 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++){ Tile other = world.tile(x + dx + offsetx, y + dy + offsety); - if(other != null) tmpArray.add(other); + if(other != null) tmpArray.get(other); } } }else{ - tmpArray.add(this); + tmpArray.get(this); } - return tmpArray; } public Rect getHitbox(Rect rect){ @@ -456,7 +464,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ build.removeFromProximity(); //remove this tile's dangling entities - if(build.block().isMultiblock()){ + if(build.block.isMultiblock()){ int cx = build.tileX(), cy = build.tileY(); int size = build.block.size; int offsetx = -(size - 1) / 2; @@ -508,8 +516,8 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } } - if(block.hasEntity()){ - build = entityprov.get().init(this, team, block.update, rotation); + if(block.hasBuilding()){ + build = entityprov.get().init(this, team, block.update && !state.isEditor(), rotation); } } @@ -521,7 +529,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ //since the entity won't update proximity for us, update proximity for all nearby tiles manually for(Point2 p : Geometry.d4){ Building tile = world.build(x + p.x, y + p.y); - if(tile != null && !tile.tile().changing){ + if(tile != null && !tile.tile.changing){ tile.onProximityUpdate(); } } diff --git a/core/src/mindustry/world/Tiles.java b/core/src/mindustry/world/Tiles.java index e525350c0c..a996757256 100644 --- a/core/src/mindustry/world/Tiles.java +++ b/core/src/mindustry/world/Tiles.java @@ -3,7 +3,7 @@ package mindustry.world; import arc.func.*; import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import java.util.*; @@ -45,25 +45,26 @@ public class Tiles implements Iterable{ } /** @return a tile at coordinates, or null if out of bounds */ - public @Nullable Tile get(int x, int y){ + @Nullable + public Tile get(int x, int y){ return (x < 0 || x >= width || y < 0 || y >= height) ? null : array[y*width + x]; } /** @return a tile at coordinates; throws an exception if out of bounds */ - public @NonNull Tile getn(int x, int y){ + public Tile getn(int x, int y){ if(x < 0 || x >= width || y < 0 || y >= height) throw new IllegalArgumentException(x + ", " + y + " out of bounds: width=" + width + ", height=" + height); return array[y*width + x]; } /** @return a tile at coordinates, clamped. */ - public @NonNull Tile getc(int x, int y){ + public Tile getc(int x, int y){ x = Mathf.clamp(x, 0, width - 1); y = Mathf.clamp(y, 0, height - 1); return array[y*width + x]; } /** @return a tile at an iteration index [0, width * height] */ - public @NonNull Tile geti(int idx){ + public Tile geti(int idx){ return array[idx]; } diff --git a/core/src/mindustry/world/blocks/Attributes.java b/core/src/mindustry/world/blocks/Attributes.java index 50c907e218..ff96a2bb63 100644 --- a/core/src/mindustry/world/blocks/Attributes.java +++ b/core/src/mindustry/world/blocks/Attributes.java @@ -2,7 +2,7 @@ package mindustry.world.blocks; import arc.util.serialization.*; import arc.util.serialization.Json.*; -import mindustry.world.meta.Attribute; +import mindustry.world.meta.*; import java.util.*; diff --git a/core/src/mindustry/world/blocks/Autotiler.java b/core/src/mindustry/world/blocks/Autotiler.java index af3a9ac2cc..2989436fac 100644 --- a/core/src/mindustry/world/blocks/Autotiler.java +++ b/core/src/mindustry/world/blocks/Autotiler.java @@ -3,7 +3,6 @@ package mindustry.world.blocks; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.entities.units.*; import mindustry.gen.*; @@ -11,34 +10,59 @@ import mindustry.world.*; import java.util.*; -//TODO documentation public interface Autotiler{ - //holds some static temporary variables, required due to some RoboVM bugs + /** + * Holds some static temporary variables, required due to some RoboVM bugs + */ class AutotilerHolder{ static final int[] blendresult = new int[5]; static final BuildPlan[] directionals = new BuildPlan[4]; } - /** slices a texture region: - * mode == 0 -> no slice - * mode == 1 -> bottom - * mode == 2 -> top */ - default TextureRegion sliced(TextureRegion input, int mode){ - return mode == 0 ? input : mode == 1 ? botHalf(input) : topHalf(input); + /** + * The mode to slice a texture at. + */ + enum SliceMode{ + none, + bottom, + top } + /** + * Slices a texture region depending on the SliceMode paramater + * + * @param input The TextureRegion to be sliced + * @param mode The SliceMode to be applied + * @return The sliced texture + */ + default TextureRegion sliced(TextureRegion input, SliceMode mode){ + return mode == SliceMode.none ? input : mode == SliceMode.bottom ? botHalf(input) : topHalf(input); + } + + /** + * Get the top half of a texture + * + * @param input The TextureRegion to slice + * @return The top half of the texture + */ default TextureRegion topHalf(TextureRegion input){ TextureRegion region = Tmp.tr1; region.set(input); - region.setWidth(region.getWidth() / 2); + region.setWidth(region.width / 2); return region; } + /** + * Get the buttom half of a texture + * + * @param input The TextureRegion to slice + * @return The buttom half of the texture + */ default TextureRegion botHalf(TextureRegion input){ TextureRegion region = Tmp.tr1; region.set(input); - int width = region.getWidth(); + int width = region.width; region.setWidth(width / 2); region.setX(region.getX() + width); return region; @@ -82,6 +106,7 @@ public interface Autotiler{ int[] blendresult = AutotilerHolder.blendresult; blendresult[0] = 0; blendresult[1] = blendresult[2] = 1; + int num = (blends(tile, rotation, directional, 2, world) && blends(tile, rotation, directional, 1, world) && blends(tile, rotation, directional, 3, world)) ? 0 : (blends(tile, rotation, directional, 1, world) && blends(tile, rotation, directional, 3, world)) ? 1 : @@ -92,6 +117,8 @@ public interface Autotiler{ -1; transformCase(num, blendresult); + // Calculate bitmask for direction. + blendresult[3] = 0; for(int i = 0; i < 4; i++){ @@ -100,11 +127,13 @@ public interface Autotiler{ } } + // Calculate direction for non-square sprites. + blendresult[4] = 0; for(int i = 0; i < 4; i++){ int realDir = Mathf.mod(rotation - i, 4); - if(blends(tile, rotation, directional, i, world) && (tile != null && tile.getNearbyEntity(realDir) != null && !tile.getNearbyEntity(realDir).block().squareSprite)){ + if(blends(tile, rotation, directional, i, world) && (tile != null && tile.getNearbyEntity(realDir) != null && !tile.getNearbyEntity(realDir).block.squareSprite)){ blendresult[4] |= (1 << i); } } @@ -112,24 +141,41 @@ public interface Autotiler{ return blendresult; } + /** + * Transforms the autotiler setting the connection and the y-scale + * + * @param num The number to use to transform the array + * @param bits The blending value array + */ default void transformCase(int num, int[] bits){ - if(num == 0){ - bits[0] = 3; - }else if(num == 1){ - bits[0] = 4; - }else if(num == 2){ - bits[0] = 2; - }else if(num == 3){ - bits[0] = 2; - bits[2] = -1; - }else if(num == 4){ - bits[0] = 1; - bits[2] = -1; - }else if(num == 5){ - bits[0] = 1; + switch(num){ + case 0 -> bits[0] = 3; + case 1 -> bits[0] = 4; + case 2 -> bits[0] = 2; + case 3 -> { + bits[0] = 2; + bits[2] = -1; + } + case 4 -> { + bits[0] = 1; + bits[2] = -1; + } + case 5 -> bits[0] = 1; } } + /** + * Check if a position is facing the secondary position at a rotation + * + * @param x The x coordinate of position 1 + * @param y The y coordinate of position 1 + * @param rotation The rotation of the tile on (x, y) + * + * @param x2 The x coordinate of position 2 + * @param y2 The y coordinate of position 2 + * + * @return If position 1 is facing position 2 at a certain angle + */ default boolean facing(int x, int y, int rotation, int x2, int y2){ return Point2.equals(x + Geometry.d4(rotation).x,y + Geometry.d4(rotation).y, x2, y2); } @@ -145,9 +191,11 @@ public interface Autotiler{ return checkWorld && blends(tile, rotation, direction); } + + // TODO docs -- use for direction? default boolean blends(Tile tile, int rotation, int direction){ Building other = tile.getNearbyEntity(Mathf.mod(rotation - direction, 4)); - return other != null && other.team == tile.team() && blends(tile, rotation, other.tileX(), other.tileY(), other.rotation, other.block()); + return other != null && other.team == tile.team() && blends(tile, rotation, other.tileX(), other.tileY(), other.rotation, other.block); } default boolean blendsArmored(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ @@ -168,7 +216,16 @@ public interface Autotiler{ || (!otherblock.rotatedOutput(otherx, othery) || Point2.equals(otherx + Geometry.d4(otherrot).x, othery + Geometry.d4(otherrot).y, tile.x, tile.y))); } - /** @return whether this tile is looking at the other tile. */ + /** + * Check if a position is facing the secondary position at a rotation + * + * @param tile The origin tile that is or is not facing the destinated `otherblock` + * @param rotation The rotation of the tile on (x, y) + * + * @param otherx The x coordinate of position 2 + * @param othery The y coordinate of position 2 + * @return whether this tile is looking at the other tile. + */ default boolean lookingAt(Tile tile, int rotation, int otherx, int othery, Block otherblock){ Tile facing = Edges.getFacingEdge(otherblock, otherx, othery, tile); return facing != null && diff --git a/core/src/mindustry/world/blocks/ConstructBlock.java b/core/src/mindustry/world/blocks/ConstructBlock.java index 893a7234ae..c228397a32 100644 --- a/core/src/mindustry/world/blocks/ConstructBlock.java +++ b/core/src/mindustry/world/blocks/ConstructBlock.java @@ -5,7 +5,7 @@ import arc.Graphics.*; import arc.Graphics.Cursor.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.util.ArcAnnotate.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; @@ -58,10 +58,11 @@ public class ConstructBlock extends Block{ } @Remote(called = Loc.server) - public static void constructFinish(Tile tile, Block block, Unit builder, byte rotation, Team team, Object config){ + public static void constructFinish(Tile tile, Block block, @Nullable Unit builder, byte rotation, Team team, Object config){ if(tile == null) return; float healthf = tile.build == null ? 1f : tile.build.healthf(); + Seq prev = tile.build instanceof ConstructBuild ? ((ConstructBuild)tile.build).prevBuild : null; tile.setBlock(block, team, rotation); @@ -71,11 +72,19 @@ public class ConstructBlock extends Block{ if(config != null){ tile.build.configured(builder, config); } + + if(prev != null && prev.size > 0){ + tile.build.overwrote(prev); + } + + if(builder != null && builder.isPlayer()){ + tile.build.lastAccessed = builder.getPlayer().name; + } } //last builder was this local client player, call placed() if(tile.build != null && !headless && builder == player.unit()){ - tile.build.playerPlaced(); + tile.build.playerPlaced(config); } Fx.placeBlock.at(tile.drawx(), tile.drawy(), block.size); @@ -107,7 +116,9 @@ public class ConstructBlock extends Block{ public static void constructed(Tile tile, Block block, Unit builder, byte rotation, Team team, Object config){ Call.constructFinish(tile, block, builder, rotation, team, config); - tile.build.placed(); + if(tile.build != null){ + tile.build.placed(); + } Events.fire(new BlockBuildEndEvent(tile, builder, team, false, config)); if(shouldPlay()) Sounds.place.at(tile, calcPitch(true)); @@ -124,6 +135,7 @@ public class ConstructBlock extends Block{ * If there is no recipe for this block, as is the case with rocks, 'previous' is used. */ public @Nullable Block cblock; + public @Nullable Seq prevBuild; public float progress = 0; public float buildCost; @@ -134,6 +146,9 @@ public class ConstructBlock extends Block{ public Block previous; public Object lastConfig; + @Nullable + public Unit lastBuilder; + private float[] accumulator; private float[] totalAccumulator; @@ -172,7 +187,7 @@ public class ConstructBlock extends Block{ public void onDestroyed(){ Fx.blockExplosionSmoke.at(tile); - if(!tile.floor().solid && !tile.floor().isLiquid){ + if(!tile.floor().solid && tile.floor().hasSurface()){ Effect.rubble(x, y, size); } } @@ -206,6 +221,10 @@ public class ConstructBlock extends Block{ return; } + if(builder.isPlayer()){ + lastBuilder = builder; + } + lastConfig = config; if(cblock.requirements.length != accumulator.length || totalAccumulator.length != cblock.requirements.length){ @@ -225,13 +244,18 @@ public class ConstructBlock extends Block{ progress = Mathf.clamp(progress + maxProgress); if(progress >= 1f || state.rules.infiniteResources){ - constructed(tile, cblock, builder, (byte)rotation, builder.team, config); + if(lastBuilder == null) lastBuilder = builder; + constructed(tile, cblock, lastBuilder, (byte)rotation, builder.team, config); } } public void deconstruct(Unit builder, @Nullable Building core, float amount){ float deconstructMultiplier = state.rules.deconstructRefundMultiplier; + if(builder.isPlayer()){ + lastBuilder = builder; + } + if(cblock != null){ ItemStack[] requirements = cblock.requirements; if(requirements.length != accumulator.length || totalAccumulator.length != requirements.length){ @@ -263,7 +287,8 @@ public class ConstructBlock extends Block{ progress = Mathf.clamp(progress - amount); if(progress <= 0 || state.rules.infiniteResources){ - Call.deconstructFinish(tile, this.cblock == null ? previous : this.cblock, builder); + if(lastBuilder == null) lastBuilder = builder; + Call.deconstructFinish(tile, this.cblock == null ? previous : this.cblock, lastBuilder); } } diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index d36c83d0b5..093fff4f70 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -5,6 +5,7 @@ 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 mindustry.annotations.Annotations.*; @@ -34,6 +35,7 @@ public class LaunchPad extends Block{ hasItems = true; solid = true; update = true; + configurable = true; } @Override @@ -51,6 +53,7 @@ public class LaunchPad extends Block{ } public class LaunchPadBuild extends Building{ + @Override public void draw(){ super.draw(); @@ -97,7 +100,7 @@ public class LaunchPad extends Block{ //launch when full and base conditions are met if(items.total() >= itemCapacity && efficiency() >= 1f && timer(timerLaunch, launchTime / timeScale)){ LaunchPayload entity = LaunchPayload.create(); - items.each((item, amount) -> entity.stacks().add(new ItemStack(item, amount))); + items.each((item, amount) -> entity.stacks.add(new ItemStack(item, amount))); entity.set(this); entity.lifetime(120f); entity.team(team); @@ -107,6 +110,35 @@ public class LaunchPad extends Block{ Effect.shake(3f, 3f, this); } } + + @Override + public void display(Table table){ + super.display(table); + + table.row(); + table.label(() -> { + Sector dest = state.secinfo.getRealDestination(); + + return Core.bundle.format("launch.destination", + dest == null ? Core.bundle.get("sectors.nonelaunch") : + dest.preset == null ? + "[accent]Sector " + dest.id : + "[accent]" + dest.preset.localizedName); + }).pad(4); + } + + @Override + public void buildConfiguration(Table table){ + if(!state.isCampaign()){ + deselect(); + return; + } + + table.button(Icon.upOpen, Styles.clearTransi, () -> { + ui.planet.showSelect(state.rules.sector, other -> state.secinfo.destination = other); + deselect(); + }).size(40f); + } } @EntityDef(LaunchPayloadc.class) @@ -142,7 +174,7 @@ public class LaunchPad extends Block{ Draw.z(Layer.weather - 1); TextureRegion region = Core.atlas.find("launchpod"); - float rw = region.getWidth() * Draw.scl * scale, rh = region.getHeight() * Draw.scl * scale; + float rw = region.width * Draw.scl * scale, rh = region.height * Draw.scl * scale; Draw.alpha(alpha); Draw.rect(region, cx, cy, rw, rh, rotation); @@ -174,19 +206,25 @@ public class LaunchPad extends Block{ @Override public void remove(){ + if(!state.isCampaign()) return; + + Sector destsec = state.secinfo.getRealDestination(); + //actually launch the items upon removal - if(team() == state.rules.defaultTeam && state.secinfo.origin != null){ - ItemSeq dest = state.secinfo.origin.getExtraItems(); + if(team() == state.rules.defaultTeam){ + if(destsec != null && (destsec != state.rules.sector || net.client())){ + ItemSeq dest = destsec.getExtraItems(); - for(ItemStack stack : stacks){ - dest.add(stack); + for(ItemStack stack : stacks){ + dest.add(stack); - //update export - state.secinfo.handleItemExport(stack); - Events.fire(new LaunchItemEvent(stack)); + //update export + state.secinfo.handleItemExport(stack); + Events.fire(new LaunchItemEvent(stack)); + } + + destsec.setExtraItems(dest); } - - state.secinfo.origin.setExtraItems(dest); } } } diff --git a/core/src/mindustry/world/blocks/defense/Door.java b/core/src/mindustry/world/blocks/defense/Door.java index c745f3a63f..3546831ac8 100644 --- a/core/src/mindustry/world/blocks/defense/Door.java +++ b/core/src/mindustry/world/blocks/defense/Door.java @@ -1,8 +1,8 @@ package mindustry.world.blocks.defense; -import arc.audio.*; import arc.Graphics.*; import arc.Graphics.Cursor.*; +import arc.audio.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index 43471574da..b508e90965 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -23,6 +23,7 @@ public class ForceProjector extends Block{ public float phaseUseTime = 350f; public float phaseRadiusBoost = 80f; + public float phaseShieldBoost = 400f; public float radius = 101.7f; public float breakage = 550f; public float cooldownNormal = 1.75f; @@ -32,8 +33,8 @@ public class ForceProjector extends Block{ public @Load("@-top") TextureRegion topRegion; static ForceBuild paramEntity; - static final Cons shieldConsumer = trait -> { - if(trait.team() != paramEntity.team && Intersector.isInsideHexagon(paramEntity.x, paramEntity.y, paramEntity.realRadius() * 2f, trait.x(), trait.y())){ + static final Cons shieldConsumer = trait -> { + if(trait.team != paramEntity.team && trait.type.absorbable && Intersector.isInsideHexagon(paramEntity.x, paramEntity.y, paramEntity.realRadius() * 2f, trait.x(), trait.y())){ trait.absorb(); Fx.absorb.at(trait); paramEntity.hit = 1f; @@ -59,9 +60,11 @@ public class ForceProjector extends Block{ @Override public void setStats(){ super.setStats(); - + stats.add(BlockStat.shieldHealth, breakage, StatUnit.none); + stats.add(BlockStat.cooldownTime, (int) (breakage / cooldownBrokenBase / 60f), StatUnit.seconds); stats.add(BlockStat.powerUse, basePowerDraw * 60f, StatUnit.powerSecond); stats.add(BlockStat.boostEffect, phaseRadiusBoost / tilesize, StatUnit.blocks); + stats.add(BlockStat.boostEffect, phaseShieldBoost, StatUnit.shieldHealth); } @Override @@ -70,10 +73,10 @@ public class ForceProjector extends Block{ Draw.color(Pal.gray); Lines.stroke(3f); - Lines.poly(x * tilesize, y * tilesize, 6, radius); + Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius); Draw.color(player.team().color); Lines.stroke(1f); - Lines.poly(x * tilesize, y * tilesize, 6, radius); + Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius); Draw.color(); } @@ -83,8 +86,8 @@ public class ForceProjector extends Block{ public ForceDraw drawer; @Override - public void add(){ - super.add(); + public void created(){ + super.created(); drawer = ForceDraw.create(); drawer.build = this; drawer.set(x, y); @@ -92,8 +95,8 @@ public class ForceProjector extends Block{ } @Override - public void remove(){ - super.remove(); + public void onRemoved(){ + super.onRemoved(); drawer.remove(); } @@ -130,7 +133,7 @@ public class ForceProjector extends Block{ broken = false; } - if(buildup >= breakage && !broken){ + if(buildup >= breakage + phaseShieldBoost && !broken){ broken = true; buildup = breakage; Fx.shieldBreak.at(x, y, realRadius(), team.color); @@ -156,7 +159,9 @@ public class ForceProjector extends Block{ public void draw(){ super.draw(); - drawer.set(x, y); + if(drawer != null){ + drawer.set(x, y); + } if(buildup > 0f){ Draw.alpha(buildup / breakage * 0.75f); diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index 1158e5f9ed..a2efa6e8b0 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -77,7 +77,7 @@ public class MendProjector extends Block{ indexer.eachBlock(this, realRange, other -> other.damaged(), other -> { other.heal(other.maxHealth() * (healPercent + phaseHeat * phaseBoost) / 100f * efficiency()); - Fx.healBlockFull.at(other.x, other.y, other.block().size, Tmp.c1.set(baseColor).lerp(phaseColor, phaseHeat)); + Fx.healBlockFull.at(other.x, other.y, other.block.size, Tmp.c1.set(baseColor).lerp(phaseColor, phaseHeat)); }); } } @@ -100,10 +100,9 @@ public class MendProjector extends Block{ Draw.color(baseColor, phaseColor, phaseHeat); Draw.alpha(heat * Mathf.absin(Time.time(), 10f, 1f) * 0.5f); Draw.rect(topRegion, x, y); - Draw.alpha(1f); Lines.stroke((2f * f + 0.2f) * heat); - Lines.square(x, y, ((1f - f) * 8f) * size / 2f); + Lines.square(x, y, Math.min(1f + (1f - f) * size * tilesize / 2f, size * tilesize/2f)); Draw.reset(); } diff --git a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java index dd520017b6..56010c7c0f 100644 --- a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -96,7 +96,7 @@ public class OverdriveProjector extends Block{ public void drawSelect(){ float realRange = range + phaseHeat * phaseRangeBoost; - indexer.eachBlock(this, realRange, other -> other.block().canOverdrive, other -> Drawf.selected(other, Tmp.c1.set(baseColor).a(Mathf.absin(4f, 1f)))); + indexer.eachBlock(this, realRange, other -> other.block.canOverdrive, other -> Drawf.selected(other, Tmp.c1.set(baseColor).a(Mathf.absin(4f, 1f)))); Drawf.dashCircle(x, y, realRange, baseColor); } diff --git a/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java b/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java index 75e24a8e87..06746bcfaa 100644 --- a/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java +++ b/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java @@ -4,7 +4,6 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; @@ -111,6 +110,7 @@ public class PointDefenseTurret extends Block{ @Override public void draw(){ Draw.rect(baseRegion, x, y); + Drawf.shadow(region, x - (size / 2f), y - (size / 2f), rotation - 90); Draw.rect(region, x, y, rotation - 90); } diff --git a/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java b/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java index 9e9035bb77..1f74360ed5 100644 --- a/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java +++ b/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java @@ -3,7 +3,6 @@ package mindustry.world.blocks.defense; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; @@ -106,6 +105,7 @@ public class TractorBeamTurret extends Block{ @Override public void draw(){ Draw.rect(baseRegion, x, y); + Drawf.shadow(region, x - (size / 2f), y - (size / 2f), rotation - 90); Draw.rect(region, x, y, rotation - 90); //draw laser if applicable diff --git a/core/src/mindustry/world/blocks/defense/Wall.java b/core/src/mindustry/world/blocks/defense/Wall.java index bad58eba9d..abb941b899 100644 --- a/core/src/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -1,6 +1,7 @@ package mindustry.world.blocks.defense; import arc.*; +import arc.audio.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -20,18 +21,21 @@ public class Wall extends Block{ public float lightningDamage = 20f; public int lightningLength = 17; public Color lightningColor = Pal.surge; + public Sound lightningSound = Sounds.spark; public float chanceDeflect = 10f; public boolean flashHit; public Color flashColor = Color.white; public boolean deflect; + public Sound deflectSound = Sounds.none; public Wall(String name){ super(name); solid = true; destructible = true; group = BlockGroup.walls; - buildCostMultiplier = 5f; + buildCostMultiplier = 6f; + canOverdrive = false; } @Override @@ -55,7 +59,8 @@ public class Wall extends Block{ @Override public boolean canReplace(Block other){ - return super.canReplace(other) && health > other.health && size == other.size; + if(other.alwaysReplace) return true; + return (other != this || rotate) && this.group != BlockGroup.none && other.group == this.group && other != this && size >= other.size; } public class WallBuild extends Building{ @@ -94,13 +99,20 @@ public class Wall extends Block{ if(lightningChance > 0){ if(Mathf.chance(lightningChance)){ Lightning.create(team, lightningColor, lightningDamage, x, y, bullet.rotation() + 180f, lightningLength); + lightningSound.at(tile, Mathf.random(0.9f, 1.1f)); } } //deflect bullets if necessary if(deflect){ + //slow bullets are not deflected + if(bullet.vel().len() <= 0.1f || !bullet.type.reflectable) return true; + //bullet reflection chance depends on bullet damage - if(!Mathf.chance(chanceDeflect/bullet.damage())) return true; + if(!Mathf.chance(chanceDeflect / bullet.damage())) return true; + + //make sound + deflectSound.at(tile, Mathf.random(0.9f, 1.1f)); //translate bullet back to where it was upon collision bullet.trns(-bullet.vel.x, -bullet.vel.y); diff --git a/core/src/mindustry/world/blocks/defense/turrets/ChargeTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ChargeTurret.java index a63cd15ac1..15feaf0379 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ChargeTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ChargeTurret.java @@ -1,12 +1,15 @@ package mindustry.world.blocks.defense.turrets; +import arc.audio.*; import arc.math.*; import arc.util.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.bullet.*; +import mindustry.type.*; +import mindustry.gen.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class ChargeTurret extends PowerTurret{ public float chargeTime = 30f; @@ -14,6 +17,7 @@ public class ChargeTurret extends PowerTurret{ public float chargeMaxDelay = 10f; public Effect chargeEffect = Fx.none; public Effect chargeBeginEffect = Fx.none; + public Sound chargeSound = Sounds.none; public ChargeTurret(String name){ super(name); @@ -28,7 +32,8 @@ public class ChargeTurret extends PowerTurret{ tr.trns(rotation, size * tilesize / 2f); chargeBeginEffect.at(x + tr.x, y + tr.y, rotation); - + chargeSound.at(x + tr.x, y + tr.y, 1); + for(int i = 0; i < chargeEffects; i++){ Time.run(Mathf.random(chargeMaxDelay), () -> { if(!isValid()) return; diff --git a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java index ab53dba5cf..ea94a670b9 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -62,6 +62,7 @@ public class ItemTurret extends Turret{ } public class ItemTurretBuild extends TurretBuild{ + @Override public void onProximityAdded(){ super.onProximityAdded(); @@ -72,6 +73,13 @@ public class ItemTurret extends Turret{ } } + @Override + public void updateTile(){ + unit.ammo((float)unit.type().ammoCapacity * totalAmmo / maxAmmo); + + super.updateTile(); + } + @Override public void displayBars(Table bars){ super.displayBars(bars); diff --git a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java index 59dbc3fbbe..c47a279414 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -9,7 +9,7 @@ import mindustry.world.consumers.*; import mindustry.world.meta.*; import mindustry.world.meta.values.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class LaserTurret extends PowerTurret{ public float firingMoveFract = 0.25f; @@ -96,7 +96,7 @@ public class LaserTurret extends PowerTurret{ @Override protected void turnToTarget(float targetRot){ - rotation = Angles.moveToward(rotation, targetRot, efficiency() * rotatespeed * delta() * (bulletLife > 0f ? firingMoveFract : 1f)); + rotation = Angles.moveToward(rotation, targetRot, efficiency() * rotateSpeed * delta() * (bulletLife > 0f ? firingMoveFract : 1f)); } @Override diff --git a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 752528970b..e34d221d53 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -1,22 +1,23 @@ package mindustry.world.blocks.defense.turrets; -import arc.*; import arc.graphics.g2d.*; import arc.struct.*; import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.entities.bullet.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; import mindustry.world.meta.values.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class LiquidTurret extends Turret{ public ObjectMap ammoTypes = new ObjectMap<>(); public @Load("@-liquid") TextureRegion liquidRegion; + public @Load("@-top") TextureRegion topRegion; public LiquidTurret(String name){ super(name); @@ -54,17 +55,14 @@ public class LiquidTurret extends Turret{ } public class LiquidTurretBuild extends TurretBuild{ - @Override public void draw(){ super.draw(); - if(Core.atlas.isFound(liquidRegion)){ - Draw.color(liquids.current().color); - Draw.alpha(liquids.total() / liquidCapacity); - Draw.rect(liquidRegion, x + tr2.x, y + tr2.y, rotation - 90); - Draw.color(); + if(liquidRegion.found()){ + Drawf.liquid(liquidRegion, x + tr2.x, y + tr2.y, liquids.total() / liquidCapacity, liquids.current().color, rotation - 90); } + if(topRegion.found()) Draw.rect(topRegion, x + tr2.x, y + tr2.y, rotation - 90); } @Override @@ -72,6 +70,13 @@ public class LiquidTurret extends Turret{ return target != null && hasAmmo(); } + @Override + public void updateTile(){ + unit.ammo(unit.type().ammoCapacity * liquids.currentAmount() / liquidCapacity); + + super.updateTile(); + } + @Override protected void findTarget(){ if(liquids.current().canExtinguish()){ @@ -108,7 +113,7 @@ public class LiquidTurret extends Turret{ public BulletType useAmmo(){ if(cheating()) return ammoTypes.get(liquids.current()); BulletType type = ammoTypes.get(liquids.current()); - liquids.remove(liquids.current(), type.ammoMultiplier); + liquids.remove(liquids.current(), 1f / type.ammoMultiplier); return type; } @@ -119,7 +124,7 @@ public class LiquidTurret extends Turret{ @Override public boolean hasAmmo(){ - return ammoTypes.get(liquids.current()) != null && liquids.total() >= ammoTypes.get(liquids.current()).ammoMultiplier; + return ammoTypes.get(liquids.current()) != null && liquids.total() >= 1f / ammoTypes.get(liquids.current()).ammoMultiplier; } @Override @@ -128,10 +133,10 @@ public class LiquidTurret extends Turret{ } @Override - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ + public boolean acceptLiquid(Building source, Liquid liquid){ return ammoTypes.get(liquid) != null && (liquids.current() == liquid || (ammoTypes.containsKey(liquids.current()) - && liquids.get(liquids.current()) <= ammoTypes.get(liquids.current()).ammoMultiplier + 0.001f)); + && liquids.get(liquids.current()) <= 1f / ammoTypes.get(liquids.current()).ammoMultiplier + 0.001f)); } } } diff --git a/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java index 03a973e2e2..f8b49195da 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -1,11 +1,10 @@ package mindustry.world.blocks.defense.turrets; -import arc.util.ArcAnnotate.*; import mindustry.entities.bullet.*; import mindustry.world.meta.*; public class PowerTurret extends Turret{ - public @NonNull BulletType shootType; + public BulletType shootType; public float powerUse = 1f; public PowerTurret(String name){ @@ -16,18 +15,24 @@ public class PowerTurret extends Turret{ @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.damage, shootType.damage, StatUnit.none); } @Override public void init(){ - consumes.powerCond(powerUse, entity -> ((TurretBuild)entity).target != null); + consumes.powerCond(powerUse, TurretBuild::isActive); super.init(); } public class PowerTurretBuild extends TurretBuild{ + @Override + public void updateTile(){ + unit.ammo(power.status * unit.type().ammoCapacity); + + super.updateTile(); + } + @Override public BulletType useAmmo(){ //nothing used directly diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 731c493198..411ee782ec 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -8,12 +8,12 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.entities.Units.*; import mindustry.entities.bullet.*; import mindustry.game.EventType.*; import mindustry.gen.*; @@ -52,7 +52,7 @@ public abstract class Turret extends Block{ public float recoilAmount = 1f; public float restitution = 0.02f; public float cooldown = 0.02f; - public float rotatespeed = 5f; //in degrees per tick + public float rotateSpeed = 5f; //in degrees per tick public float shootCone = 8f; public float shootShake = 0f; public float xRand = 0f; @@ -67,6 +67,7 @@ public abstract class Turret extends Block{ public float coolantMultiplier = 5f; /** Effect displayed when coolant is used. */ public Effect coolEffect = Fx.fuelburn; + public Sortf unitSort = Unit::dst2; protected Vec2 tr = new Vec2(); protected Vec2 tr2 = new Vec2(); @@ -77,6 +78,7 @@ public abstract class Turret extends Block{ public Cons drawer = tile -> Draw.rect(region, tile.x + tr2.x, tile.y + tr2.y, tile.rotation - 90); public Cons heatDrawer = tile -> { if(tile.heat <= 0.00001f) return; + Draw.color(heatColor, tile.heat); Draw.blend(Blending.additive); Draw.rect(heatRegion, tile.x + tr2.x, tile.y + tr2.y, tile.rotation - 90); @@ -149,7 +151,7 @@ public abstract class Turret extends Block{ public boolean logicShooting = false; public @Nullable Posc target; public Vec2 targetPos = new Vec2(); - public @NonNull BlockUnitc unit = Nulls.blockUnit; + public BlockUnitc unit = Nulls.blockUnit; @Override public float range(){ @@ -174,13 +176,28 @@ public abstract class Turret extends Block{ } @Override - public double sense(LAccess sensor){ - if(sensor == LAccess.rotation) return rotation; - if(sensor == LAccess.shootX) return targetPos.x; - if(sensor == LAccess.shootY) return targetPos.y; - if(sensor == LAccess.shooting) return (isControlled() ? unit.isShooting() : logicControlled() ? logicShooting : validateTarget()) ? 1 : 0; + public void control(LAccess type, Object p1, double p2, double p3, double p4){ + if(type == LAccess.shootp && !unit.isPlayer()){ + logicControlTime = logicControlCooldown; + logicShooting = !Mathf.zero(p2); - return super.sense(sensor); + if(p1 instanceof Posc){ + targetPosition((Posc)p1); + } + } + + super.control(type, p1, p2, p3, p4); + } + + @Override + public double sense(LAccess sensor){ + return switch(sensor){ + case rotation -> rotation; + case shootX -> targetPos.x; + case shootY -> targetPos.y; + case shooting -> (isControlled() ? unit.isShooting() : logicControlled() ? logicShooting : validateTarget()) ? 1 : 0; + default -> super.sense(sensor); + }; } @Override @@ -192,6 +209,23 @@ public abstract class Turret extends Block{ return logicControlTime > 0; } + public boolean isActive(){ + return target != null || (logicControlled() && logicShooting) || (isControlled() && unit.isShooting()); + } + + public void targetPosition(Posc pos){ + if(!hasAmmo()) return; + BulletType bullet = peekAmmo(); + float speed = bullet.speed; + //slow bullets never intersect + if(speed < 0.1f) speed = 9999999f; + + targetPos.set(Predict.intercept(this, pos, speed)); + if(targetPos.isZero()){ + targetPos.set(target); + } + } + @Override public void draw(){ Draw.rect(baseRegion, x, y); @@ -201,6 +235,7 @@ public abstract class Turret extends Block{ tr2.trns(rotation, -recoil); + Drawf.shadow(region, x + tr2.x - (size / 2f), y + tr2.y - (size / 2f), rotation - 90); drawer.get(this); if(heatRegion != Core.atlas.find("error")){ @@ -238,15 +273,7 @@ public abstract class Turret extends Block{ }else if(logicControlled()){ //logic behavior canShoot = logicShooting; }else{ //default AI behavior - BulletType type = peekAmmo(); - float speed = type.speed; - //slow bullets never intersect - if(speed < 0.1f) speed = 9999999f; - - targetPos.set(Predict.intercept(this, target, speed)); - if(targetPos.isZero()){ - targetPos.set(target); - } + targetPosition(target); if(Float.isNaN(rotation)){ rotation = 0; @@ -304,14 +331,14 @@ public abstract class Turret extends Block{ protected void findTarget(){ if(targetAir && !targetGround){ - target = Units.closestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded()); + target = Units.bestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded(), unitSort); }else{ - target = Units.closestTarget(team, x, y, range, e -> !e.dead() && (e.isGrounded() || targetAir) && (!e.isGrounded() || targetGround)); + target = Units.bestTarget(team, x, y, range, e -> !e.dead() && (e.isGrounded() || targetAir) && (!e.isGrounded() || targetGround), b -> true, unitSort); } } protected void turnToTarget(float targetRot){ - rotation = Angles.moveToward(rotation, targetRot, rotatespeed * delta() * baseReloadSpeed()); + rotation = Angles.moveToward(rotation, targetRot, rotateSpeed * delta() * baseReloadSpeed()); } public boolean shouldTurn(){ @@ -324,8 +351,9 @@ public abstract class Turret extends Block{ AmmoEntry entry = ammo.peek(); entry.amount -= ammoPerShot; - if(entry.amount == 0) ammo.pop(); + if(entry.amount <= 0) ammo.pop(); totalAmmo -= ammoPerShot; + totalAmmo = Math.max(totalAmmo, 0); Time.run(reloadTime / 2f, this::ejectEffects); return entry.type(); } @@ -337,7 +365,7 @@ public abstract class Turret extends Block{ /** @return whether the turret has ammo. */ public boolean hasAmmo(){ - return ammo.size > 0 && ammo.peek().amount >= ammoPerShot; + return ammo.size > 0 && ammo.peek().amount >= 1; } protected void updateShooting(){ @@ -395,7 +423,7 @@ public abstract class Turret extends Block{ } protected void bullet(BulletType type, float angle){ - float lifeScl = type.scaleVelocity ? Mathf.clamp(Mathf.dst(x, y, targetPos.x, targetPos.y) / type.range(), minRange / type.range(), range / type.range()) : 1f; + float lifeScl = type.scaleVelocity ? Mathf.clamp(Mathf.dst(x + tr.x, y + tr.y, targetPos.x, targetPos.y) / type.range(), minRange / type.range(), range / type.range()) : 1f; type.create(this, team, x + tr.x, y + tr.y, angle, 1f + Mathf.range(velocityInaccuracy), lifeScl); } @@ -406,7 +434,7 @@ public abstract class Turret extends Block{ fshootEffect.at(x + tr.x, y + tr.y, rotation); fsmokeEffect.at(x + tr.x, y + tr.y, rotation); - shootSound.at(tile, Mathf.random(0.9f, 1.1f)); + shootSound.at(x + tr.x, y + tr.y, Mathf.random(0.9f, 1.1f)); if(shootShake > 0){ Effect.shake(shootShake, shootShake, this); diff --git a/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java b/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java index 48a44bd416..cba1366147 100644 --- a/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java @@ -18,7 +18,7 @@ public class ArmoredConveyor extends Conveyor{ public class ArmoredConveyorBuild extends ConveyorBuild{ @Override public boolean acceptItem(Building source, Item item){ - return super.acceptItem(source, item) && (source.block() instanceof Conveyor || Edges.getFacingEdge(source.tile(), tile).relativeTo(tile) == rotation); + return super.acceptItem(source, item) && (source.block instanceof Conveyor || Edges.getFacingEdge(source.tile(), tile).relativeTo(tile) == rotation); } } } diff --git a/core/src/mindustry/world/blocks/distribution/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java index 3654f8ba01..457e7e65e7 100644 --- a/core/src/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/mindustry/world/blocks/distribution/Conveyor.java @@ -5,7 +5,6 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; @@ -63,7 +62,7 @@ public class Conveyor extends Block implements Autotiler{ if(bits == null) return; TextureRegion region = regions[bits[0]][0]; - Draw.rect(region, req.drawx(), req.drawy(), region.getWidth() * bits[1] * Draw.scl, region.getHeight() * bits[2] * Draw.scl, req.rotation * 90); + Draw.rect(region, req.drawx(), req.drawy(), region.width * bits[1] * Draw.scl, region.height * bits[2] * Draw.scl, req.rotation * 90); } @Override @@ -124,7 +123,7 @@ public class Conveyor extends Block implements Autotiler{ int dir = rotation - i; float rot = i == 0 ? rotation * 90 : (dir)*90; - Draw.rect(sliced(regions[0][frame], i != 0 ? 1 : 2), x + Geometry.d4x(dir) * tilesize*0.75f, y + Geometry.d4y(dir) * tilesize*0.75f, rot); + Draw.rect(sliced(regions[0][frame], i != 0 ? SliceMode.bottom : SliceMode.top), x + Geometry.d4x(dir) * tilesize*0.75f, y + Geometry.d4y(dir) * tilesize*0.75f, rot); } } @@ -146,9 +145,24 @@ public class Conveyor extends Block implements Autotiler{ } } + @Override + public void overwrote(Seq builds){ + if(builds.first() instanceof ConveyorBuild build){ + ids = build.ids.clone(); + xs = build.xs.clone(); + ys = build.ys.clone(); + len = build.len; + clogHeat = build.clogHeat; + lastInserted = build.lastInserted; + mid = build.mid; + minitem = build.minitem; + items.addAll(build.items); + } + } + @Override public boolean shouldIdleSound(){ - return clogHeat <= 0.5f ; + return clogHeat <= 0.5f; } @Override @@ -161,11 +175,9 @@ public class Conveyor extends Block implements Autotiler{ blendscly = bits[2]; blending = bits[4]; - if(front() != null && front() != null){ - next = front(); - nextc = next instanceof ConveyorBuild && next.team == team ? (ConveyorBuild)next : null; - aligned = nextc != null && rotation == next.rotation; - } + next = front(); + nextc = next instanceof ConveyorBuild && next.team == team ? (ConveyorBuild)next : null; + aligned = nextc != null && rotation == next.rotation; } @Override @@ -220,7 +232,7 @@ public class Conveyor extends Block implements Autotiler{ if(ys[i] > 0.5 && i > 0) mid = i - 1; xs[i] = Mathf.approachDelta(xs[i], 0, speed*2); - if(ys[i] >= 1f && moveForward(ids[i])){ + if(ys[i] >= 1f && pass(ids[i])){ //align X position if passing forwards if(aligned){ nextc.xs[nextc.lastInserted] = xs[i]; @@ -242,6 +254,14 @@ public class Conveyor extends Block implements Autotiler{ noSleep(); } + public boolean pass(Item item) { + if(next != null && next.team == team && next.acceptItem(this, item)){ + next.handleItem(this, item); + return true; + } + return false; + } + @Override public int removeStack(Item item, int amount){ noSleep(); @@ -289,9 +309,9 @@ public class Conveyor extends Block implements Autotiler{ @Override public boolean acceptItem(Building source, Item item){ if(len >= capacity) return false; - Tile facing = Edges.getFacingEdge(source.tile(), tile); + Tile facing = Edges.getFacingEdge(source.tile, tile); int direction = Math.abs(facing.relativeTo(tile.x, tile.y) - rotation); - return (((direction == 0) && minitem >= itemSpace) || ((direction % 2 == 1) && minitem > 0.7f)) && !(source.block().rotate && (source.rotation + 2) % 4 == rotation); + return (((direction == 0) && minitem >= itemSpace) || ((direction % 2 == 1) && minitem > 0.7f)) && !(source.block.rotate && (source.rotation + 2) % 4 == rotation); } @Override @@ -299,7 +319,7 @@ public class Conveyor extends Block implements Autotiler{ if(len >= capacity) return; int r = rotation; - Tile facing = Edges.getFacingEdge(source.tile(), tile); + Tile facing = Edges.getFacingEdge(source.tile, tile); int ang = ((facing.relativeTo(tile.x, tile.y) - r)); float x = (ang == -1 || ang == 3) ? 1 : (ang == 1 || ang == -3) ? -1 : 0; @@ -346,6 +366,9 @@ public class Conveyor extends Block implements Autotiler{ ys[i] = y; } } + + //this updates some state + updateTile(); } diff --git a/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java b/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java index c4829e3f90..18bc444eec 100644 --- a/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java @@ -28,8 +28,8 @@ public class ExtendingItemBridge extends ItemBridge{ int i = tile.absoluteRelativeTo(other.x, other.y); - float ex = other.worldx() - x - Geometry.d4[i].x * tilesize / 2f, - ey = other.worldy() - y - Geometry.d4[i].y * tilesize / 2f; + float ex = other.worldx() - x - Geometry.d4(i).x * tilesize / 2f, + ey = other.worldy() - y - Geometry.d4(i).y * tilesize / 2f; float uptime = state.isEditor() ? 1f : this.uptime; @@ -42,15 +42,15 @@ public class ExtendingItemBridge extends ItemBridge{ Lines.stroke(8f); Lines.line(bridgeRegion, - x + Geometry.d4[i].x * tilesize / 2f, - y + Geometry.d4[i].y * tilesize / 2f, + x + Geometry.d4(i).x * tilesize / 2f, + y + Geometry.d4(i).y * tilesize / 2f, x + ex, - y + ey, false, 0f); + y + ey, false); Draw.rect(endRegion, x, y, i * 90 + 90); Draw.rect(endRegion, - x + ex + Geometry.d4[i].x * tilesize / 2f, - y + ey + Geometry.d4[i].y * tilesize / 2f, i * 90 + 270); + x + ex + Geometry.d4(i).x * tilesize / 2f, + y + ey + Geometry.d4(i).y * tilesize / 2f, i * 90 + 270); int dist = Math.max(Math.abs(other.x - tile.x), Math.abs(other.y - tile.y)); @@ -61,8 +61,8 @@ public class ExtendingItemBridge extends ItemBridge{ for(int a = 0; a < arrows; a++){ Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity); Draw.rect(arrowRegion, - x + Geometry.d4[i].x * (tilesize / 2f + a * 6f + 2) * uptime, - y + Geometry.d4[i].y * (tilesize / 2f + a * 6f + 2) * uptime, + x + Geometry.d4(i).x * (tilesize / 2f + a * 6f + 2) * uptime, + y + Geometry.d4(i).y * (tilesize / 2f + a * 6f + 2) * uptime, i * 90f); } Draw.reset(); diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index 7cb6559cca..2d09c69eba 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -61,11 +61,17 @@ public class ItemBridge extends Block{ if(otherReq == null) return; Lines.stroke(8f); - Lines.line(bridgeRegion, - req.drawx(), - req.drawy(), - otherReq.drawx(), - otherReq.drawy(), false, -tilesize / 2f); + + Tmp.v1.set(otherReq.drawx(), otherReq.drawy()).sub(req.drawx(), req.drawy()).setLength(tilesize/2f); + + Lines.line( + bridgeRegion, + req.drawx() + Tmp.v1.x, + req.drawy() + Tmp.v1.y, + otherReq.drawx() - Tmp.v1.x, + otherReq.drawy() - Tmp.v1.y, false + ); + Draw.rect(arrowRegion, (req.drawx() + otherReq.drawx()) / 2f, (req.drawy() + otherReq.drawy()) / 2f, Angles.angle(req.drawx(), req.drawy(), otherReq.drawx(), otherReq.drawy())); } @@ -93,7 +99,7 @@ public class ItemBridge extends Block{ float h = (link.y == y ? tilesize : Math.abs(link.y - y) * tilesize - tilesize); Lines.rect((x + link.x) / 2f * tilesize - w / 2f, (y + link.y) / 2f * tilesize - h / 2f, w, h); - Draw.rect("bridge-arrow", link.x * tilesize + Geometry.d4[rot].x * tilesize, link.y * tilesize + Geometry.d4[rot].y * tilesize, link.absoluteRelativeTo(x, y) * 90); + Draw.rect("bridge-arrow", link.x * tilesize + Geometry.d4(rot).x * tilesize, link.y * tilesize + Geometry.d4(rot).y * tilesize, link.absoluteRelativeTo(x, y) * 90); } Draw.reset(); } @@ -133,8 +139,10 @@ public class ItemBridge extends Block{ public float cycleSpeed = 1f; @Override - public void playerPlaced(){ - super.playerPlaced(); + public void playerPlaced(Object config){ + super.playerPlaced(config); + + if(config != null) return; Tile link = findLink(tile.x, tile.y); if(linkValid(tile, link)){ @@ -214,7 +222,7 @@ public class ItemBridge extends Block{ return true; } - if(linkValid(tile, other.tile())){ + if(linkValid(tile, other.tile)){ if(link == other.pos()){ configure(-1); }else{ @@ -265,10 +273,13 @@ public class ItemBridge extends Block{ Item item = items.take(); if(item != null && other.acceptItem(this, item)){ other.handleItem(this, item); - cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); + cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); //TODO this is kinda broken, because lerping only happens on a timer }else{ cycleSpeed = Mathf.lerpDelta(cycleSpeed, 1f, 0.01f); - if(item != null) items.add(item, 1); + if(item != null){ + items.add(item, 1); + items.undoFlow(item); + } } } } @@ -294,11 +305,14 @@ public class ItemBridge extends Block{ Draw.rect(endRegion, other.drawx(), other.drawy(), i * 90 + 270); Lines.stroke(8f); + + Tmp.v1.set(x, y).sub(other.worldx(), other.worldy()).setLength(tilesize/2f).scl(-1f); + Lines.line(bridgeRegion, - x, - y, - other.worldx(), - other.worldy(), false, -tilesize / 2f); + x + Tmp.v1.x, + y + Tmp.v1.y, + other.worldx() - Tmp.v1.x, + other.worldy() - Tmp.v1.y, false); int dist = Math.max(Math.abs(other.x - tile.x), Math.abs(other.y - tile.y)); @@ -310,8 +324,8 @@ public class ItemBridge extends Block{ for(int a = 0; a < arrows; a++){ Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity); Draw.rect(arrowRegion, - x + Geometry.d4[i].x * (tilesize / 2f + a * 4f + time % 4f), - y + Geometry.d4[i].y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); + x + Geometry.d4(i).x * (tilesize / 2f + a * 4f + time % 4f), + y + Geometry.d4(i).y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); } Draw.reset(); } @@ -340,7 +354,7 @@ public class ItemBridge extends Block{ } @Override - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ + public boolean acceptLiquid(Building source, Liquid liquid){ if(team != source.team || !hasLiquids) return false; Tile other = world.tile(link); @@ -354,11 +368,11 @@ public class ItemBridge extends Block{ return false; } - return liquids.get(liquid) + amount < liquidCapacity && (liquids.current() == liquid || liquids.get(liquids.current()) < 0.2f); + return (liquids.current() == liquid || liquids.get(liquids.current()) < 0.2f); } protected boolean linked(Building source){ - return source instanceof ItemBridgeBuild && linkValid(source.tile(), tile) && ((ItemBridgeBuild)source).link == pos(); + return source instanceof ItemBridgeBuild && linkValid(source.tile, tile) && ((ItemBridgeBuild)source).link == pos(); } @Override @@ -369,7 +383,7 @@ public class ItemBridge extends Block{ protected boolean checkDump(Building to){ Tile other = world.tile(link); if(!linkValid(tile, other)){ - Tile edge = Edges.getFacingEdge(to.tile(), tile); + Tile edge = Edges.getFacingEdge(to.tile, tile); int i = relativeTo(edge.x, edge.y); IntSetIterator it = incoming.iterator(); diff --git a/core/src/mindustry/world/blocks/distribution/Junction.java b/core/src/mindustry/world/blocks/distribution/Junction.java index 26801e86c2..8f6fe81b10 100644 --- a/core/src/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/mindustry/world/blocks/distribution/Junction.java @@ -7,7 +7,7 @@ import mindustry.type.*; import mindustry.world.*; import mindustry.world.meta.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class Junction extends Block{ public float speed = 26; //frames taken to go through this junction diff --git a/core/src/mindustry/world/blocks/distribution/MassDriver.java b/core/src/mindustry/world/blocks/distribution/MassDriver.java index 711d85aeae..1776ed7522 100644 --- a/core/src/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/mindustry/world/blocks/distribution/MassDriver.java @@ -62,7 +62,7 @@ public class MassDriver extends Block{ //check if a mass driver is selected while placing this driver if(!control.input.frag.config.isShown()) return; Building selected = control.input.frag.config.getSelectedTile(); - if(selected == null || !(selected.block() instanceof MassDriver) || !(selected.within(x * tilesize, y * tilesize, range))) return; + if(selected == null || !(selected.block instanceof MassDriver) || !(selected.within(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); @@ -155,7 +155,7 @@ public class MassDriver extends Block{ if( items.total() >= minDistribute && //must shoot minimum amount of items - link.block().itemCapacity - link.items.total() >= minDistribute //must have minimum amount of space + link.block.itemCapacity - link.items.total() >= minDistribute //must have minimum amount of space ){ MassDriverBuild other = (MassDriverBuild)link; other.waitingShooters.add(tile); @@ -188,6 +188,9 @@ public class MassDriver extends Block{ Draw.z(Layer.turret); + Drawf.shadow(region, + x + Angles.trnsx(rotation + 180f, reload * knockback) - (size / 2), + y + Angles.trnsy(rotation + 180f, reload * knockback) - (size / 2), rotation - 90); Draw.rect(region, x + Angles.trnsx(rotation + 180f, reload * knockback), y + Angles.trnsy(rotation + 180f, reload * knockback), rotation - 90); @@ -207,9 +210,9 @@ public class MassDriver extends Block{ } if(linkValid()){ - Tile target = world.tile(link); - Drawf.circles(target.drawx(), target.drawy(), (target.block().size / 2f + 1) * tilesize + sin - 2f, Pal.place); - Drawf.arrow(x, y, target.drawx(), target.drawy(), size * tilesize + sin, 4f + sin); + Building target = world.build(link); + Drawf.circles(target.x, target.y, (target.block().size / 2f + 1) * tilesize + sin - 2f, Pal.place); + Drawf.arrow(x, y, target.x, target.y, size * tilesize + sin, 4f + sin); } Drawf.dashCircle(x, y, range, Pal.accent); @@ -225,7 +228,7 @@ public class MassDriver extends Block{ if(link == other.pos()){ configure(-1); return false; - }else if(other.block() instanceof MassDriver && other.dst(tile) <= range && other.team == team){ + }else if(other.block instanceof MassDriver && other.dst(tile) <= range && other.team == team){ configure(other.pos()); return false; } @@ -248,7 +251,7 @@ public class MassDriver extends Block{ data.to = target; int totalUsed = 0; for(int i = 0; i < content.items().size; i++){ - int maxTransfer = Math.min(items.get(content.item(i)), ((MassDriver)tile.block()).itemCapacity - totalUsed); + int maxTransfer = Math.min(items.get(content.item(i)), tile.block().itemCapacity - totalUsed); data.items[i] = maxTransfer; totalUsed += maxTransfer; items.remove(content.item(i), maxTransfer); @@ -302,8 +305,8 @@ public class MassDriver extends Block{ protected boolean linkValid(){ if(link == -1) return false; - Tile link = world.tile(this.link); - return link != null && link.block() instanceof MassDriver && link.team() == tile.team() && tile.dst(link) <= range; + Building link = world.build(this.link); + return link instanceof MassDriverBuild && link.team == team && within(link, range); } @Override diff --git a/core/src/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/mindustry/world/blocks/distribution/OverflowGate.java index 5f4d66db34..1b38cff775 100644 --- a/core/src/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/mindustry/world/blocks/distribution/OverflowGate.java @@ -2,14 +2,13 @@ package mindustry.world.blocks.distribution; import arc.math.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.io.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.meta.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; public class OverflowGate extends Block{ public float speed = 1f; @@ -24,6 +23,7 @@ public class OverflowGate extends Block{ instantTransfer = true; unloadable = false; canOverdrive = false; + itemCapacity = 1; } @Override @@ -91,14 +91,14 @@ public class OverflowGate extends Block{ int from = relativeToEdge(src); if(from == -1) return null; Building to = nearby((from + 2) % 4); - boolean canForward = to != null && to.acceptItem(this, item) && to.team == team && !(to.block() instanceof OverflowGate); + boolean canForward = to != null && to.acceptItem(this, item) && to.team == team && !(to.block instanceof OverflowGate); boolean inv = invert == enabled; if(!canForward || inv){ Building a = nearby(Mathf.mod(from - 1, 4)); Building b = nearby(Mathf.mod(from + 1, 4)); - boolean ac = a != null && a.acceptItem(this, item) && !(a.block() instanceof OverflowGate) && a.team == team; - boolean bc = b != null && b.acceptItem(this, item) && !(b.block() instanceof OverflowGate) && b.team == team; + boolean ac = a != null && a.acceptItem(this, item) && !(a.block instanceof OverflowGate) && a.team == team; + boolean bc = b != null && b.acceptItem(this, item) && !(b.block instanceof OverflowGate) && b.team == team; if(!ac && !bc){ return inv && canForward ? to : null; diff --git a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java index 15067d3188..7c0bbb7821 100644 --- a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java @@ -4,7 +4,6 @@ import arc.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; @@ -17,10 +16,11 @@ import mindustry.world.blocks.production.*; import static mindustry.Vars.*; public class PayloadConveyor extends Block{ - public float moveTime = 60f; + public float moveTime = 40f, moveForce = 201f; public @Load("@-top") TextureRegion topRegion; public @Load("@-edge") TextureRegion edgeRegion; public Interp interp = Interp.pow5; + public float payloadLimit = 2.5f; public PayloadConveyor(String name){ super(name); @@ -30,6 +30,7 @@ public class PayloadConveyor extends Block{ update = true; outputsPayload = true; noUpdateDisabled = true; + sync = true; } @Override @@ -43,8 +44,8 @@ public class PayloadConveyor extends Block{ for(int i = 0; i < 4; i++){ Building other = world.build(x + Geometry.d4x[i] * size, y + Geometry.d4y[i] * size); - if(other != null && other.block().outputsPayload && other.block().size == size){ - Drawf.selected(other.tileX(), other.tileY(), other.block(), Pal.accent); + if(other != null && other.block.outputsPayload && other.block.size == size){ + Drawf.selected(other.tileX(), other.tileY(), other.block, Pal.accent); } } } @@ -52,6 +53,7 @@ public class PayloadConveyor extends Block{ public class PayloadConveyorBuild extends Building{ public @Nullable Payload item; public float progress, itemRotation, animation; + public float curInterp, lastInterp; public @Nullable Building next; public boolean blocked; public int step = -1, stepAccepted = -1; @@ -71,13 +73,13 @@ public class PayloadConveyor extends Block{ //next block must be aligned and of the same size if(accept != null && ( //same size - (accept.block().size == size && tileX() + Geometry.d4(rotation).x * size == accept.tileX() && tileY() + Geometry.d4(rotation).y * size == accept.tileY()) || + (accept.block.size == size && tileX() + Geometry.d4(rotation).x * size == accept.tileX() && tileY() + Geometry.d4(rotation).y * size == accept.tileY()) || //differing sizes - (accept.block().size > size && + (accept.block.size > size && (rotation % 2 == 0 ? //check orientation - Math.abs(accept.y - y) <= (accept.block().size * tilesize - size * tilesize)/2f : //check Y alignment - Math.abs(accept.x - x) <= (accept.block().size * tilesize - size * tilesize)/2f //check X alignment + Math.abs(accept.y - y) <= (accept.block.size * tilesize - size * tilesize)/2f : //check Y alignment + Math.abs(accept.x - x) <= (accept.block.size * tilesize - size * tilesize)/2f //check X alignment )))){ next = accept; }else{ @@ -98,6 +100,10 @@ public class PayloadConveyor extends Block{ public void updateTile(){ if(!enabled) return; + lastInterp = curInterp; + curInterp = fract(); + //rollover skip + if(lastInterp > curInterp) lastInterp = 0f; progress = time() % moveTime; updatePayload(); @@ -107,6 +113,7 @@ public class PayloadConveyor extends Block{ if(curStep > step){ boolean valid = step != -1; step = curStep; + boolean had = item != null; if(valid && stepAccepted != curStep && item != null){ if(next != null){ @@ -128,9 +135,17 @@ public class PayloadConveyor extends Block{ } } } + + if(had && item != null){ + moveFailed(); + } } } + public void moveFailed(){ + + } + public void moved(){ } @@ -154,20 +169,20 @@ public class PayloadConveyor extends Block{ float s = tilesize * size; //next - Tmp.v1.set((s-clipped.getWidth()*Draw.scl) + clipped.getWidth()/2f*Draw.scl - s/2f, s-clipped.getHeight()*Draw.scl + clipped.getHeight()/2f*Draw.scl - s/2f).rotate(rot); + Tmp.v1.set((s- clipped.width *Draw.scl) + clipped.width /2f*Draw.scl - s/2f, s- clipped.height *Draw.scl + clipped.height /2f*Draw.scl - s/2f).rotate(rot); Draw.rect(clipped, x + Tmp.v1.x, y + Tmp.v1.y, rot); clipped = clipRegion(tile.getHitbox(Tmp.r1), tile.getHitbox(Tmp.r2).move(trprev, 0), topRegion); //prev - Tmp.v1.set(- s/2f + clipped.getWidth()/2f*Draw.scl, - s/2f + clipped.getHeight()/2f*Draw.scl).rotate(rot); + Tmp.v1.set(- s/2f + clipped.width /2f*Draw.scl, - s/2f + clipped.height /2f*Draw.scl).rotate(rot); Draw.rect(clipped, x + Tmp.v1.x, y + Tmp.v1.y, rot); for(int i = 0; i < 4; i++){ if(blends(i) && i != rotation){ Draw.alpha(1f - Interp.pow5In.apply(fract())); //prev from back - Tmp.v1.set(- s/2f + clipped.getWidth()/2f*Draw.scl, - s/2f + clipped.getHeight()/2f*Draw.scl).rotate(i * 90 + 180); + Tmp.v1.set(- s/2f + clipped.width /2f*Draw.scl, - s/2f + clipped.height /2f*Draw.scl).rotate(i * 90 + 180); Draw.rect(clipped, x + Tmp.v1.x, y + Tmp.v1.y, i * 90 + 180); } } @@ -191,17 +206,28 @@ public class PayloadConveyor extends Block{ return Time.time(); } + @Override + public void unitOn(Unit unit){ + //calculate derivative of units moved last frame + float delta = (curInterp - lastInterp) * size * tilesize; + Tmp.v1.trns(rotdeg(), delta * moveForce).scl(1f / Math.max(unit.mass(), 201f)); + unit.move(Tmp.v1.x, Tmp.v1.y); + } + @Override public boolean acceptPayload(Building source, Payload payload){ + if(source == this){ + return this.item == null && payload.fits(payloadLimit); + } //accepting payloads from units isn't supported - return this.item == null && progress <= 5f && source != this && payload.fits(); + return this.item == null && progress <= 5f && payload.fits(payloadLimit); } @Override public void handlePayload(Building source, Payload payload){ this.item = payload; this.stepAccepted = curStep(); - this.itemRotation = source.angleTo(this); + this.itemRotation = source == this ? rotdeg() : source.angleTo(this); this.animation = 0; updatePayload(); @@ -220,7 +246,7 @@ public class PayloadConveyor extends Block{ public void read(Reads read, byte revision){ super.read(read, revision); - progress = read.f(); + read.f(); //why is progress written? itemRotation = read.f(); item = Payload.read(read); } @@ -261,12 +287,12 @@ public class PayloadConveyor extends Block{ boolean overlaps = Intersector.intersectRectangles(bounds, sprite, over); TextureRegion out = Tmp.tr1; - out.set(region.getTexture()); + out.set(region.texture); if(overlaps){ - float w = region.getU2() - region.getU(); - float h = region.getV2() - region.getV(); - float x = region.getU(), y = region.getV(); + float w = region.u2 - region.u; + float h = region.v2 - region.v; + float x = region.u, y = region.v; float newX = (over.x - sprite.x) / sprite.width * w + x; float newY = (over.y - sprite.y) / sprite.height * h + y; float newW = (over.width / sprite.width) * w, newH = (over.height / sprite.height) * h; diff --git a/core/src/mindustry/world/blocks/distribution/PayloadRouter.java b/core/src/mindustry/world/blocks/distribution/PayloadRouter.java index d9bff19be2..3f277c82d3 100644 --- a/core/src/mindustry/world/blocks/distribution/PayloadRouter.java +++ b/core/src/mindustry/world/blocks/distribution/PayloadRouter.java @@ -5,7 +5,9 @@ import arc.math.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.entities.units.*; +import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.world.blocks.payloads.*; public class PayloadRouter extends PayloadConveyor{ public @Load("@-over") TextureRegion overRegion; @@ -33,13 +35,27 @@ public class PayloadRouter extends PayloadConveyor{ smoothRot = rotdeg(); } + public void pickNext(){ + if(item != null){ + int rotations = 0; + do{ + rotation = (rotation + 1) % 4; + onProximityUpdate(); + //this condition intentionally uses "accept from itself" conditions, because payload conveyors only accept during the start + //"accept from self" conditions are for dropped payloads and are less restrictive + }while((blocked || next == null || !next.acceptPayload(next, item)) && ++rotations < 4); + } + } + @Override - public void moved(){ - int rotations = 0; - do{ - rotation = (rotation + 1) % 4; - onProximityUpdate(); - }while((blocked || next == null) && ++rotations < 4); + public void handlePayload(Building source, Payload payload){ + super.handlePayload(source, payload); + pickNext(); + } + + @Override + public void moveFailed(){ + pickNext(); } @Override diff --git a/core/src/mindustry/world/blocks/distribution/Router.java b/core/src/mindustry/world/blocks/distribution/Router.java index af3833f34b..5b107d5a0e 100644 --- a/core/src/mindustry/world/blocks/distribution/Router.java +++ b/core/src/mindustry/world/blocks/distribution/Router.java @@ -28,14 +28,14 @@ public class Router extends Block{ @Override public void updateTile(){ if(lastItem == null && items.any()){ - items.clear(); + lastItem = items.first(); } if(lastItem != null){ time += 1f / speed * delta(); Building target = getTileTarget(lastItem, lastInput, false); - if(target != null && (time >= 1f || !(target.block() instanceof Router || target.block().instantTransfer))){ + if(target != null && (time >= 1f || !(target.block instanceof Router || target.block.instantTransfer))){ getTileTarget(lastItem, lastInput, true); target.handleItem(this, lastItem); items.remove(lastItem, 1); diff --git a/core/src/mindustry/world/blocks/distribution/Sorter.java b/core/src/mindustry/world/blocks/distribution/Sorter.java index 3601a0b382..137a54aefa 100644 --- a/core/src/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/mindustry/world/blocks/distribution/Sorter.java @@ -3,7 +3,6 @@ package mindustry.world.blocks.distribution; import arc.graphics.g2d.*; import arc.math.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.entities.units.*; @@ -88,7 +87,7 @@ public class Sorter extends Block{ public boolean isSame(Building other){ // comment code below to allow sorter/gate chaining - return other != null && other.block().instantTransfer; + return other != null && other.block.instantTransfer; } public Building getTileTarget(Item item, Building source, boolean flip){ @@ -105,9 +104,9 @@ public class Sorter extends Block{ }else{ Building a = nearby(Mathf.mod(dir - 1, 4)); Building b = nearby(Mathf.mod(dir + 1, 4)); - boolean ac = a != null && !(a.block().instantTransfer && source.block().instantTransfer) && + boolean ac = a != null && !(a.block.instantTransfer && source.block.instantTransfer) && a.acceptItem(this, item); - boolean bc = b != null && !(b.block().instantTransfer && source.block().instantTransfer) && + boolean bc = b != null && !(b.block.instantTransfer && source.block.instantTransfer) && b.acceptItem(this, item); if(ac && !bc){ diff --git a/core/src/mindustry/world/blocks/distribution/StackConveyor.java b/core/src/mindustry/world/blocks/distribution/StackConveyor.java index 8f1caf2a21..e7095a686c 100644 --- a/core/src/mindustry/world/blocks/distribution/StackConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/StackConveyor.java @@ -2,6 +2,7 @@ package mindustry.world.blocks.distribution; import arc.graphics.g2d.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; @@ -14,6 +15,7 @@ import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.*; +import mindustry.world.blocks.distribution.Conveyor.*; import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -27,6 +29,7 @@ public class StackConveyor extends Block implements Autotiler{ public float speed = 0f; public boolean splitOut = true; + /** (minimum) amount of loading docks needed to fill a line */ public float recharge = 2f; public Effect loadEffect = Fx.plasticburn; public Effect unloadEffect = Fx.plasticburn; @@ -115,20 +118,22 @@ public class StackConveyor extends Block implements Autotiler{ Draw.z(Layer.blockOver); - Building from = world.build(link); + Tile from = world.tile(link); - if(link == -1 || from == null) return; + if(link == -1 || from == null || lastItem == null) return; + + int fromRot = from.build == null ? rotation : from.build.rotation; //offset - Tmp.v1.set(from); - Tmp.v2.set(tile); + Tmp.v1.set(from.worldx(), from.worldy()); + Tmp.v2.set(x, y); Tmp.v1.interpolate(Tmp.v2, 1f - cooldown, Interp.linear); //rotation - float a = (from.rotation%4) * 90; + float a = (fromRot%4) * 90; float b = (rotation%4) * 90; - if((from.rotation%4) == 3 && (rotation%4) == 0) a = -1 * 90; - if((from.rotation%4) == 0 && (rotation%4) == 3) a = 4 * 90; + if((fromRot%4) == 3 && (rotation%4) == 0) a = -1 * 90; + if((fromRot%4) == 0 && (rotation%4) == 3) a = 4 * 90; //stack Draw.rect(stackRegion, Tmp.v1.x, Tmp.v1.y, Mathf.lerp(a, b, Interp.smooth.apply(1f - Mathf.clamp(cooldown * 2, 0f, 1f)))); @@ -136,7 +141,7 @@ public class StackConveyor extends Block implements Autotiler{ //item float size = itemSize * Mathf.lerp(Math.min((float)items.total() / itemCapacity, 1), 1f, 0.4f); Drawf.shadow(Tmp.v1.x, Tmp.v1.y, size * 1.2f); - Draw.rect(items.first().icon(Cicon.medium), Tmp.v1.x, Tmp.v1.y, size, size, 0); + Draw.rect(lastItem.icon(Cicon.medium), Tmp.v1.x, Tmp.v1.y, size, size, 0); } @Override @@ -195,11 +200,7 @@ public class StackConveyor extends Block implements Autotiler{ } }else{ //transfer if(state != stateLoad || (items.total() >= getMaximumAccepted(lastItem))){ - if(front() != null - && front().team == team - && front().block instanceof StackConveyor){ - StackConveyorBuild e = (StackConveyorBuild)front(); - + if(front() instanceof StackConveyorBuild e && e.team == team){ // sleep if its occupied if(e.link == -1){ e.items.addAll(items); @@ -217,6 +218,16 @@ public class StackConveyor extends Block implements Autotiler{ } } + @Override + public void overwrote(Seq builds){ + if(builds.first() instanceof ConveyorBuild build){ + Item item = build.items.first(); + if(item != null){ + handleStack(item, build.items.get(item), null); + } + } + } + @Override public boolean shouldIdleSound(){ return false; // has no moving parts; diff --git a/core/src/mindustry/world/blocks/environment/Rock.java b/core/src/mindustry/world/blocks/environment/Boulder.java similarity index 79% rename from core/src/mindustry/world/blocks/environment/Rock.java rename to core/src/mindustry/world/blocks/environment/Boulder.java index 1c3abc1a15..28893d22d4 100644 --- a/core/src/mindustry/world/blocks/environment/Rock.java +++ b/core/src/mindustry/world/blocks/environment/Boulder.java @@ -1,16 +1,14 @@ package mindustry.world.blocks.environment; -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 arc.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.world.*; -public class Rock extends Block{ +public class Boulder extends Block{ protected int variants; - public Rock(String name){ + public Boulder(String name){ super(name); breakable = true; alwaysReplace = true; diff --git a/core/src/mindustry/world/blocks/environment/Cliff.java b/core/src/mindustry/world/blocks/environment/Cliff.java index 408fb2ee5a..49dba95d7c 100644 --- a/core/src/mindustry/world/blocks/environment/Cliff.java +++ b/core/src/mindustry/world/blocks/environment/Cliff.java @@ -2,10 +2,13 @@ package mindustry.world.blocks.environment; import arc.graphics.g2d.*; import arc.util.*; +import mindustry.annotations.Annotations.*; import mindustry.graphics.*; import mindustry.world.*; public class Cliff extends Block{ + public float size = 11f; + public @Load(value = "cliffmask#", length = 256) TextureRegion[] cliffs; public Cliff(String name){ super(name); @@ -18,14 +21,8 @@ public class Cliff extends Block{ @Override public void drawBase(Tile tile){ - int r = tile.data; - for(int i = 0; i < 8; i++){ - if((r & (1 << i)) != 0){ - Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.3f + (i >= 4 ? -0.4f : 0.3f))); - Draw.rect(region, tile.worldx(), tile.worldy(), 11f, 11f, i * 45f); - } - } - + Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.6f)); + Draw.rect(cliffs[tile.data & 0xff], tile.worldx(), tile.worldy()); Draw.color(); } diff --git a/core/src/mindustry/world/blocks/environment/Floor.java b/core/src/mindustry/world/blocks/environment/Floor.java index 89a5918469..a70056717a 100644 --- a/core/src/mindustry/world/blocks/environment/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -7,7 +7,7 @@ import arc.graphics.g2d.TextureAtlas.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.graphics.*; @@ -37,7 +37,7 @@ public class Floor extends Block{ /** Effect displayed when drowning on this floor. */ public Effect drownUpdateEffect = Fx.bubble; /** Status effect applied when walking on. */ - public @NonNull StatusEffect status = StatusEffects.none; + public StatusEffect status = StatusEffects.none; /** Intensity of applied status effect. */ public float statusDuration = 60f; /** liquids that drop from this block, used for pumps */ @@ -67,7 +67,7 @@ public class Floor extends Block{ protected TextureRegion[][] edges; protected Seq blenders = new Seq<>(); - protected IntSet blended = new IntSet(); + protected Bits blended = new Bits(256); protected TextureRegion edgeRegion; public Floor(String name){ @@ -103,16 +103,15 @@ public class Floor extends Block{ super.init(); if(wall == Blocks.air){ - wall = content.block(name + "Rocks"); - if(wall == null) wall = content.block(name + "rocks"); - if(wall == null) wall = content.block(name.replace("darksand", "dune") + "rocks"); + wall = content.block(name + "-wall"); + if(wall == null) wall = content.block(name.replace("darksand", "dune") + "-wall"); } //keep default value if not found... if(wall == null) wall = Blocks.air; if(decoration == Blocks.air){ - decoration = content.blocks().min(b -> b instanceof Rock && b.breakable ? mapColor.diff(b.mapColor) : Float.POSITIVE_INFINITY); + decoration = content.blocks().min(b -> b instanceof Boulder && b.breakable ? mapColor.diff(b.mapColor) : Float.POSITIVE_INFINITY); } } @@ -167,34 +166,52 @@ public class Floor extends Block{ return new TextureRegion[]{Core.atlas.find(Core.atlas.has(name) ? name : name + "1")}; } + /** @return whether this floor has a valid surface on which to place things, e.g. scorch marks. */ + public boolean hasSurface(){ + return !isLiquid && !solid; + } + public boolean isDeep(){ return drownTime > 0; } - public void drawNonLayer(Tile tile){ + public void drawNonLayer(Tile tile, CacheLayer layer){ Mathf.rand.setSeed(tile.pos()); - drawEdges(tile, true); - } - - protected void drawEdges(Tile tile){ - drawEdges(tile, false); - } - - protected void drawEdges(Tile tile, boolean sameLayer){ blenders.clear(); blended.clear(); for(int i = 0; i < 8; i++){ Point2 point = Geometry.d8[i]; Tile other = tile.getNearby(point); - if(other != null && doEdge(other.floor(), sameLayer) && other.floor().edges() != null){ - if(blended.add(other.floor().id)){ + if(other != null && other.floor().cacheLayer == layer && other.floor().edges() != null){ + if(!blended.getAndSet(other.floor().id)){ blenders.add(other.floor()); } } } + drawBlended(tile); + } + + protected void drawEdges(Tile tile){ + blenders.clear(); + blended.clear(); + + for(int i = 0; i < 8; i++){ + Point2 point = Geometry.d8[i]; + Tile other = tile.getNearby(point); + if(other != null && doEdge(other.floor()) && other.floor().cacheLayer == cacheLayer && other.floor().edges() != null){ + if(!blended.getAndSet(other.floor().id)){ + blenders.add(other.floor()); + } + } + } + + drawBlended(tile); + } + + protected void drawBlended(Tile tile){ blenders.sort(a -> a.id); for(Block block : blenders){ @@ -202,23 +219,18 @@ public class Floor extends Block{ Point2 point = Geometry.d8[i]; Tile other = tile.getNearby(point); if(other != null && other.floor() == block){ - TextureRegion region = edge((Floor)block, 2 - (point.x + 1), 2 - (point.y + 1)); + TextureRegion region = edge((Floor)block, 1 - point.x, 1 - point.y); Draw.rect(region, tile.worldx(), tile.worldy()); - - if(!sameLayer && block.cacheLayer.ordinal() > cacheLayer.ordinal()){ - Draw.rect(block.variantRegions()[0], tile.worldx() + point.x*tilesize, tile.worldy() + point.y*tilesize); - } } } } - } //'new' style of edges with shadows instead of colors, not used currently protected void drawEdgesFlat(Tile tile, boolean sameLayer){ for(int i = 0; i < 4; i++){ Tile other = tile.getNearby(i); - if(other != null && doEdge(other.floor(), sameLayer)){ + if(other != null && doEdge(other.floor())){ Color color = other.floor().mapColor; Draw.color(color.r, color.g, color.b, 1f); Draw.rect(edgeRegion, tile.worldx(), tile.worldy(), i*90); @@ -232,8 +244,8 @@ public class Floor extends Block{ return ((Floor)blendGroup).edges; } - protected boolean doEdge(Floor other, boolean sameLayer){ - return (((other.blendGroup.id > blendGroup.id) || edges() == null) && (other.cacheLayer.ordinal() > this.cacheLayer.ordinal() || !sameLayer)); + protected boolean doEdge(Floor other){ + return other.blendGroup.id > blendGroup.id || edges() == null; } TextureRegion edge(Floor block, int x, int y){ diff --git a/core/src/mindustry/world/blocks/environment/OreBlock.java b/core/src/mindustry/world/blocks/environment/OreBlock.java index a5514e06ea..943d91076d 100644 --- a/core/src/mindustry/world/blocks/environment/OreBlock.java +++ b/core/src/mindustry/world/blocks/environment/OreBlock.java @@ -1,15 +1,15 @@ package mindustry.world.blocks.environment; import arc.*; -import mindustry.annotations.Annotations.*; import arc.graphics.*; import arc.graphics.g2d.*; +import mindustry.annotations.Annotations.*; import mindustry.graphics.*; import mindustry.graphics.MultiPacker.*; import mindustry.type.*; import mindustry.world.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; /**An overlay ore for a specific item type.*/ public class OreBlock extends OverlayFloor{ diff --git a/core/src/mindustry/world/blocks/environment/OverlayFloor.java b/core/src/mindustry/world/blocks/environment/OverlayFloor.java index 4f2d6acfd9..f7a92ceeb3 100644 --- a/core/src/mindustry/world/blocks/environment/OverlayFloor.java +++ b/core/src/mindustry/world/blocks/environment/OverlayFloor.java @@ -1,8 +1,8 @@ package mindustry.world.blocks.environment; -import arc.graphics.g2d.Draw; -import arc.math.Mathf; -import mindustry.world.Tile; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.world.*; /**A type of floor that is overlaid on top of over floors.*/ public class OverlayFloor extends Floor{ diff --git a/core/src/mindustry/world/blocks/environment/StaticTree.java b/core/src/mindustry/world/blocks/environment/StaticTree.java index 3550895b96..78c6133d2f 100644 --- a/core/src/mindustry/world/blocks/environment/StaticTree.java +++ b/core/src/mindustry/world/blocks/environment/StaticTree.java @@ -4,7 +4,7 @@ import arc.graphics.g2d.*; import arc.util.*; import mindustry.world.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class StaticTree extends StaticWall{ @@ -16,7 +16,7 @@ public class StaticTree extends StaticWall{ public void drawBase(Tile tile){ TextureRegion r = Tmp.tr1; r.set(region); - int crop = (region.getWidth() - tilesize*4) / 2; + int crop = (region.width - tilesize*4) / 2; float ox = 0; float oy = 0; @@ -24,7 +24,7 @@ public class StaticTree extends StaticWall{ if(tile.getNearby(i) != null && tile.getNearby(i).block() instanceof StaticWall){ if(i == 0){ - r.setWidth(r.getWidth() - crop); + r.setWidth(r.width - crop); ox -= crop /2f; }else if(i == 1){ r.setY(r.getY() + crop); @@ -33,7 +33,7 @@ public class StaticTree extends StaticWall{ r.setX(r.getX() + crop); ox += crop /2f; }else{ - r.setHeight(r.getHeight() - crop); + r.setHeight(r.height - crop); oy += crop /2f; } } diff --git a/core/src/mindustry/world/blocks/environment/StaticWall.java b/core/src/mindustry/world/blocks/environment/StaticWall.java index 4142db8700..a364db4ab2 100644 --- a/core/src/mindustry/world/blocks/environment/StaticWall.java +++ b/core/src/mindustry/world/blocks/environment/StaticWall.java @@ -8,9 +8,9 @@ import mindustry.annotations.Annotations.*; import mindustry.graphics.*; import mindustry.world.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; -public class StaticWall extends Rock{ +public class StaticWall extends Boulder{ public @Load("@-large") TextureRegion large; public TextureRegion[][] split; diff --git a/core/src/mindustry/world/blocks/environment/TreeBlock.java b/core/src/mindustry/world/blocks/environment/TreeBlock.java index bf7382cbaa..cd199d8d25 100644 --- a/core/src/mindustry/world/blocks/environment/TreeBlock.java +++ b/core/src/mindustry/world/blocks/environment/TreeBlock.java @@ -1,13 +1,12 @@ package mindustry.world.blocks.environment; import arc.graphics.g2d.*; -import arc.math.Mathf; +import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.annotations.Annotations.*; -import mindustry.graphics.Layer; -import mindustry.world.Block; -import mindustry.world.Tile; +import mindustry.graphics.*; +import mindustry.world.*; public class TreeBlock extends Block{ public @Load("@-shadow") TextureRegion shadow; @@ -24,7 +23,7 @@ public class TreeBlock extends Block{ float x = tile.worldx(), y = tile.worldy(); float rot = Mathf.randomSeed(tile.pos(), 0, 4) * 90 + Mathf.sin(Time.time() + x, 50f, 0.5f) + Mathf.sin(Time.time() - y, 65f, 0.9f) + Mathf.sin(Time.time() + y - x, 85f, 0.9f); - float w = region.getWidth() * Draw.scl, h = region.getHeight() * Draw.scl; + float w = region.width * Draw.scl, h = region.height * Draw.scl; float scl = 30f, mag = 0.2f; if(shadow.found()){ diff --git a/core/src/mindustry/world/blocks/experimental/BlockForge.java b/core/src/mindustry/world/blocks/experimental/BlockForge.java index 03052caac3..52509674a7 100644 --- a/core/src/mindustry/world/blocks/experimental/BlockForge.java +++ b/core/src/mindustry/world/blocks/experimental/BlockForge.java @@ -4,7 +4,6 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.*; @@ -51,7 +50,7 @@ public class BlockForge extends PayloadAcceptor{ Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90); } - public class BlockForgeBuild extends PayloadAcceptorBuild{ + public class BlockForgeBuild extends PayloadAcceptorBuild{ public @Nullable Block recipe; public float progress, time, heat; @@ -83,7 +82,7 @@ public class BlockForge extends PayloadAcceptor{ if(progress >= recipe.buildCost){ consume(); - payload = new BlockPayload(recipe, team); + payload = new BuildPayload(recipe, team); progress = 0f; } }else{ diff --git a/core/src/mindustry/world/blocks/experimental/BlockLoader.java b/core/src/mindustry/world/blocks/experimental/BlockLoader.java index 0eb5ac903e..3e015ec9a6 100644 --- a/core/src/mindustry/world/blocks/experimental/BlockLoader.java +++ b/core/src/mindustry/world/blocks/experimental/BlockLoader.java @@ -10,7 +10,7 @@ import mindustry.ui.*; import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.production.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class BlockLoader extends PayloadAcceptor{ public final int timerLoad = timers++; @@ -50,13 +50,13 @@ public class BlockLoader extends PayloadAcceptor{ Draw.rect(topRegion, req.drawx(), req.drawy()); } - public class BlockLoaderBuild extends PayloadAcceptorBuild{ + public class BlockLoaderBuild extends PayloadAcceptorBuild{ @Override public boolean acceptPayload(Building source, Payload payload){ return super.acceptPayload(source, payload) && - (payload instanceof BlockPayload) && - ((((BlockPayload)payload).entity.block().hasItems && ((BlockPayload)payload).block().unloadable && ((BlockPayload)payload).block().itemCapacity >= 10)/* || + (payload instanceof BuildPayload) && + ((((BuildPayload)payload).build.block.hasItems && ((BuildPayload)payload).block().unloadable && ((BuildPayload)payload).block().itemCapacity >= 10)/* || ((BlockPayload)payload).entity.block().hasLiquids && ((BlockPayload)payload).block().liquidCapacity >= 10f)*/); } @@ -101,8 +101,8 @@ public class BlockLoader extends PayloadAcceptor{ for(int i = 0; i < items.length(); i++){ if(items.get(i) > 0){ Item item = content.item(i); - if(payload.entity.acceptItem(payload.entity, item)){ - payload.entity.handleItem(payload.entity, item); + if(payload.build.acceptItem(payload.build, item)){ + payload.build.handleItem(payload.build, item); items.remove(item, 1); break; } @@ -127,13 +127,13 @@ public class BlockLoader extends PayloadAcceptor{ } public float fraction(){ - return payload == null ? 0f : payload.entity.items.total() / (float)payload.entity.block().itemCapacity; + return payload == null ? 0f : payload.build.items.total() / (float)payload.build.block.itemCapacity; } public boolean shouldExport(){ return payload != null && - ((payload.block().hasLiquids && payload.entity.liquids.total() >= payload.block().liquidCapacity - 0.001f) || - (payload.block().hasItems && payload.entity.items.total() >= payload.block().itemCapacity)); + ((payload.block().hasLiquids && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) || + (payload.block().hasItems && payload.build.items.total() >= payload.block().itemCapacity)); } } } diff --git a/core/src/mindustry/world/blocks/experimental/BlockUnloader.java b/core/src/mindustry/world/blocks/experimental/BlockUnloader.java index be39284cc7..10c542deee 100644 --- a/core/src/mindustry/world/blocks/experimental/BlockUnloader.java +++ b/core/src/mindustry/world/blocks/experimental/BlockUnloader.java @@ -3,7 +3,7 @@ package mindustry.world.blocks.experimental; import mindustry.gen.*; import mindustry.type.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class BlockUnloader extends BlockLoader{ @@ -35,9 +35,9 @@ public class BlockUnloader extends BlockLoader{ //load up items a set amount of times for(int j = 0; j < itemsLoaded && !full(); j++){ for(int i = 0; i < items.length(); i++){ - if(payload.entity.items.get(i) > 0){ + if(payload.build.items.get(i) > 0){ Item item = content.item(i); - payload.entity.items.remove(item, 1); + payload.build.items.remove(item, 1); items.add(item, 1); break; } @@ -56,12 +56,12 @@ public class BlockUnloader extends BlockLoader{ @Override public float fraction(){ - return payload == null ? 0f : 1f - payload.entity.items.total() / (float)payload.entity.block().itemCapacity; + return payload == null ? 0f : 1f - payload.build.items.total() / (float)payload.build.block.itemCapacity; } @Override public boolean shouldExport(){ - return payload != null && (payload.block().hasItems && payload.entity.items.empty()); + return payload != null && (payload.block().hasItems && payload.build.items.empty()); } } } diff --git a/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java index 060add232a..c2af911324 100644 --- a/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java +++ b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java @@ -11,7 +11,7 @@ public class ArmoredConduit extends Conduit{ public ArmoredConduit(String name){ super(name); - leakResistance = 10f; + leaks = false; } @Override @@ -26,15 +26,15 @@ public class ArmoredConduit extends Conduit{ // draw the cap when a conduit would normally leak Building next = front(); - if(next != null && next.team == team && next.block().hasLiquids) return; + if(next != null && next.team == team && next.block.hasLiquids) return; Draw.rect(capRegion, x, y, rotdeg()); } @Override - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ - return super.acceptLiquid(source, liquid, amount) && (source.block() instanceof Conduit) || - Edges.getFacingEdge(source.tile(), tile).absoluteRelativeTo(tile.x, tile.y) == rotation; + public boolean acceptLiquid(Building source, Liquid liquid){ + return super.acceptLiquid(source, liquid) && (source.block instanceof Conduit || + source.tile.absoluteRelativeTo(tile.x, tile.y) == rotation); } } } diff --git a/core/src/mindustry/world/blocks/liquid/Conduit.java b/core/src/mindustry/world/blocks/liquid/Conduit.java index 69cc036a13..2af6613212 100644 --- a/core/src/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/mindustry/world/blocks/liquid/Conduit.java @@ -27,7 +27,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ public @Load(value = "@-top-#", length = 5) TextureRegion[] topRegions; public @Load(value = "@-bottom-#", length = 5, fallback = "conduit-bottom-#") TextureRegion[] botRegions; - public float leakResistance = 1.5f; + public boolean leaks = true; public Conduit(String name){ super(name); @@ -65,7 +65,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ @Override public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ - return otherblock.hasLiquids && otherblock.outputsLiquid && lookingAtEither(tile, rotation, otherx, othery, otherrot, otherblock); + return otherblock.hasLiquids && (otherblock.outputsLiquid || (lookingAt(tile, rotation, otherx, othery, otherblock))) && lookingAtEither(tile, rotation, otherx, othery, otherrot, otherblock); } @Override @@ -88,25 +88,22 @@ public class Conduit extends LiquidBlock implements Autotiler{ if((blending & (1 << i)) != 0){ int dir = r - i; float rot = i == 0 ? rotation : (dir)*90; - drawAt(x + Geometry.d4x(dir) * tilesize*0.75f, y + Geometry.d4y(dir) * tilesize*0.75f, 0, rot, i != 0 ? 1 : 2); + drawAt(x + Geometry.d4x(dir) * tilesize*0.75f, y + Geometry.d4y(dir) * tilesize*0.75f, 0, rot, i != 0 ? SliceMode.bottom : SliceMode.top); } } Draw.z(Layer.block); Draw.scl(xscl, yscl); - drawAt(x, y, blendbits, rotation, 0); + drawAt(x, y, blendbits, rotation, SliceMode.none); Draw.reset(); } - protected void drawAt(float x, float y, int bits, float rotation, int slice){ + protected void drawAt(float x, float y, int bits, float rotation, SliceMode slice){ Draw.color(botColor); Draw.rect(sliced(botRegions[bits], slice), x, y, rotation); - Draw.color(liquids.current().color); - Draw.alpha(smoothLiquid); - Draw.rect(sliced(botRegions[bits], slice), x, y, rotation); - Draw.color(); + Drawf.liquid(sliced(botRegions[bits], slice), x, y, smoothLiquid, liquids.current().color, rotation); Draw.rect(sliced(topRegions[bits], slice), x, y, rotation); } @@ -123,9 +120,9 @@ public class Conduit extends LiquidBlock implements Autotiler{ } @Override - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ + public boolean acceptLiquid(Building source, Liquid liquid){ noSleep(); - return liquids.get(liquid) + amount < liquidCapacity && (liquids.current() == liquid || liquids.currentAmount() < 0.2f) + return (liquids.current() == liquid || liquids.currentAmount() < 0.2f) && ((source.relativeTo(tile.x, tile.y) + 2) % 4 != rotation); } @@ -134,7 +131,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ smoothLiquid = Mathf.lerpDelta(smoothLiquid, liquids.currentAmount() / liquidCapacity, 0.05f); if(liquids.total() > 0.001f && timer(timerFlow, 1)){ - moveLiquidForward(leakResistance, liquids.current()); + moveLiquidForward(leaks, liquids.current()); noSleep(); }else{ sleep(); diff --git a/core/src/mindustry/world/blocks/liquid/LiquidBlock.java b/core/src/mindustry/world/blocks/liquid/LiquidBlock.java index 99ce2bda64..eb9a3f16d3 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidBlock.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidBlock.java @@ -3,6 +3,7 @@ package mindustry.world.blocks.liquid; import arc.graphics.g2d.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.world.*; import mindustry.world.meta.*; @@ -32,10 +33,7 @@ public class LiquidBlock extends Block{ Draw.rect(bottomRegion, x, y, rotation); if(liquids.total() > 0.001f){ - Draw.color(liquids.current().color); - Draw.alpha(liquids.total() / liquidCapacity); - Draw.rect(liquidRegion, x, y, rotation); - Draw.color(); + Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); } Draw.rect(topRegion, x, y, rotation); diff --git a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java index c658cde66c..59205c3c92 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java @@ -6,7 +6,7 @@ import mindustry.type.*; import mindustry.world.blocks.distribution.*; import mindustry.world.meta.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; public class LiquidBridge extends ItemBridge{ diff --git a/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java index 6d925d7087..76e4929b45 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java @@ -6,7 +6,7 @@ import mindustry.type.*; import mindustry.world.blocks.distribution.*; import mindustry.world.meta.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; public class LiquidExtendingBridge extends ExtendingItemBridge{ @@ -42,7 +42,7 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{ if(moveLiquid(other, liquids.current()) > 0.1f){ cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); }else{ - cycleSpeed = Mathf.lerpDelta(cycleSpeed, 1f, 0.01f); + cycleSpeed = Mathf.lerpDelta(cycleSpeed, 0f, 0.01f); } } } diff --git a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java index b449d721a8..09e5b70bb0 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java @@ -41,7 +41,7 @@ public class LiquidJunction extends LiquidBlock{ int dir = source.relativeTo(tile.x, tile.y); dir = (dir + 4) % 4; Building next = nearby(dir); - if(next == null || (!next.acceptLiquid(this, liquid, 0f) && !(next.block() instanceof LiquidJunction))){ + if(next == null || (!next.acceptLiquid(this, liquid) && !(next.block instanceof LiquidJunction))){ return this; } return next.getLiquidDestination(this, liquid); diff --git a/core/src/mindustry/world/blocks/liquid/LiquidRouter.java b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java index 60fab24df1..d3befe8233 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidRouter.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java @@ -20,8 +20,8 @@ public class LiquidRouter extends LiquidBlock{ } @Override - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ - return liquids.get(liquid) + amount < liquidCapacity && (liquids.current() == liquid || liquids.currentAmount() < 0.2f); + public boolean acceptLiquid(Building source, Liquid liquid){ + return (liquids.current() == liquid || liquids.currentAmount() < 0.2f); } } } diff --git a/core/src/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java index 8710fd43b2..aecf5d4149 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -34,7 +34,6 @@ public class LogicBlock extends Block{ update = true; solid = true; configurable = true; - sync = true; config(byte[].class, (LogicBuild build, byte[] data) -> build.readCompressed(data, true)); @@ -69,7 +68,7 @@ public class LogicBlock extends Block{ if(name.contains("-")){ String[] split = name.split("-"); //filter out 'large' at the end of block names - if(split.length >= 2 && split[split.length - 1].equals("large")){ + if(split.length >= 2 && (split[split.length - 1].equals("large") || Strings.canParseFloat(split[split.length - 1]))){ name = split[split.length - 2]; }else{ name = split[split.length - 1]; @@ -128,8 +127,7 @@ public class LogicBlock extends Block{ @Override public Object pointConfig(Object config, Cons transformer){ - if(config instanceof byte[]){ - byte[] data = (byte[])config; + if(config instanceof byte[] data){ try(DataInputStream stream = new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(data)))){ //discard version for now @@ -305,7 +303,7 @@ public class LogicBlock extends Block{ assemble.get(asm); } - asm.putConst("@this", this); + asm.getVar("@this").value = this; asm.putConst("@thisx", x); asm.putConst("@thisy", y); @@ -319,6 +317,12 @@ public class LogicBlock extends Block{ } } + //logic blocks cause write problems when picked up + @Override + public boolean canPickup(){ + return false; + } + @Override public float range(){ return range; @@ -326,6 +330,7 @@ public class LogicBlock extends Block{ @Override public void updateTile(){ + executor.team = team; //check for previously invalid links to add after configuration boolean changed = false; @@ -416,24 +421,13 @@ public class LogicBlock extends Block{ return other != null && other.isValid() && other.team == team && other.within(this, range + other.block.size*tilesize/2f) && !(other instanceof ConstructBuild); } - - @Override public void buildConfiguration(Table table){ - Table cont = new Table(); - cont.defaults().size(40); - - cont.button(Icon.pencil, Styles.clearTransi, () -> { + table.button(Icon.pencil, Styles.clearTransi, () -> { Vars.ui.logic.show(code, code -> { configure(compress(code, relativeConnections())); }); - }); - - //cont.button(Icon.refreshSmall, Styles.clearTransi, () -> { - - //}); - - table.add(cont); + }).size(40); } @Override diff --git a/core/src/mindustry/world/blocks/logic/LogicDisplay.java b/core/src/mindustry/world/blocks/logic/LogicDisplay.java index 6fe7e23e08..cb062259b8 100644 --- a/core/src/mindustry/world/blocks/logic/LogicDisplay.java +++ b/core/src/mindustry/world/blocks/logic/LogicDisplay.java @@ -9,8 +9,8 @@ import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.logic.*; import mindustry.world.*; +import mindustry.world.meta.*; public class LogicDisplay extends Block{ public static final byte @@ -34,11 +34,18 @@ public class LogicDisplay extends Block{ solid = true; } + @Override + public void setStats(){ + super.setStats(); + + stats.add(BlockStat.displaySize, "@x@", displaySize, displaySize); + } + public class LogicDisplayBuild extends Building{ public FrameBuffer buffer; public float color = Color.whiteFloatBits; public float stroke = 1f; - public LongQueue commands = new LongQueue(LExecutor.maxDisplayBuffer); + public LongQueue commands = new LongQueue(256); @Override public void draw(){ @@ -60,7 +67,6 @@ public class LogicDisplay extends Block{ buffer.begin(); Draw.color(color); Lines.stroke(stroke); - Lines.precise(true); while(!commands.isEmpty()){ long c = commands.removeFirst(); @@ -69,20 +75,18 @@ public class LogicDisplay extends Block{ p1 = DisplayCmd.p1(c), p2 = DisplayCmd.p2(c), p3 = DisplayCmd.p3(c), p4 = DisplayCmd.p4(c); switch(type){ - case commandClear: Core.graphics.clear(x/255f, y/255f, p1/255f, 1f); break; - case commandLine: Lines.line(x, y, p1, p2); break; - case commandRect: Fill.crect(x, y, p1, p2); break; - case commandLineRect: Lines.rect(x, y, p1, p2); break; - case commandPoly: Fill.poly(x, y, Math.min(p1, maxSides), p2, p3); break; - case commandLinePoly: Lines.poly(x, y, Math.min(p1, maxSides), p2, p3); break; - case commandTriangle: Fill.tri(x, y, p1, p2, p3, p4); break; - case commandColor: this.color = Color.toFloatBits(x, y, p1, p2); Draw.color(this.color); break; - case commandStroke: this.stroke = x; Lines.stroke(x); break; + case commandClear -> Core.graphics.clear(x / 255f, y / 255f, p1 / 255f, 1f); + case commandLine -> Lines.line(x, y, p1, p2); + case commandRect -> Fill.crect(x, y, p1, p2); + case commandLineRect -> Lines.rect(x, y, p1, p2); + case commandPoly -> Fill.poly(x, y, Math.min(p1, maxSides), p2, p3); + case commandLinePoly -> Lines.poly(x, y, Math.min(p1, maxSides), p2, p3); + case commandTriangle -> Fill.tri(x, y, p1, p2, p3, p4); + case commandColor -> Draw.color(this.color = Color.toFloatBits(x, y, p1, p2)); + case commandStroke -> Lines.stroke(this.stroke = x); } } - Lines.precise(false); - buffer.end(); Draw.proj(Tmp.m1); Draw.reset(); diff --git a/core/src/mindustry/world/blocks/logic/MemoryBlock.java b/core/src/mindustry/world/blocks/logic/MemoryBlock.java index a86900b114..d215238ced 100644 --- a/core/src/mindustry/world/blocks/logic/MemoryBlock.java +++ b/core/src/mindustry/world/blocks/logic/MemoryBlock.java @@ -3,6 +3,7 @@ package mindustry.world.blocks.logic; import arc.util.io.*; import mindustry.gen.*; import mindustry.world.*; +import mindustry.world.meta.*; public class MemoryBlock extends Block{ public int memoryCapacity = 32; @@ -13,9 +14,22 @@ public class MemoryBlock extends Block{ solid = true; } + @Override + public void setStats(){ + super.setStats(); + + stats.add(BlockStat.memoryCapacity, memoryCapacity, StatUnit.none); + } + public class MemoryBuild extends Building{ public double[] memory = new double[memoryCapacity]; + //massive byte size means picking up causes sync issues + @Override + public boolean canPickup(){ + return false; + } + @Override public void write(Writes write){ super.write(write); @@ -31,9 +45,9 @@ public class MemoryBlock extends Block{ super.read(read, revision); int amount = read.i(); - memory = memory.length != amount ? new double[amount] : memory; for(int i = 0; i < amount; i++){ - memory[i] = read.d(); + double val = read.d(); + if(i < memory.length) memory[i] = val; } } } diff --git a/core/src/mindustry/world/blocks/logic/SwitchBlock.java b/core/src/mindustry/world/blocks/logic/SwitchBlock.java index 5bb9dbf621..bca47a306a 100644 --- a/core/src/mindustry/world/blocks/logic/SwitchBlock.java +++ b/core/src/mindustry/world/blocks/logic/SwitchBlock.java @@ -4,7 +4,6 @@ import arc.graphics.g2d.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; -import mindustry.logic.*; import mindustry.world.*; public class SwitchBlock extends Block{ @@ -22,12 +21,6 @@ public class SwitchBlock extends Block{ public class SwitchBuild extends Building{ - @Override - public double sense(LAccess sensor){ - if(sensor == LAccess.enabled) return enabled ? 1 : 0; - return super.sense(sensor); - } - @Override public boolean configTapped(){ configure(!enabled); diff --git a/core/src/mindustry/world/blocks/payloads/BlockPayload.java b/core/src/mindustry/world/blocks/payloads/BlockPayload.java deleted file mode 100644 index d265398525..0000000000 --- a/core/src/mindustry/world/blocks/payloads/BlockPayload.java +++ /dev/null @@ -1,60 +0,0 @@ -package mindustry.world.blocks.payloads; - -import arc.graphics.g2d.*; -import arc.util.io.*; -import mindustry.game.*; -import mindustry.gen.*; -import mindustry.graphics.*; -import mindustry.ui.*; -import mindustry.world.*; - -import static mindustry.Vars.tilesize; - -public class BlockPayload implements Payload{ - public Building entity; - - public BlockPayload(Block block, Team team){ - this.entity = block.newEntity().create(block, team); - } - - public BlockPayload(Building entity){ - this.entity = entity; - } - - public Block block(){ - return entity.block(); - } - - public void place(Tile tile){ - place(tile, 0); - } - - public void place(Tile tile, int rotation){ - tile.setBlock(entity.block(), entity.team, rotation, () -> entity); - entity.dropped(); - } - - @Override - public float size(){ - return entity.block.size * tilesize; - } - - @Override - public void write(Writes write){ - write.b(payloadBlock); - write.s(entity.block().id); - write.b(entity.version()); - entity.writeAll(write); - } - - @Override - public void set(float x, float y, float rotation){ - entity.set(x, y); - } - - @Override - public void draw(){ - Drawf.shadow(entity.x, entity.y, entity.block().size * tilesize * 2f); - Draw.rect(entity.block().icon(Cicon.full), entity.x, entity.y); - } -} diff --git a/core/src/mindustry/world/blocks/payloads/BuildPayload.java b/core/src/mindustry/world/blocks/payloads/BuildPayload.java new file mode 100644 index 0000000000..70414f01de --- /dev/null +++ b/core/src/mindustry/world/blocks/payloads/BuildPayload.java @@ -0,0 +1,60 @@ +package mindustry.world.blocks.payloads; + +import arc.graphics.g2d.*; +import arc.util.io.*; +import mindustry.game.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.*; + +import static mindustry.Vars.*; + +public class BuildPayload implements Payload{ + public Building build; + + public BuildPayload(Block block, Team team){ + this.build = block.newBuilding().create(block, team); + } + + public BuildPayload(Building build){ + this.build = build; + } + + public Block block(){ + return build.block; + } + + public void place(Tile tile){ + place(tile, 0); + } + + public void place(Tile tile, int rotation){ + tile.setBlock(build.block, build.team, rotation, () -> build); + build.dropped(); + } + + @Override + public float size(){ + return build.block.size * tilesize; + } + + @Override + public void write(Writes write){ + write.b(payloadBlock); + write.s(build.block.id); + write.b(build.version()); + build.writeAll(write); + } + + @Override + public void set(float x, float y, float rotation){ + build.set(x, y); + } + + @Override + public void draw(){ + Drawf.shadow(build.x, build.y, build.block.size * tilesize * 2f); + Draw.rect(build.block.icon(Cicon.full), build.x, build.y); + } +} diff --git a/core/src/mindustry/world/blocks/payloads/Payload.java b/core/src/mindustry/world/blocks/payloads/Payload.java index d7d800bba6..0e4773538f 100644 --- a/core/src/mindustry/world/blocks/payloads/Payload.java +++ b/core/src/mindustry/world/blocks/payloads/Payload.java @@ -1,6 +1,6 @@ package mindustry.world.blocks.payloads; -import arc.util.ArcAnnotate.*; +import arc.util.*; import arc.util.io.*; import mindustry.game.*; import mindustry.gen.*; @@ -25,9 +25,9 @@ public interface Payload{ return false; } - /** @return whether this payload fits on a standard 3x3 conveyor. */ - default boolean fits(){ - return size() / tilesize <= 2.4f; + /** @return whether this payload fits in a given size. 2.5 is the max for a standard 3x3 conveyor. */ + default boolean fits(float s){ + return size() / tilesize <= s; } /** writes the payload for saving. */ @@ -51,9 +51,9 @@ public interface Payload{ byte type = read.b(); if(type == payloadBlock){ Block block = content.block(read.s()); - BlockPayload payload = new BlockPayload(block, Team.derelict); + BuildPayload payload = new BuildPayload(block, Team.derelict); byte version = read.b(); - payload.entity.readAll(read, version); + payload.build.readAll(read, version); return (T)payload; }else if(type == payloadUnit){ byte id = read.b(); diff --git a/core/src/mindustry/world/blocks/payloads/UnitPayload.java b/core/src/mindustry/world/blocks/payloads/UnitPayload.java index 4c835cacce..724df792fa 100644 --- a/core/src/mindustry/world/blocks/payloads/UnitPayload.java +++ b/core/src/mindustry/world/blocks/payloads/UnitPayload.java @@ -1,15 +1,23 @@ package mindustry.world.blocks.payloads; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.math.geom.*; +import arc.util.*; import arc.util.io.*; import mindustry.*; +import mindustry.entities.EntityCollisions.*; +import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; public class UnitPayload implements Payload{ + public static final float deactiveDuration = 40f; + public Unit unit; + public float deactiveTime = 0f; public UnitPayload(Unit unit){ this.unit = unit; @@ -35,6 +43,24 @@ public class UnitPayload implements Payload{ @Override public boolean dump(){ + if(!Units.canCreate(unit.team, unit.type())){ + deactiveTime = 1f; + return false; + } + + //check if unit can be dumped here + SolidPred solid = unit.solidity(); + if(solid != null){ + int tx = unit.tileX(), ty = unit.tileY(); + boolean nearEmpty = !solid.solid(tx, ty); + for(Point2 p : Geometry.d4){ + nearEmpty |= !solid.solid(tx + p.x, ty + p.y); + } + + //cannot dump on solid blocks + if(!nearEmpty) return false; + } + //no client dumping if(Vars.net.client()) return true; @@ -49,5 +75,18 @@ public class UnitPayload implements Payload{ public void draw(){ Drawf.shadow(unit.x, unit.y, 20); Draw.rect(unit.type().icon(Cicon.full), unit.x, unit.y, unit.rotation - 90); + + //draw warning + if(deactiveTime > 0){ + Draw.color(Color.scarlet); + Draw.alpha(0.8f * Interp.exp5Out.apply(deactiveTime)); + + float size = 8f; + Draw.rect(Icon.warning.getRegion(), unit.x, unit.y, size, size); + + Draw.reset(); + + deactiveTime = Math.max(deactiveTime - Time.delta/deactiveDuration, 0f); + } } } diff --git a/core/src/mindustry/world/blocks/power/Battery.java b/core/src/mindustry/world/blocks/power/Battery.java index 35b9965eaa..7c1f364b37 100644 --- a/core/src/mindustry/world/blocks/power/Battery.java +++ b/core/src/mindustry/world/blocks/power/Battery.java @@ -2,10 +2,13 @@ package mindustry.world.blocks.power; import arc.graphics.*; import arc.graphics.g2d.*; +import arc.math.*; +import arc.struct.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; +import mindustry.world.meta.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class Battery extends PowerDistributor{ public @Load("@-top") TextureRegion topRegion; @@ -17,6 +20,7 @@ public class Battery extends PowerDistributor{ super(name); outputsPower = true; consumesPower = true; + flags = EnumSet.of(BlockFlag.powerRes); } public class BatteryBuild extends Building{ @@ -28,5 +32,15 @@ public class Battery extends PowerDistributor{ Draw.rect(topRegion, x, y); } + + @Override + public void overwrote(Seq previous){ + for(Building other : previous){ + if(other.power != null && other.block.consumes.hasPower() && other.block.consumes.getPower().buffered){ + float amount = other.block.consumes.getPower().capacity * other.power.status; + power.status = Mathf.clamp(power.status + amount / block.consumes.getPower().capacity); + } + } + } } } diff --git a/core/src/mindustry/world/blocks/power/BurnerGenerator.java b/core/src/mindustry/world/blocks/power/BurnerGenerator.java index 44dae83b25..9e70f9b86f 100644 --- a/core/src/mindustry/world/blocks/power/BurnerGenerator.java +++ b/core/src/mindustry/world/blocks/power/BurnerGenerator.java @@ -2,6 +2,7 @@ package mindustry.world.blocks.power; import arc.graphics.g2d.*; import mindustry.annotations.Annotations.*; +import mindustry.graphics.*; import mindustry.type.*; public class BurnerGenerator extends ItemLiquidGenerator{ @@ -39,6 +40,10 @@ public class BurnerGenerator extends ItemLiquidGenerator{ Draw.rect(turbineRegions[1], x, y, -totalTime * turbineSpeed); Draw.rect(capRegion, x, y); + + if(hasLiquids){ + Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); + } } } } diff --git a/core/src/mindustry/world/blocks/power/ConditionalConsumePower.java b/core/src/mindustry/world/blocks/power/ConditionalConsumePower.java index 780474e3b5..61e1b4b059 100644 --- a/core/src/mindustry/world/blocks/power/ConditionalConsumePower.java +++ b/core/src/mindustry/world/blocks/power/ConditionalConsumePower.java @@ -1,8 +1,8 @@ package mindustry.world.blocks.power; -import arc.func.Boolf; +import arc.func.*; import mindustry.gen.*; -import mindustry.world.consumers.ConsumePower; +import mindustry.world.consumers.*; /** A power consumer that only activates sometimes. */ public class ConditionalConsumePower extends ConsumePower{ diff --git a/core/src/mindustry/world/blocks/power/DecayGenerator.java b/core/src/mindustry/world/blocks/power/DecayGenerator.java index e9fee90eee..becce39642 100644 --- a/core/src/mindustry/world/blocks/power/DecayGenerator.java +++ b/core/src/mindustry/world/blocks/power/DecayGenerator.java @@ -1,6 +1,6 @@ package mindustry.world.blocks.power; -import mindustry.type.Item; +import mindustry.type.*; public class DecayGenerator extends ItemLiquidGenerator{ diff --git a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java index 2419c9a039..2d82bfa4c7 100644 --- a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -165,10 +165,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ } if(hasLiquids){ - Draw.color(liquids.current().color); - Draw.alpha(liquids.currentAmount() / liquidCapacity); - Draw.rect(liquidRegion, x, y); - Draw.color(); + Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); } } diff --git a/core/src/mindustry/world/blocks/power/PowerBlock.java b/core/src/mindustry/world/blocks/power/PowerBlock.java index 5e29e99b75..e71c17aba7 100644 --- a/core/src/mindustry/world/blocks/power/PowerBlock.java +++ b/core/src/mindustry/world/blocks/power/PowerBlock.java @@ -1,7 +1,7 @@ package mindustry.world.blocks.power; -import mindustry.world.Block; -import mindustry.world.meta.BlockGroup; +import mindustry.world.*; +import mindustry.world.meta.*; public abstract class PowerBlock extends Block{ diff --git a/core/src/mindustry/world/blocks/power/PowerDiode.java b/core/src/mindustry/world/blocks/power/PowerDiode.java index 05a577902a..e93dde18e9 100644 --- a/core/src/mindustry/world/blocks/power/PowerDiode.java +++ b/core/src/mindustry/world/blocks/power/PowerDiode.java @@ -40,7 +40,7 @@ public class PowerDiode extends Block{ // battery % of the graph on either side, defaults to zero public float bar(Building tile){ - return (tile != null && tile.block().hasPower) ? tile.power.graph.getLastPowerStored() / tile.power.graph.getTotalBatteryCapacity() : 0f; + return (tile != null && tile.block.hasPower) ? tile.power.graph.getLastPowerStored() / tile.power.graph.getTotalBatteryCapacity() : 0f; } public class PowerDiodeBuild extends Building{ @@ -54,7 +54,7 @@ public class PowerDiode extends Block{ public void updateTile(){ super.updateTile(); - if(front() == null || back() == null || !back().block().hasPower || !front().block().hasPower || back().team != front().team) return; + if(front() == null || back() == null || !back().block.hasPower || !front().block.hasPower || back().team != front().team) return; PowerGraph backGraph = back().power.graph; PowerGraph frontGraph = front().power.graph; diff --git a/core/src/mindustry/world/blocks/power/PowerGraph.java b/core/src/mindustry/world/blocks/power/PowerGraph.java index dd197f313b..fdb19dc05c 100644 --- a/core/src/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/mindustry/world/blocks/power/PowerGraph.java @@ -19,7 +19,8 @@ public class PowerGraph{ private final ObjectSet all = new ObjectSet<>(); private final WindowedMean powerBalance = new WindowedMean(60); - private float lastPowerProduced, lastPowerNeeded, lastUsageFraction, lastPowerStored; + private float lastPowerProduced, lastPowerNeeded, lastPowerStored; + private float lastScaledPowerIn, lastScaledPowerOut, lastCapacity; private long lastFrameUpdated = -1; private final int graphID; @@ -33,6 +34,18 @@ public class PowerGraph{ return graphID; } + public float getLastScaledPowerIn(){ + return lastScaledPowerIn; + } + + public float getLastScaledPowerOut(){ + return lastScaledPowerOut; + } + + public float getLastCapacity(){ + return lastCapacity; + } + public float getPowerBalance(){ return powerBalance.mean(); } @@ -74,7 +87,7 @@ public class PowerGraph{ public float getPowerNeeded(){ float powerNeeded = 0f; for(Building consumer : consumers){ - Consumers consumes = consumer.block().consumes; + Consumers consumes = consumer.block.consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(otherConsumersAreValid(consumer, consumePower)){ @@ -88,7 +101,7 @@ public class PowerGraph{ public float getBatteryStored(){ float totalAccumulator = 0f; for(Building battery : batteries){ - Consumers consumes = battery.block().consumes; + Consumers consumes = battery.block.consumes; if(consumes.hasPower()){ totalAccumulator += battery.power.status * consumes.getPower().capacity; } @@ -99,8 +112,8 @@ public class PowerGraph{ public float getBatteryCapacity(){ float totalCapacity = 0f; for(Building battery : batteries){ - if(battery.block().consumes.hasPower()){ - ConsumePower power = battery.block().consumes.getPower(); + if(battery.block.consumes.hasPower()){ + ConsumePower power = battery.block.consumes.getPower(); totalCapacity += (1f - battery.power.status) * power.capacity; } } @@ -110,8 +123,8 @@ public class PowerGraph{ public float getTotalBatteryCapacity(){ float totalCapacity = 0f; for(Building battery : batteries){ - if(battery.block().consumes.hasPower()){ - totalCapacity += battery.block().consumes.getPower().capacity; + if(battery.block.consumes.hasPower()){ + totalCapacity += battery.block.consumes.getPower().capacity; } } return totalCapacity; @@ -124,7 +137,7 @@ public class PowerGraph{ float used = Math.min(stored, needed); float consumedPowerPercentage = Math.min(1.0f, needed / stored); for(Building battery : batteries){ - Consumers consumes = battery.block().consumes; + Consumers consumes = battery.block.consumes; if(consumes.hasPower()){ battery.power.status *= (1f-consumedPowerPercentage); } @@ -139,7 +152,7 @@ public class PowerGraph{ if(Mathf.equal(capacity, 0f)) return 0f; for(Building battery : batteries){ - Consumers consumes = battery.block().consumes; + Consumers consumes = battery.block.consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(consumePower.capacity > 0f){ @@ -154,7 +167,7 @@ public class PowerGraph{ //distribute even if not needed. this is because some might be requiring power but not using it; it updates consumers float coverage = Mathf.zero(needed) && Mathf.zero(produced) ? 0f : Mathf.zero(needed) ? 1f : Math.min(1, produced / needed); for(Building consumer : consumers){ - Consumers consumes = consumer.block().consumes; + Consumers consumes = consumer.block.consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(consumePower.buffered){ @@ -188,7 +201,7 @@ public class PowerGraph{ tile.power.status = 1f; } - lastPowerNeeded = lastPowerProduced = lastUsageFraction = 1f; + lastPowerNeeded = lastPowerProduced = 1f; return; } @@ -200,6 +213,11 @@ public class PowerGraph{ lastPowerNeeded = powerNeeded; lastPowerProduced = powerProduced; + + lastScaledPowerIn = powerProduced / Time.delta; + lastScaledPowerOut = powerNeeded / Time.delta; + lastCapacity = getTotalBatteryCapacity(); + lastPowerStored = getBatteryStored(); powerBalance.add((lastPowerProduced - lastPowerNeeded) / Time.delta); @@ -218,12 +236,6 @@ public class PowerGraph{ distributePower(powerNeeded, powerProduced); } - - //overproducing: 10 / 20 = 0.5 - //underproducing: 20 / 10 = 2 -> clamp -> 1.0 - //nothing being produced: 20 / 0 -> 1.0 - //nothing being consumed: 0 / 20 -> 0.0 - lastUsageFraction = Mathf.zero(rawProduced) ? 1f : Mathf.clamp(powerNeeded / rawProduced); } public void addGraph(PowerGraph graph){ @@ -237,14 +249,14 @@ public class PowerGraph{ tile.power.graph = this; all.add(tile); - if(tile.block().outputsPower && tile.block().consumesPower && !tile.block().consumes.getPower().buffered){ + if(tile.block.outputsPower && tile.block.consumesPower && !tile.block.consumes.getPower().buffered){ producers.add(tile); consumers.add(tile); - }else if(tile.block().outputsPower && tile.block().consumesPower){ + }else if(tile.block.outputsPower && tile.block.consumesPower){ batteries.add(tile); - }else if(tile.block().outputsPower){ + }else if(tile.block.outputsPower){ producers.add(tile); - }else if(tile.block().consumesPower){ + }else if(tile.block.consumesPower){ consumers.add(tile); } } @@ -311,7 +323,7 @@ public class PowerGraph{ } private boolean otherConsumersAreValid(Building tile, Consume consumePower){ - for(Consume cons : tile.block().consumes.all()){ + for(Consume cons : tile.block.consumes.all()){ if(cons != consumePower && !cons.isOptional() && !cons.valid(tile)){ return false; } diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index eabef55b56..5d033c99b7 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -7,7 +7,6 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.core.*; @@ -27,7 +26,6 @@ public class PowerNode extends PowerBlock{ protected static BuildPlan otherReq; protected final ObjectSet graphs = new ObjectSet<>(); - protected final Vec2 t1 = new Vec2(), t2 = new Vec2(); public @Load("laser") TextureRegion laser; public @Load("laser-end") TextureRegion laserEnd; @@ -38,10 +36,10 @@ public class PowerNode extends PowerBlock{ public PowerNode(String name){ super(name); - expanded = true; configurable = true; consumesPower = false; outputsPower = false; + canOverdrive = false; config(Integer.class, (entity, value) -> { PowerModule power = entity.power; @@ -111,9 +109,15 @@ public class PowerNode extends PowerBlock{ bars.add("batteries", entity -> new Bar(() -> Core.bundle.format("bar.powerstored", - (UI.formatAmount((int)entity.power.graph.getLastPowerStored())), UI.formatAmount((int)entity.power.graph.getTotalBatteryCapacity())), + (UI.formatAmount((int)entity.power.graph.getLastPowerStored())), UI.formatAmount((int)entity.power.graph.getLastCapacity())), () -> Pal.powerBar, - () -> Mathf.clamp(entity.power.graph.getLastPowerStored() / entity.power.graph.getTotalBatteryCapacity()))); + () -> Mathf.clamp(entity.power.graph.getLastPowerStored() / entity.power.graph.getLastCapacity()))); + + bars.add("connections", entity -> new Bar(() -> + Core.bundle.format("bar.powerlines", entity.power.links.size, maxNodes), + () -> Pal.items, + () -> (float)entity.power.links.size / (float)maxNodes + )); } @Override @@ -135,35 +139,29 @@ public class PowerNode extends PowerBlock{ Drawf.circles(x * tilesize + offset, y * tilesize + offset, laserRange * tilesize); getPotentialLinks(tile, other -> { - Drawf.square(other.x, other.y, other.block().size * tilesize / 2f + 2f, Pal.place); + Drawf.square(other.x, other.y, other.block.size * tilesize / 2f + 2f, Pal.place); insulators(tile.x, tile.y, other.tileX(), other.tileY(), cause -> { - Drawf.square(cause.x, cause.y, cause.block().size * tilesize / 2f + 2f, Pal.plastanium); + Drawf.square(cause.x, cause.y, cause.block.size * tilesize / 2f + 2f, Pal.plastanium); }); }); Draw.reset(); } - protected void drawLaser(Team team, float x1, float y1, float x2, float y2, float satisfaction, int size1, int size2){ - float opacity = Core.settings.getInt("lasersopacity") / 100f; - if(Mathf.zero(opacity)) return; - - float angle1 = Angles.angle(x1, y1, x2, y2); - t1.trns(angle1, size1 * tilesize / 2f - 1.5f); - t2.trns(angle1 + 180f, size2 * tilesize / 2f - 1.5f); - - x1 += t1.x; - y1 += t1.y; - x2 += t2.x; - y2 += t2.y; - + protected void setupColor(float satisfaction){ float fract = 1f - satisfaction; Draw.color(laserColor1, laserColor2, fract * 0.86f + Mathf.absin(3f, 0.1f)); - Draw.alpha(opacity); - Drawf.laser(team, laser, laserEnd, x1, y1, x2, y2, 0.25f); - Draw.color(); + Draw.alpha(renderer.laserOpacity); + } + + protected void drawLaser(Team team, float x1, float y1, float x2, float y2, int size1, int size2){ + float angle1 = Angles.angle(x1, y1, x2, y2); + float vx = Mathf.cosDeg(angle1), vy = Mathf.sinDeg(angle1); + float len1 = size1 * tilesize / 2f - 1.5f, len2 = size2 * tilesize / 2f - 1.5f; + + Drawf.laser(team, laser, laserEnd, x1 + vx*len1, y1 + vy*len1, x2 - vx*len2, y2 - vy*len2, 0.25f); } protected boolean overlaps(float srcx, float srcy, Tile other, float range){ @@ -185,9 +183,9 @@ public class PowerNode extends PowerBlock{ protected void getPotentialLinks(Tile tile, Cons others){ Boolf valid = other -> other != null && other.tile() != tile && other.power != null && - ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && + ((!other.block.outputsPower && other.block.consumesPower) || (other.block.outputsPower && !other.block.consumesPower) || other.block instanceof PowerNode) && overlaps(tile.x * tilesize + offset, tile.y * tilesize + offset, other.tile(), laserRange * tilesize) && other.team == player.team() - && !other.proximity().contains(e -> e.tile() == tile) && !graphs.contains(other.power.graph); + && !other.proximity.contains(e -> e.tile == tile) && !graphs.contains(other.power.graph); tempTileEnts.clear(); graphs.clear(); @@ -203,7 +201,7 @@ public class PowerNode extends PowerBlock{ }); tempTileEnts.sort((a, b) -> { - int type = -Boolean.compare(a.block() instanceof PowerNode, b.block() instanceof PowerNode); + int type = -Boolean.compare(a.block instanceof PowerNode, b.block instanceof PowerNode); if(type != 0) return type; return Float.compare(a.dst2(tile), b.dst2(tile)); }); @@ -217,6 +215,7 @@ public class PowerNode extends PowerBlock{ @Override public void drawRequestConfigTop(BuildPlan req, Eachable list){ if(req.config instanceof Point2[]){ + setupColor(1f); for(Point2 point : (Point2[])req.config){ otherReq = null; list.each(other -> { @@ -227,8 +226,9 @@ public class PowerNode extends PowerBlock{ if(otherReq == null || otherReq.block == null) return; - drawLaser(player.team(), req.drawx(), req.drawy(), otherReq.drawx(), otherReq.drawy(), 1f, size, otherReq.block.size); + drawLaser(player.team(), req.drawx(), req.drawy(), otherReq.drawx(), otherReq.drawy(), size, otherReq.block.size); } + Draw.color(); } } @@ -237,11 +237,11 @@ public class PowerNode extends PowerBlock{ } public boolean linkValid(Building tile, Building link, boolean checkMaxNodes){ - if(tile == link || link == null || !link.block().hasPower || tile.team != link.team) return false; + if(tile == link || link == null || !link.block.hasPower || tile.team != link.team) return false; - if(overlaps(tile, link, laserRange * tilesize) || (link.block() instanceof PowerNode && overlaps(link, tile, ((PowerNode)link.block()).laserRange * tilesize))){ - if(checkMaxNodes && link.block() instanceof PowerNode){ - return link.power.links.size < ((PowerNode)link.block()).maxNodes || link.power.links.contains(tile.pos()); + if(overlaps(tile, link, laserRange * tilesize) || (link.block instanceof PowerNode && overlaps(link, tile, ((PowerNode)link.block).laserRange * tilesize))){ + if(checkMaxNodes && link.block instanceof PowerNode){ + return link.power.links.size < ((PowerNode)link.block).maxNodes || link.power.links.contains(tile.pos()); } return true; } @@ -266,7 +266,7 @@ public class PowerNode extends PowerBlock{ world.raycastEach(x, y, x2, y2, (wx, wy) -> { Building tile = world.build(wx, wy); - if(tile != null && tile.block().insulated){ + if(tile != null && tile.block.insulated){ iterator.get(tile); } @@ -280,8 +280,8 @@ public class PowerNode extends PowerBlock{ public void placed(){ if(net.client()) return; - Boolf valid = other -> other != null && other != this && ((!other.block().outputsPower && other.block().consumesPower) || - (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && linkValid(this, other) + Boolf valid = other -> other != null && other != this && ((!other.block.outputsPower && other.block.consumesPower) || + (other.block.outputsPower && !other.block.consumesPower) || other.block instanceof PowerNode) && linkValid(this, other) && !other.proximity().contains(this) && other.power.graph != power.graph; tempTileEnts.clear(); @@ -295,7 +295,7 @@ public class PowerNode extends PowerBlock{ }); tempTileEnts.sort((a, b) -> { - int type = -Boolean.compare(a.block() instanceof PowerNode, b.block() instanceof PowerNode); + int type = -Boolean.compare(a.block instanceof PowerNode, b.block instanceof PowerNode); if(type != 0) return type; return Float.compare(a.dst2(tile), b.dst2(tile)); }); @@ -373,7 +373,7 @@ public class PowerNode extends PowerBlock{ boolean linked = linked(link); if(linked){ - Drawf.square(link.x, link.y, link.block().size * tilesize / 2f + 1f, Pal.place); + Drawf.square(link.x, link.y, link.block.size * tilesize / 2f + 1f, Pal.place); } } } @@ -386,18 +386,19 @@ public class PowerNode extends PowerBlock{ public void draw(){ super.draw(); - if(Core.settings.getInt("lasersopacity") == 0) return; + if(Mathf.zero(renderer.laserOpacity)) return; Draw.z(Layer.power); + setupColor(power.graph.getSatisfaction()); for(int i = 0; i < power.links.size; i++){ Building link = world.build(power.links.get(i)); if(!linkValid(this, link)) continue; - if(link.block() instanceof PowerNode && !(link.pos() < tile.pos())) continue; + if(link.block instanceof PowerNode && link.id >= id) continue; - drawLaserTo(link); + drawLaser(team, x, y, link.x, link.y, size, link.block.size); } Draw.reset(); @@ -407,10 +408,6 @@ public class PowerNode extends PowerBlock{ return power.links.contains(other.pos()); } - protected void drawLaserTo(Building target){ - drawLaser(team, x, y, target.x, target.y, power.graph.getSatisfaction(), size, target.block().size); - } - @Override public Point2[] config(){ Point2[] out = new Point2[power.links.size]; diff --git a/core/src/mindustry/world/blocks/power/SingleTypeGenerator.java b/core/src/mindustry/world/blocks/power/SingleTypeGenerator.java index 22a668160e..ff5da52aaa 100644 --- a/core/src/mindustry/world/blocks/power/SingleTypeGenerator.java +++ b/core/src/mindustry/world/blocks/power/SingleTypeGenerator.java @@ -1,7 +1,6 @@ package mindustry.world.blocks.power; -import mindustry.type.Item; -import mindustry.type.Liquid; +import mindustry.type.*; public class SingleTypeGenerator extends ItemLiquidGenerator{ diff --git a/core/src/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/mindustry/world/blocks/power/ThermalGenerator.java index 7146de2959..e29b7a6bdb 100644 --- a/core/src/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/mindustry/world/blocks/power/ThermalGenerator.java @@ -22,7 +22,7 @@ public class ThermalGenerator extends PowerGenerator{ public void setStats(){ super.setStats(); - stats.add(BlockStat.tiles, attribute); + stats.add(BlockStat.tiles, attribute, floating); } @Override diff --git a/core/src/mindustry/world/blocks/production/Cultivator.java b/core/src/mindustry/world/blocks/production/Cultivator.java index f9341f3c35..2dc97d82f6 100644 --- a/core/src/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/mindustry/world/blocks/production/Cultivator.java @@ -70,9 +70,7 @@ public class Cultivator extends GenericCrafter{ public void draw(){ Draw.rect(region, x, y); - Draw.color(plantColor); - Draw.alpha(warmup); - Draw.rect(middleRegion, x, y); + Drawf.liquid(middleRegion, x, y, warmup, plantColor); Draw.color(bottomColor, plantColorLight, warmup); diff --git a/core/src/mindustry/world/blocks/production/Fracker.java b/core/src/mindustry/world/blocks/production/Fracker.java index 0c6591c3d0..d894cf05b5 100644 --- a/core/src/mindustry/world/blocks/production/Fracker.java +++ b/core/src/mindustry/world/blocks/production/Fracker.java @@ -2,6 +2,7 @@ package mindustry.world.blocks.production; import arc.graphics.g2d.*; import mindustry.annotations.Annotations.*; +import mindustry.graphics.*; import mindustry.world.meta.*; public class Fracker extends SolidPump{ @@ -44,10 +45,7 @@ public class Fracker extends SolidPump{ Draw.rect(region, x, y); super.drawCracks(); - Draw.color(result.color); - Draw.alpha(liquids.get(result) / liquidCapacity); - Draw.rect(liquidRegion, x, y); - Draw.color(); + Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, result.color); Draw.rect(rotatorRegion, x, y, pumpTime); Draw.rect(topRegion, x, y); diff --git a/core/src/mindustry/world/blocks/production/Incinerator.java b/core/src/mindustry/world/blocks/production/Incinerator.java index 1e16aa4faa..d51caf06c2 100644 --- a/core/src/mindustry/world/blocks/production/Incinerator.java +++ b/core/src/mindustry/world/blocks/production/Incinerator.java @@ -73,7 +73,7 @@ public class Incinerator extends Block{ } @Override - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ + public boolean acceptLiquid(Building source, Liquid liquid){ return heat > 0.5f; } } diff --git a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java index 3e365b5fcd..75cfde865f 100644 --- a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java +++ b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java @@ -3,7 +3,7 @@ package mindustry.world.blocks.production; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; @@ -11,7 +11,7 @@ import mindustry.graphics.*; import mindustry.world.*; import mindustry.world.blocks.payloads.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class PayloadAcceptor extends Block{ public float payloadSpeed = 0.5f; @@ -28,22 +28,22 @@ public class PayloadAcceptor extends Block{ } public static boolean blends(Building tile, int direction){ - int size = tile.block().size; + int size = tile.block.size; Building accept = tile.nearby(Geometry.d4(direction).x * size, Geometry.d4(direction).y * size); return accept != null && - accept.block().outputsPayload && + accept.block.outputsPayload && //if size is the same, block must either be facing this one, or not be rotating - ((accept.block().size == size && + ((accept.block.size == size && ((accept.tileX() + Geometry.d4(accept.rotation).x * size == tile.tileX() && accept.tileY() + Geometry.d4(accept.rotation).y * size == tile.tileY()) - || !accept.block().rotate || (accept.block().rotate && !accept.block().outputFacing))) || + || !accept.block.rotate || (accept.block.rotate && !accept.block.outputFacing))) || //if the other block is smaller, check alignment - (accept.block().size < size && + (accept.block.size < size && (accept.rotation % 2 == 0 ? //check orientation; make sure it's aligned properly with this block. - Math.abs(accept.y - tile.y) <= (size * tilesize - accept.block().size * tilesize)/2f : //check Y alignment - Math.abs(accept.x - tile.x) <= (size * tilesize - accept.block().size * tilesize)/2f //check X alignment - )) && (!accept.block().rotate || accept.front() == tile || !accept.block().outputFacing) //make sure it's facing this block + Math.abs(accept.y - tile.y) <= (size * tilesize - accept.block.size * tilesize)/2f : //check Y alignment + Math.abs(accept.x - tile.x) <= (size * tilesize - accept.block.size * tilesize)/2f //check X alignment + )) && (!accept.block.rotate || accept.front() == tile || !accept.block.outputFacing) //make sure it's facing this block ); } @@ -112,7 +112,7 @@ public class PayloadAcceptor extends Block{ payVector.clamp(-size * tilesize / 2f, -size * tilesize / 2f, size * tilesize / 2f, size * tilesize / 2f); Building front = front(); - if(front != null && front.block().outputsPayload){ + if(front != null && front.block.outputsPayload){ if(movePayload(payload)){ payload = null; } diff --git a/core/src/mindustry/world/blocks/production/Pump.java b/core/src/mindustry/world/blocks/production/Pump.java index ac138fc620..fa2f67999f 100644 --- a/core/src/mindustry/world/blocks/production/Pump.java +++ b/core/src/mindustry/world/blocks/production/Pump.java @@ -4,6 +4,7 @@ import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import mindustry.game.*; +import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; @@ -85,10 +86,7 @@ public class Pump extends LiquidBlock{ public void draw(){ Draw.rect(name, x, y); - Draw.color(liquids.current().color); - Draw.alpha(liquids.total() / liquidCapacity); - Draw.rect(liquidRegion, x, y); - Draw.color(); + Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); } @Override diff --git a/core/src/mindustry/world/blocks/production/Separator.java b/core/src/mindustry/world/blocks/production/Separator.java index 394e0bae5b..bcf66984e3 100644 --- a/core/src/mindustry/world/blocks/production/Separator.java +++ b/core/src/mindustry/world/blocks/production/Separator.java @@ -3,10 +3,10 @@ package mindustry.world.blocks.production; import arc.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.util.ArcAnnotate.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.consumers.*; @@ -17,7 +17,7 @@ import mindustry.world.meta.values.*; * Extracts a random list of items from an input item and an input liquid. */ public class Separator extends Block{ - public @NonNull ItemStack[] results; + public ItemStack[] results; public float craftTime; public @Load("@-liquid") TextureRegion liquidRegion; @@ -78,11 +78,8 @@ public class Separator extends Block{ public void draw(){ super.draw(); - Draw.color(liquids.current().color); - Draw.alpha(liquids.total() / liquidCapacity); - Draw.rect(liquidRegion, x, y); + Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); - Draw.reset(); if(Core.atlas.isFound(spinnerRegion)){ Draw.rect(spinnerRegion, x, y, totalProgress * spinnerSpeed); } @@ -108,7 +105,7 @@ public class Separator extends Block{ int count = 0; Item item = null; - //TODO guaranteed desync since items are random + //guaranteed desync since items are random - won't be fixed and probably isn't too important for(ItemStack stack : results){ if(i >= count && i < count + stack.amount){ item = stack.item; diff --git a/core/src/mindustry/world/blocks/production/SolidPump.java b/core/src/mindustry/world/blocks/production/SolidPump.java index ebd0f2d20e..3b29665fde 100644 --- a/core/src/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/mindustry/world/blocks/production/SolidPump.java @@ -3,7 +3,6 @@ package mindustry.world.blocks.production; import arc.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -87,10 +86,7 @@ public class SolidPump extends Pump{ @Override public void draw(){ Draw.rect(region, x, y); - Draw.color(liquids.current().color); - Draw.alpha(liquids.total() / liquidCapacity); - Draw.rect(liquidRegion, x, y); - Draw.color(); + Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); Draw.rect(rotatorRegion, x, y, pumpTime * rotateSpeed); Draw.rect(topRegion, x, y); } diff --git a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java index f2e57156f6..d3a89433aa 100644 --- a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java @@ -2,7 +2,6 @@ package mindustry.world.blocks.sandbox; import arc.graphics.g2d.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.entities.units.*; @@ -11,7 +10,7 @@ import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class LiquidSource extends Block{ diff --git a/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java b/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java index 0f49ffd3a7..3eeb628db8 100644 --- a/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java +++ b/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java @@ -21,7 +21,7 @@ public class LiquidVoid extends Block{ public class LiquidVoidBuild extends Building{ @Override - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ + public boolean acceptLiquid(Building source, Liquid liquid){ return enabled; } diff --git a/core/src/mindustry/world/blocks/sandbox/PowerVoid.java b/core/src/mindustry/world/blocks/sandbox/PowerVoid.java index 067f6335e5..c423ba6caf 100644 --- a/core/src/mindustry/world/blocks/sandbox/PowerVoid.java +++ b/core/src/mindustry/world/blocks/sandbox/PowerVoid.java @@ -1,7 +1,7 @@ package mindustry.world.blocks.sandbox; -import mindustry.world.blocks.power.PowerBlock; -import mindustry.world.meta.BlockStat; +import mindustry.world.blocks.power.*; +import mindustry.world.meta.*; public class PowerVoid extends PowerBlock{ diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index cea0f911e7..bdb16eb674 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -6,7 +6,6 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.core.*; @@ -15,6 +14,7 @@ import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.logic.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; @@ -51,6 +51,7 @@ public class CoreBlock extends StorageBlock{ unitCapModifier = 10; activeSound = Sounds.respawning; activeSoundVolume = 1f; + group = BlockGroup.none; } @Remote(called = Loc.server) @@ -76,6 +77,8 @@ public class CoreBlock extends StorageBlock{ public void setStats(){ super.setStats(); + stats.add(BlockStat.buildTime, 0, StatUnit.seconds); + bars.add("capacity", (CoreBuild e) -> new Bar( () -> Core.bundle.format("bar.capacity", UI.formatAmount(e.storageCapacity)), @@ -101,7 +104,7 @@ public class CoreBlock extends StorageBlock{ CoreBuild core = team.core(); //must have all requirements if(core == null || (!state.rules.infiniteResources && !core.items.has(requirements))) return false; - return canReplace(tile.block()); + return tile.block() instanceof CoreBlock && size > tile.block().size; } @Override @@ -154,7 +157,14 @@ public class CoreBlock extends StorageBlock{ public class CoreBuild extends Building implements ControlBlock{ public int storageCapacity; //note that this unit is never actually used for control; the possession handler makes the player respawn when this unit is controlled - public @NonNull BlockUnitc unit = Nulls.blockUnit; + public BlockUnitc unit = Nulls.blockUnit; + public boolean noEffect = false; + + @Override + public double sense(LAccess sensor){ + if(sensor == LAccess.itemCapacity) return storageCapacity; + return super.sense(sensor); + } @Override public void created(){ @@ -193,7 +203,7 @@ public class CoreBlock extends StorageBlock{ @Override public boolean acceptItem(Building source, Item item){ - return items.get(item) < getMaximumAccepted(item); + return items.get(item) < getMaximumAccepted(item) || incinerate(); } @Override @@ -210,7 +220,7 @@ public class CoreBlock extends StorageBlock{ } state.teams.registerCore(this); - storageCapacity = itemCapacity + proximity().sum(e -> isContainer(e) && owns(e) ? e.block().itemCapacity : 0); + storageCapacity = itemCapacity + proximity().sum(e -> isContainer(e) && owns(e) ? e.block.itemCapacity : 0); proximity.each(e -> isContainer(e) && owns(e), t -> { t.items = items; ((StorageBuild)t).linkedCore = this; @@ -218,7 +228,7 @@ public class CoreBlock extends StorageBlock{ for(Building other : state.teams.cores(team)){ if(other.tile() == tile) continue; - storageCapacity += other.block().itemCapacity + other.proximity().sum(e -> isContainer(e) && owns(other, e) ? e.block().itemCapacity : 0); + storageCapacity += other.block.itemCapacity + other.proximity().sum(e -> isContainer(e) && owns(other, e) ? e.block.itemCapacity : 0); } if(!world.isGenerating()){ @@ -238,7 +248,7 @@ public class CoreBlock extends StorageBlock{ Cons outline = t -> { for(int i = 0; i < 4; i++){ Point2 p = Geometry.d8edge[i]; - float offset = -Math.max(t.block().size - 1, 0) / 2f * tilesize; + float offset = -Math.max(t.block.size - 1, 0) / 2f * tilesize; Draw.rect("block-select", t.x + offset * p.x, t.y + offset * p.y, i * 90); } }; @@ -262,6 +272,10 @@ public class CoreBlock extends StorageBlock{ return tile instanceof StorageBuild && (((StorageBuild)tile).linkedCore == core || ((StorageBuild)tile).linkedCore == null); } + public boolean incinerate(){ + return state.isCampaign(); + } + @Override public float handleDamage(float amount){ if(player != null && team == player.team()){ @@ -296,16 +310,51 @@ public class CoreBlock extends StorageBlock{ } } + @Override + public void onDestroyed(){ + super.onDestroyed(); + + if(state.isCampaign() && team == state.rules.waveTeam){ + //do not recache + world.setGenerating(true); + tile.setOverlay(Blocks.spawn); + world.setGenerating(false); + + if(!spawner.getSpawns().contains(tile)){ + spawner.getSpawns().add(tile); + } + spawner.doShockwave(x, y); + } + } + @Override public void placed(){ super.placed(); state.teams.registerCore(this); } + @Override + public void itemTaken(Item item){ + if(state.isCampaign()){ + //update item taken amount + state.secinfo.handleCoreItem(item, -1); + } + } + @Override public void handleItem(Building source, Item item){ if(net.server() || !net.active()){ - super.handleItem(source, item); + + if(items.get(item) >= getMaximumAccepted(item)){ + //create item incineration effect at random intervals + if(!noEffect){ + incinerateEffect(this, source); + } + noEffect = false; + }else{ + super.handleItem(source, item); + } + if(state.rules.tutorial){ Events.fire(new CoreItemDeliverEvent()); } diff --git a/core/src/mindustry/world/blocks/storage/StorageBlock.java b/core/src/mindustry/world/blocks/storage/StorageBlock.java index 0aca99a0b6..50eb65a270 100644 --- a/core/src/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/mindustry/world/blocks/storage/StorageBlock.java @@ -1,18 +1,23 @@ package mindustry.world.blocks.storage; -import arc.util.ArcAnnotate.*; +import arc.math.*; +import arc.struct.*; +import arc.util.*; +import mindustry.content.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; +import mindustry.world.blocks.storage.CoreBlock.*; +import mindustry.world.meta.*; -public abstract class StorageBlock extends Block{ - +public class StorageBlock extends Block{ public StorageBlock(String name){ super(name); hasItems = true; solid = true; update = false; destructible = true; + group = BlockGroup.storage; } @Override @@ -20,6 +25,16 @@ public abstract class StorageBlock extends Block{ return false; } + public static void incinerateEffect(Building self, Building source){ + if(Mathf.chance(0.1)){ + Tile edge = Edges.getFacingEdge(source, self); + Tile edge2 = Edges.getFacingEdge(self, source); + if(edge != null && edge2 != null){ + Fx.fuelburn.at((edge.worldx() + edge2.worldx())/2f, (edge.worldy() + edge2.worldy())/2f); + } + } + } + public class StorageBuild extends Building{ protected @Nullable Building linkedCore; @@ -28,6 +43,17 @@ public abstract class StorageBlock extends Block{ return linkedCore != null ? linkedCore.acceptItem(source, item) : items.get(item) < getMaximumAccepted(item); } + @Override + public void handleItem(Building source, Item item){ + if(linkedCore != null){ + incinerateEffect(this, source); + ((CoreBuild)linkedCore).noEffect = true; + linkedCore.handleItem(source, item); + }else{ + super.handleItem(source, item); + } + } + @Override public int getMaximumAccepted(Item item){ return itemCapacity; @@ -40,6 +66,18 @@ public abstract class StorageBlock extends Block{ } } + @Override + public void overwrote(Seq previous){ + for(Building other : previous){ + if(other.items != null){ + items.addAll(other.items); + } + } + + //ensure item counts are not too high + items.each((i, a) -> items.set(i, Math.min(a, itemCapacity))); + } + @Override public boolean canPickup(){ return linkedCore == null; diff --git a/core/src/mindustry/world/blocks/storage/Unloader.java b/core/src/mindustry/world/blocks/storage/Unloader.java index 1ca83e08d4..524d6eb939 100644 --- a/core/src/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/mindustry/world/blocks/storage/Unloader.java @@ -51,7 +51,7 @@ public class Unloader extends Block{ public void updateTile(){ if(timer(timerUnload, speed / timeScale())){ for(Building other : proximity){ - if(other.interactable(team) && other.block().unloadable && other.block().hasItems + if(other.interactable(team) && other.block.unloadable && other.block.hasItems && ((sortItem == null && other.items.total() > 0) || (sortItem != null && other.items.has(sortItem)))){ //make sure the item can't be dumped back into this block dumpingTo = other; @@ -66,6 +66,7 @@ public class Unloader extends Block{ }else{ other.items.remove(item, 1); } + other.itemTaken(item); } } } @@ -99,7 +100,7 @@ public class Unloader extends Block{ @Override public boolean canDump(Building to, Item item){ - return !(to.block() instanceof StorageBlock) && to != dumpingTo; + return !(to.block instanceof StorageBlock) && to != dumpingTo; } @Override diff --git a/core/src/mindustry/world/blocks/units/CommandCenter.java b/core/src/mindustry/world/blocks/units/CommandCenter.java index 071bcaf273..a8ffa3c3e9 100644 --- a/core/src/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/mindustry/world/blocks/units/CommandCenter.java @@ -13,14 +13,13 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.gen.*; -import mindustry.graphics.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.meta.*; public class CommandCenter extends Block{ public TextureRegionDrawable[] commandRegions = new TextureRegionDrawable[UnitCommand.all.length]; - public Color topColor = Pal.command, bottomColor = Color.valueOf("5e5e5e"); + public Color topColor = null, bottomColor = Color.valueOf("5e5e5e"); public Effect effect = Fx.commandSend; public CommandCenter(String name){ @@ -63,7 +62,7 @@ public class CommandCenter extends Block{ Draw.color(bottomColor); Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy() - 1, size, size); - Draw.color(topColor); + Draw.color(topColor == null ? team.color : topColor); Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy(), size, size); Draw.color(); } diff --git a/core/src/mindustry/world/blocks/units/Reconstructor.java b/core/src/mindustry/world/blocks/units/Reconstructor.java index f297ccad57..5b5696bf4c 100644 --- a/core/src/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/mindustry/world/blocks/units/Reconstructor.java @@ -3,6 +3,7 @@ package mindustry.world.blocks.units; import arc.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.*; @@ -21,7 +22,7 @@ import static mindustry.Vars.*; public class Reconstructor extends UnitBlock{ public float constructTime = 60 * 2; - public UnitType[][] upgrades = {}; + public Seq upgrades = new Seq<>(); public int[] capacities; public Reconstructor(String name){ @@ -50,11 +51,11 @@ public class Reconstructor extends UnitBlock{ () -> e.unit() == null ? "[lightgray]" + Iconc.cancel : Core.bundle.format("bar.unitcap", Fonts.getUnicodeStr(e.unit().name), - teamIndex.countType(e.team, e.unit()), + e.team.data().countType(e.unit()), Units.getCap(e.team) ), () -> Pal.power, - () -> e.unit() == null ? 0f : (float)teamIndex.countType(e.team, e.unit()) / Units.getCap(e.team) + () -> e.unit() == null ? 0f : (float)e.team.data().countType(e.unit()) / Units.getCap(e.team) )); } @@ -140,7 +141,7 @@ public class Reconstructor extends UnitBlock{ if(moveInPayload()){ if(consValid()){ valid = true; - progress += edelta(); + progress += edelta() * state.rules.unitBuildSpeedMultiplier; } //upgrade the unit @@ -161,11 +162,7 @@ public class Reconstructor extends UnitBlock{ @Override public boolean shouldConsume(){ - //do not consume when cap reached - if(constructing()){ - return Units.canCreate(team, upgrade(payload.unit.type())); - } - return false; + return constructing(); } public UnitType unit(){ @@ -185,7 +182,7 @@ public class Reconstructor extends UnitBlock{ } public UnitType upgrade(UnitType type){ - UnitType[] r = Structs.find(upgrades, arr -> arr[0] == type); + UnitType[] r = upgrades.find(u -> u[0] == type); return r == null ? null : r[1]; } diff --git a/core/src/mindustry/world/blocks/units/RepairPoint.java b/core/src/mindustry/world/blocks/units/RepairPoint.java index d0670783c8..abcc4bf738 100644 --- a/core/src/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/mindustry/world/blocks/units/RepairPoint.java @@ -70,10 +70,11 @@ public class RepairPoint extends Block{ Draw.rect(baseRegion, x, y); Draw.z(Layer.turret); + Drawf.shadow(region, x - (size / 2f), y - (size / 2f), rotation - 90); Draw.rect(region, x, y, rotation - 90); if(target != null && Angles.angleDist(angleTo(target), rotation) < 30f){ - Draw.z(Layer.power); + Draw.z(Layer.flyingUnit + 1); //above all units float ang = angleTo(target); float len = 5f; diff --git a/core/src/mindustry/world/blocks/units/ResupplyPoint.java b/core/src/mindustry/world/blocks/units/ResupplyPoint.java index 5967fdd035..2714be2358 100644 --- a/core/src/mindustry/world/blocks/units/ResupplyPoint.java +++ b/core/src/mindustry/world/blocks/units/ResupplyPoint.java @@ -1,11 +1,16 @@ package mindustry.world.blocks.units; +import arc.func.*; import arc.graphics.*; +import arc.struct.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.type.AmmoTypes.*; import mindustry.world.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -21,6 +26,7 @@ public class ResupplyPoint extends Block{ super(name); solid = update = true; hasItems = true; + flags = EnumSet.of(BlockFlag.resupply); } @Override @@ -50,13 +56,19 @@ public class ResupplyPoint extends Block{ /** Tries to resupply nearby units. * @return whether resupplying was successful. If unit ammo is disabled, always returns false. */ - public static boolean resupply(Building tile, float range, int ammoAmount, Color ammoColor){ + public static boolean resupply(Building tile, float range, float ammoAmount, Color ammoColor){ + return resupply(tile.team, tile.x, tile.y, range, ammoAmount, ammoColor, u -> true); + } + + /** Tries to resupply nearby units. + * @return whether resupplying was successful. If unit ammo is disabled, always returns false. */ + public static boolean resupply(Team team, float x, float y, float range, float ammoAmount, Color ammoColor, Boolf valid){ if(!state.rules.unitAmmo) return false; - Unit unit = Units.closest(tile.team, tile.x, tile.y, range, u -> u.ammo() <= u.type().ammoCapacity - ammoAmount); + Unit unit = Units.closest(team, x, y, range, u -> u.type().ammoType instanceof ItemAmmoType && u.ammo <= u.type().ammoCapacity - ammoAmount && valid.get(u)); if(unit != null){ - Fx.itemTransfer.at(tile.x, tile.y, ammoAmount / 2f, ammoColor, unit); - unit.ammo(Math.min(unit.ammo() + ammoAmount, unit.type().ammoCapacity)); + Fx.itemTransfer.at(x, y, ammoAmount / 2f, ammoColor, unit); + unit.ammo = Math.min(unit.ammo + ammoAmount, unit.type().ammoCapacity); return true; } diff --git a/core/src/mindustry/world/blocks/units/UnitBlock.java b/core/src/mindustry/world/blocks/units/UnitBlock.java index 2409a9fde5..d1bce06795 100644 --- a/core/src/mindustry/world/blocks/units/UnitBlock.java +++ b/core/src/mindustry/world/blocks/units/UnitBlock.java @@ -55,7 +55,9 @@ public class UnitBlock extends PayloadAcceptor{ @Override public void dumpPayload(){ - Call.unitBlockSpawn(tile); + if(payload.dump()){ + Call.unitBlockSpawn(tile); + } } } } diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 67f7b50a88..74248f9932 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -8,7 +8,6 @@ import arc.scene.style.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.io.*; import mindustry.*; import mindustry.entities.*; @@ -22,12 +21,10 @@ import mindustry.world.blocks.payloads.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; -import static mindustry.Vars.*; - public class UnitFactory extends UnitBlock{ public int[] capacities; - public UnitPlan[] plans = new UnitPlan[0]; + public Seq plans = new Seq<>(4); public UnitFactory(String name){ super(name); @@ -42,11 +39,11 @@ public class UnitFactory extends UnitBlock{ rotate = true; config(Integer.class, (UnitFactoryBuild tile, Integer i) -> { - tile.currentPlan = i < 0 || i >= plans.length ? -1 : i; + tile.currentPlan = i < 0 || i >= plans.size ? -1 : i; tile.progress = 0; }); - consumes.add(new ConsumeItemDynamic((UnitFactoryBuild e) -> e.currentPlan != -1 ? plans[e.currentPlan].requirements : ItemStack.empty)); + consumes.add(new ConsumeItemDynamic((UnitFactoryBuild e) -> e.currentPlan != -1 ? plans.get(e.currentPlan).requirements : ItemStack.empty)); } @Override @@ -72,11 +69,11 @@ public class UnitFactory extends UnitBlock{ () -> e.unit() == null ? "[lightgray]" + Iconc.cancel : Core.bundle.format("bar.unitcap", Fonts.getUnicodeStr(e.unit().name), - teamIndex.countType(e.team, e.unit()), + e.team.data().countType(e.unit()), Units.getCap(e.team) ), () -> Pal.power, - () -> e.unit() == null ? 0f : (float)teamIndex.countType(e.team, e.unit()) / Units.getCap(e.team) + () -> e.unit() == null ? 0f : (float)e.team.data().countType(e.unit()) / Units.getCap(e.team) )); } @@ -122,7 +119,7 @@ public class UnitFactory extends UnitBlock{ public int currentPlan = -1; public float fraction(){ - return currentPlan == -1 ? 0 : progress / plans[currentPlan].time; + return currentPlan == -1 ? 0 : progress / plans.get(currentPlan).time; } @Override @@ -130,7 +127,7 @@ public class UnitFactory extends UnitBlock{ Seq units = Seq.with(plans).map(u -> u.unit).filter(u -> u.unlockedNow()); if(units.any()){ - ItemSelection.buildTable(table, units, () -> currentPlan == -1 ? null : plans[currentPlan].unit, unit -> configure(units.indexOf(unit))); + ItemSelection.buildTable(table, units, () -> currentPlan == -1 ? null : plans.get(currentPlan).unit, unit -> configure(plans.indexOf(u -> u.unit == unit))); }else{ table.table(Styles.black3, t -> t.add("@none").color(Color.lightGray)); } @@ -151,11 +148,11 @@ public class UnitFactory extends UnitBlock{ table.table(t -> { t.left(); t.image().update(i -> { - i.setDrawable(currentPlan == -1 ? Icon.cancel : reg.set(plans[currentPlan].unit.icon(Cicon.medium))); + i.setDrawable(currentPlan == -1 ? Icon.cancel : reg.set(plans.get(currentPlan).unit.icon(Cicon.medium))); i.setScaling(Scaling.fit); i.setColor(currentPlan == -1 ? Color.lightGray : Color.white); }).size(32).padBottom(-4).padRight(2); - t.label(() -> currentPlan == -1 ? "@none" : plans[currentPlan].unit.localizedName).color(Color.lightGray); + t.label(() -> currentPlan == -1 ? "@none" : plans.get(currentPlan).unit.localizedName).color(Color.lightGray); }).left(); } @@ -170,7 +167,7 @@ public class UnitFactory extends UnitBlock{ Draw.rect(outRegion, x, y, rotdeg()); if(currentPlan != -1){ - UnitPlan plan = plans[currentPlan]; + UnitPlan plan = plans.get(currentPlan); Draw.draw(Layer.blockOver, () -> Drawf.construct(this, plan.unit, rotdeg() - 90f, progress / plan.time, speedScl, time)); } @@ -186,7 +183,7 @@ public class UnitFactory extends UnitBlock{ @Override public void updateTile(){ - if(currentPlan < 0 || currentPlan >= plans.length){ + if(currentPlan < 0 || currentPlan >= plans.size){ currentPlan = -1; } @@ -201,7 +198,7 @@ public class UnitFactory extends UnitBlock{ moveOutPayload(); if(currentPlan != -1 && payload == null){ - UnitPlan plan = plans[currentPlan]; + UnitPlan plan = plans.get(currentPlan); if(progress >= plan.time && consValid()){ progress = 0f; @@ -219,10 +216,7 @@ public class UnitFactory extends UnitBlock{ @Override public boolean shouldConsume(){ - //do not consume when cap reached - if(currentPlan != -1 && !Units.canCreate(team, plans[currentPlan].unit)){ - return false; - } + if(currentPlan == -1) return false; return enabled && payload == null; } @@ -234,11 +228,11 @@ public class UnitFactory extends UnitBlock{ @Override public boolean acceptItem(Building source, Item item){ return currentPlan != -1 && items.get(item) < getMaximumAccepted(item) && - Structs.contains(plans[currentPlan].requirements, stack -> stack.item == item); + Structs.contains(plans.get(currentPlan).requirements, stack -> stack.item == item); } public @Nullable UnitType unit(){ - return currentPlan == - 1 ? null : plans[currentPlan].unit; + return currentPlan == - 1 ? null : plans.get(currentPlan).unit; } @Override diff --git a/core/src/mindustry/world/consumers/Consume.java b/core/src/mindustry/world/consumers/Consume.java index 7e0f686018..410d041a03 100644 --- a/core/src/mindustry/world/consumers/Consume.java +++ b/core/src/mindustry/world/consumers/Consume.java @@ -1,9 +1,9 @@ package mindustry.world.consumers; +import arc.scene.ui.layout.*; import arc.struct.*; -import arc.scene.ui.layout.Table; import mindustry.gen.*; -import mindustry.world.meta.BlockStats; +import mindustry.world.meta.*; /** An abstract class that defines a type of resource that a block can consume. */ public abstract class Consume{ diff --git a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java index 277146f156..a2dd079c20 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java +++ b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java @@ -1,17 +1,15 @@ package mindustry.world.consumers; import arc.func.*; -import arc.math.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.meta.*; public class ConsumeItemDynamic extends Consume{ - public final @NonNull Func items; + public final Func items; public ConsumeItemDynamic(Func items){ this.items = (Func)items; @@ -48,7 +46,7 @@ public class ConsumeItemDynamic extends Consume{ for(ItemStack stack : items.get(tile)){ table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount), - () -> tile.items != null && tile.items.has(stack.item, stack.amount))).size(8 * 4).padRight(6 * Mathf.digits(stack.amount)); + () -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8); } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java index a8b3cf1292..e9e98041c4 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -1,9 +1,8 @@ package mindustry.world.consumers; -import arc.struct.*; import arc.func.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.struct.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.ui.*; @@ -13,8 +12,7 @@ import mindustry.world.meta.values.*; import static mindustry.Vars.*; public class ConsumeItemFilter extends Consume{ - public final @NonNull - Boolf filter; + public final Boolf filter; public ConsumeItemFilter(Boolf item){ this.filter = item; diff --git a/core/src/mindustry/world/consumers/ConsumeItems.java b/core/src/mindustry/world/consumers/ConsumeItems.java index 53eb92ebae..01909e2a14 100644 --- a/core/src/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/mindustry/world/consumers/ConsumeItems.java @@ -1,9 +1,7 @@ package mindustry.world.consumers; -import arc.math.*; -import arc.struct.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.struct.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.ui.*; @@ -11,7 +9,7 @@ import mindustry.world.meta.*; import mindustry.world.meta.values.*; public class ConsumeItems extends Consume{ - public final @NonNull ItemStack[] items; + public final ItemStack[] items; public ConsumeItems(ItemStack[] items){ this.items = items; @@ -38,7 +36,7 @@ public class ConsumeItems extends Consume{ public void build(Building tile, Table table){ for(ItemStack stack : items){ table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount), - () -> tile.items != null && tile.items.has(stack.item, stack.amount))).size(8 * 4).padRight(Mathf.digits(stack.amount) * 6); + () -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8); } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquid.java b/core/src/mindustry/world/consumers/ConsumeLiquid.java index ae9998db12..90f3bf0687 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquid.java @@ -1,15 +1,14 @@ package mindustry.world.consumers; -import arc.struct.*; import arc.scene.ui.layout.*; -import arc.util.ArcAnnotate.*; +import arc.struct.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.meta.*; public class ConsumeLiquid extends ConsumeLiquidBase{ - public final @NonNull Liquid liquid; + public final Liquid liquid; public ConsumeLiquid(Liquid liquid, float amount){ super(amount); diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidBase.java b/core/src/mindustry/world/consumers/ConsumeLiquidBase.java index 323a2897ac..47b1eb8834 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidBase.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidBase.java @@ -23,6 +23,6 @@ public abstract class ConsumeLiquidBase extends Consume{ } protected float use(Building entity){ - return Math.min(amount * entity.delta(), entity.block().liquidCapacity); + return Math.min(amount * entity.edelta(), entity.block.liquidCapacity); } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java index ca57bfa816..962023488b 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -1,18 +1,15 @@ package mindustry.world.consumers; +import arc.func.*; +import arc.scene.ui.layout.*; import arc.struct.*; -import arc.func.Boolf; -import arc.scene.ui.layout.Table; import mindustry.gen.*; -import mindustry.type.Liquid; -import mindustry.ui.Cicon; -import mindustry.ui.MultiReqImage; -import mindustry.ui.ReqImage; -import mindustry.world.meta.BlockStat; -import mindustry.world.meta.BlockStats; -import mindustry.world.meta.values.LiquidFilterValue; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.meta.*; +import mindustry.world.meta.values.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class ConsumeLiquidFilter extends ConsumeLiquidBase{ public final Boolf filter; diff --git a/core/src/mindustry/world/consumers/ConsumePower.java b/core/src/mindustry/world/consumers/ConsumePower.java index 557c88469c..2dc55dbb11 100644 --- a/core/src/mindustry/world/consumers/ConsumePower.java +++ b/core/src/mindustry/world/consumers/ConsumePower.java @@ -1,7 +1,7 @@ package mindustry.world.consumers; -import arc.math.Mathf; -import arc.scene.ui.layout.Table; +import arc.math.*; +import arc.scene.ui.layout.*; import mindustry.gen.*; import mindustry.world.meta.*; diff --git a/core/src/mindustry/world/consumers/Consumers.java b/core/src/mindustry/world/consumers/Consumers.java index 8683c6d158..4ce410aa04 100644 --- a/core/src/mindustry/world/consumers/Consumers.java +++ b/core/src/mindustry/world/consumers/Consumers.java @@ -1,13 +1,13 @@ package mindustry.world.consumers; +import arc.func.*; import arc.struct.*; -import arc.func.Boolf; -import arc.util.Structs; -import mindustry.Vars; +import arc.util.*; +import mindustry.*; import mindustry.gen.*; import mindustry.type.*; -import mindustry.world.blocks.power.ConditionalConsumePower; -import mindustry.world.meta.BlockStats; +import mindustry.world.blocks.power.*; +import mindustry.world.meta.*; public class Consumers{ private Consume[] map = new Consume[ConsumeType.values().length]; diff --git a/core/src/mindustry/world/meta/BlockBars.java b/core/src/mindustry/world/meta/BlockBars.java index d96202ad1d..acc6cbd100 100644 --- a/core/src/mindustry/world/meta/BlockBars.java +++ b/core/src/mindustry/world/meta/BlockBars.java @@ -1,9 +1,9 @@ package mindustry.world.meta; -import arc.struct.OrderedMap; -import arc.func.Func; +import arc.func.*; +import arc.struct.*; import mindustry.gen.*; -import mindustry.ui.Bar; +import mindustry.ui.*; public class BlockBars{ private OrderedMap> bars = new OrderedMap<>(); diff --git a/core/src/mindustry/world/meta/BlockFlag.java b/core/src/mindustry/world/meta/BlockFlag.java index ddf9fa9ba7..5c9bf2e920 100644 --- a/core/src/mindustry/world/meta/BlockFlag.java +++ b/core/src/mindustry/world/meta/BlockFlag.java @@ -12,6 +12,10 @@ public enum BlockFlag{ repair, /** Rally point. */ rally, + /** Block that stored power for resupply. */ + powerRes, + /** Block used for resupply. */ + resupply, /** Any block that boosts unit capacity. */ unitModifier; diff --git a/core/src/mindustry/world/meta/BlockGroup.java b/core/src/mindustry/world/meta/BlockGroup.java index 24e8166990..2b3434ccfb 100644 --- a/core/src/mindustry/world/meta/BlockGroup.java +++ b/core/src/mindustry/world/meta/BlockGroup.java @@ -1,5 +1,5 @@ package mindustry.world.meta; public enum BlockGroup{ - none, walls, turrets, transportation, power, liquids, drills + none, walls, turrets, transportation, power, liquids, drills, storage } diff --git a/core/src/mindustry/world/meta/BlockStat.java b/core/src/mindustry/world/meta/BlockStat.java index 11add35e97..05e45acbfe 100644 --- a/core/src/mindustry/world/meta/BlockStat.java +++ b/core/src/mindustry/world/meta/BlockStat.java @@ -1,15 +1,17 @@ package mindustry.world.meta; -import arc.Core; +import arc.*; -import java.util.Locale; +import java.util.*; /** Describes one type of stat for a block. */ public enum BlockStat{ health(StatCategory.general), size(StatCategory.general), + displaySize(StatCategory.general), buildTime(StatCategory.general), buildCost(StatCategory.general), + memoryCapacity(StatCategory.general), itemCapacity(StatCategory.items), itemsMoved(StatCategory.items), @@ -47,6 +49,8 @@ public enum BlockStat{ targetsGround(StatCategory.shooting), damage(StatCategory.shooting), ammo(StatCategory.shooting), + shieldHealth(StatCategory.shooting), + cooldownTime(StatCategory.shooting), booster(StatCategory.optional), boostEffect(StatCategory.optional), diff --git a/core/src/mindustry/world/meta/BlockStats.java b/core/src/mindustry/world/meta/BlockStats.java index 2917a92aa3..ff93a217a9 100644 --- a/core/src/mindustry/world/meta/BlockStats.java +++ b/core/src/mindustry/world/meta/BlockStats.java @@ -1,7 +1,7 @@ package mindustry.world.meta; -import arc.struct.*; import arc.struct.ObjectMap.*; +import arc.struct.*; import mindustry.*; import mindustry.type.*; import mindustry.world.*; @@ -38,12 +38,20 @@ public class BlockStats{ } public void add(BlockStat stat, Attribute attr){ - add(stat, attr, 1f); + add(stat, attr, false, 1f); } public void add(BlockStat stat, Attribute attr, float scale){ + add(stat, attr, false, scale); + } + + public void add(BlockStat stat, Attribute attr, boolean floating){ + add(stat, attr, floating, 1f); + } + + public void add(BlockStat stat, Attribute attr, boolean floating, float scale){ for(Block block : Vars.content.blocks()){ - if(!block.isFloor() || block.asFloor().attributes.get(attr) == 0) continue; + if(!block.isFloor() || block.asFloor().attributes.get(attr) == 0 || (block.asFloor().isLiquid && !floating)) continue; add(stat, new FloorEfficiencyValue(block.asFloor(), block.asFloor().attributes.get(attr) * scale)); } } diff --git a/core/src/mindustry/world/meta/StatCategory.java b/core/src/mindustry/world/meta/StatCategory.java index 5f244674a4..e6c91b04bb 100644 --- a/core/src/mindustry/world/meta/StatCategory.java +++ b/core/src/mindustry/world/meta/StatCategory.java @@ -1,6 +1,6 @@ package mindustry.world.meta; -import arc.Core; +import arc.*; /** A specific category for a stat. */ public enum StatCategory{ diff --git a/core/src/mindustry/world/meta/StatUnit.java b/core/src/mindustry/world/meta/StatUnit.java index 4cdc6a6182..42825f0379 100644 --- a/core/src/mindustry/world/meta/StatUnit.java +++ b/core/src/mindustry/world/meta/StatUnit.java @@ -1,8 +1,8 @@ package mindustry.world.meta; -import arc.Core; +import arc.*; -import java.util.Locale; +import java.util.*; /** * Defines a unit of measurement for block stats. @@ -16,10 +16,12 @@ public enum StatUnit{ powerUnits, degrees, seconds, + minutes, perSecond, perMinute, timesSpeed(false), percent(false), + shieldHealth, none, items; diff --git a/core/src/mindustry/world/meta/StatValue.java b/core/src/mindustry/world/meta/StatValue.java index 1a978b71e9..db8efaacb6 100644 --- a/core/src/mindustry/world/meta/StatValue.java +++ b/core/src/mindustry/world/meta/StatValue.java @@ -1,6 +1,6 @@ package mindustry.world.meta; -import arc.scene.ui.layout.Table; +import arc.scene.ui.layout.*; /** * A base interface for a value of a stat that is displayed. diff --git a/core/src/mindustry/world/meta/values/AmmoListValue.java b/core/src/mindustry/world/meta/values/AmmoListValue.java index 6b02493348..d0d8624ea9 100644 --- a/core/src/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/mindustry/world/meta/values/AmmoListValue.java @@ -1,19 +1,19 @@ package mindustry.world.meta.values; import arc.*; -import arc.struct.*; import arc.graphics.g2d.*; import arc.math.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.content.*; -import mindustry.ctype.UnlockableContent; +import mindustry.ctype.*; import mindustry.entities.bullet.*; import mindustry.gen.*; -import mindustry.ui.Cicon; +import mindustry.ui.*; import mindustry.world.meta.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class AmmoListValue implements StatValue{ private final ObjectMap map; @@ -33,7 +33,7 @@ public class AmmoListValue implements StatValue{ table.table(Tex.underline, bt -> { bt.left().defaults().padRight(3).left(); - if(type.damage > 0 && type.collides){ + if(type.damage > 0 && (type.collides || type.splashDamage <= 0)){ bt.add(Core.bundle.format("bullet.damage", type.damage)); } diff --git a/core/src/mindustry/world/meta/values/BooleanValue.java b/core/src/mindustry/world/meta/values/BooleanValue.java index d0fe3518ce..c1da598008 100644 --- a/core/src/mindustry/world/meta/values/BooleanValue.java +++ b/core/src/mindustry/world/meta/values/BooleanValue.java @@ -1,7 +1,7 @@ package mindustry.world.meta.values; -import arc.scene.ui.layout.Table; -import mindustry.world.meta.StatValue; +import arc.scene.ui.layout.*; +import mindustry.world.meta.*; public class BooleanValue implements StatValue{ private final boolean value; diff --git a/core/src/mindustry/world/meta/values/BoosterListValue.java b/core/src/mindustry/world/meta/values/BoosterListValue.java index 54fac60f03..8d3315adaa 100644 --- a/core/src/mindustry/world/meta/values/BoosterListValue.java +++ b/core/src/mindustry/world/meta/values/BoosterListValue.java @@ -6,10 +6,10 @@ import arc.scene.ui.layout.*; import arc.util.*; import mindustry.gen.*; import mindustry.type.*; -import mindustry.ui.Cicon; +import mindustry.ui.*; import mindustry.world.meta.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class BoosterListValue implements StatValue{ protected float reload, maxUsed, multiplier; diff --git a/core/src/mindustry/world/meta/values/ItemFilterValue.java b/core/src/mindustry/world/meta/values/ItemFilterValue.java index 8f9420ff95..78db854658 100644 --- a/core/src/mindustry/world/meta/values/ItemFilterValue.java +++ b/core/src/mindustry/world/meta/values/ItemFilterValue.java @@ -1,13 +1,13 @@ package mindustry.world.meta.values; -import arc.struct.Seq; -import arc.func.Boolf; -import arc.scene.ui.layout.Table; -import mindustry.type.Item; -import mindustry.ui.ItemDisplay; -import mindustry.world.meta.StatValue; +import arc.func.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.meta.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class ItemFilterValue implements StatValue{ private final Boolf filter; diff --git a/core/src/mindustry/world/meta/values/ItemListValue.java b/core/src/mindustry/world/meta/values/ItemListValue.java index f6e1acc654..164b6a2a3c 100644 --- a/core/src/mindustry/world/meta/values/ItemListValue.java +++ b/core/src/mindustry/world/meta/values/ItemListValue.java @@ -1,9 +1,9 @@ package mindustry.world.meta.values; -import arc.scene.ui.layout.Table; -import mindustry.type.ItemStack; -import mindustry.ui.ItemDisplay; -import mindustry.world.meta.StatValue; +import arc.scene.ui.layout.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.meta.*; public class ItemListValue implements StatValue{ private final ItemStack[] stacks; diff --git a/core/src/mindustry/world/meta/values/LiquidFilterValue.java b/core/src/mindustry/world/meta/values/LiquidFilterValue.java index a88a912981..d5aef23376 100644 --- a/core/src/mindustry/world/meta/values/LiquidFilterValue.java +++ b/core/src/mindustry/world/meta/values/LiquidFilterValue.java @@ -1,13 +1,13 @@ package mindustry.world.meta.values; -import arc.struct.Seq; -import arc.func.Boolf; -import arc.scene.ui.layout.Table; -import mindustry.type.Liquid; -import mindustry.ui.LiquidDisplay; -import mindustry.world.meta.StatValue; +import arc.func.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.meta.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class LiquidFilterValue implements StatValue{ private final Boolf filter; diff --git a/core/src/mindustry/world/meta/values/LiquidValue.java b/core/src/mindustry/world/meta/values/LiquidValue.java index f6782da6ae..6139aed5ce 100644 --- a/core/src/mindustry/world/meta/values/LiquidValue.java +++ b/core/src/mindustry/world/meta/values/LiquidValue.java @@ -1,9 +1,9 @@ package mindustry.world.meta.values; -import arc.scene.ui.layout.Table; -import mindustry.type.Liquid; -import mindustry.ui.LiquidDisplay; -import mindustry.world.meta.StatValue; +import arc.scene.ui.layout.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.meta.*; public class LiquidValue implements StatValue{ private final Liquid liquid; diff --git a/core/src/mindustry/world/meta/values/NumberValue.java b/core/src/mindustry/world/meta/values/NumberValue.java index fd10d28f1d..fa815f4d49 100644 --- a/core/src/mindustry/world/meta/values/NumberValue.java +++ b/core/src/mindustry/world/meta/values/NumberValue.java @@ -1,9 +1,8 @@ package mindustry.world.meta.values; -import arc.scene.ui.layout.Table; -import arc.util.Strings; -import mindustry.world.meta.StatUnit; -import mindustry.world.meta.StatValue; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.world.meta.*; /** * A stat that is a number with a unit attacked. diff --git a/core/src/mindustry/world/meta/values/StringValue.java b/core/src/mindustry/world/meta/values/StringValue.java index 4bc102a8d4..b36a9d47e4 100644 --- a/core/src/mindustry/world/meta/values/StringValue.java +++ b/core/src/mindustry/world/meta/values/StringValue.java @@ -1,8 +1,8 @@ package mindustry.world.meta.values; -import arc.scene.ui.layout.Table; -import arc.util.Strings; -import mindustry.world.meta.StatValue; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.world.meta.*; public class StringValue implements StatValue{ private final String value; diff --git a/core/src/mindustry/world/modules/ConsumeModule.java b/core/src/mindustry/world/modules/ConsumeModule.java index 027e5595a9..431fa3fd1f 100644 --- a/core/src/mindustry/world/modules/ConsumeModule.java +++ b/core/src/mindustry/world/modules/ConsumeModule.java @@ -37,7 +37,7 @@ public class ConsumeModule extends BlockModule{ optionalValid = true; boolean docons = entity.shouldConsume() && entity.productionValid(); - for(Consume cons : entity.block().consumes.all()){ + for(Consume cons : entity.block.consumes.all()){ if(cons.isOptional()) continue; if(docons && cons.isUpdate() && prevValid && cons.valid(entity)){ @@ -47,7 +47,7 @@ public class ConsumeModule extends BlockModule{ valid &= cons.valid(entity); } - for(Consume cons : entity.block().consumes.optionals()){ + for(Consume cons : entity.block.consumes.optionals()){ if(docons && cons.isUpdate() && prevValid && cons.valid(entity)){ cons.update(entity); } @@ -57,7 +57,7 @@ public class ConsumeModule extends BlockModule{ } public void trigger(){ - for(Consume cons : entity.block().consumes.all()){ + for(Consume cons : entity.block.consumes.all()){ cons.trigger(entity); } } diff --git a/core/src/mindustry/world/modules/ItemModule.java b/core/src/mindustry/world/modules/ItemModule.java index 52fdd63dfd..16d49484f0 100644 --- a/core/src/mindustry/world/modules/ItemModule.java +++ b/core/src/mindustry/world/modules/ItemModule.java @@ -2,14 +2,13 @@ package mindustry.world.modules; import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.type.*; import java.util.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class ItemModule extends BlockModule{ public static final ItemModule empty = new ItemModule(); @@ -135,6 +134,15 @@ public class ItemModule extends BlockModule{ return true; } + public boolean has(ItemSeq items){ + for(Item item : content.items()){ + if(!has(item, items.get(item))){ + return false; + } + } + return true; + } + public boolean has(Iterable stacks){ for(ItemStack stack : stacks){ if(!has(stack.item, stack.amount)) return false; @@ -171,6 +179,7 @@ public class ItemModule extends BlockModule{ return total > 0; } + @Nullable public Item first(){ for(int i = 0; i < items.length; i++){ if(items[i] > 0){ @@ -180,6 +189,7 @@ public class ItemModule extends BlockModule{ return null; } + @Nullable public Item take(){ for(int i = 0; i < items.length; i++){ int index = (i + takeRotation); @@ -195,6 +205,7 @@ public class ItemModule extends BlockModule{ } /** Begins a speculative take operation. This returns the item that would be returned by #take(), but does not change state. */ + @Nullable public Item beginTake(){ for(int i = 0; i < items.length; i++){ int index = (i + takeRotation); @@ -244,6 +255,12 @@ public class ItemModule extends BlockModule{ } } + public void undoFlow(Item item){ + if(flow != null){ + cacheSums[item.id] -= 1; + } + } + public void addAll(ItemModule items){ for(int i = 0; i < items.items.length; i++){ add(i, items.items[i]); @@ -261,6 +278,10 @@ public class ItemModule extends BlockModule{ for(ItemStack stack : stacks) remove(stack.item, stack.amount); } + public void remove(ItemSeq stacks){ + stacks.each(this::remove); + } + public void remove(Iterable stacks){ for(ItemStack stack : stacks) remove(stack.item, stack.amount); } diff --git a/core/src/mindustry/world/modules/LiquidModule.java b/core/src/mindustry/world/modules/LiquidModule.java index 95dfc2f621..5713129506 100644 --- a/core/src/mindustry/world/modules/LiquidModule.java +++ b/core/src/mindustry/world/modules/LiquidModule.java @@ -2,13 +2,12 @@ package mindustry.world.modules; import arc.math.*; import arc.util.*; -import arc.util.ArcAnnotate.*; import arc.util.io.*; import mindustry.type.*; import java.util.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public class LiquidModule extends BlockModule{ private static final int windowSize = 3, updateInterval = 60; diff --git a/core/src/mindustry/world/modules/PowerModule.java b/core/src/mindustry/world/modules/PowerModule.java index 6f05f94304..c93a7d845f 100644 --- a/core/src/mindustry/world/modules/PowerModule.java +++ b/core/src/mindustry/world/modules/PowerModule.java @@ -1,8 +1,8 @@ package mindustry.world.modules; -import arc.struct.IntSeq; +import arc.struct.*; import arc.util.io.*; -import mindustry.world.blocks.power.PowerGraph; +import mindustry.world.blocks.power.*; public class PowerModule extends BlockModule{ /** diff --git a/core/src/mindustry/world/producers/Produce.java b/core/src/mindustry/world/producers/Produce.java deleted file mode 100644 index 478e9f35d9..0000000000 --- a/core/src/mindustry/world/producers/Produce.java +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 8f0b5129fb..0000000000 --- a/core/src/mindustry/world/producers/ProduceItem.java +++ /dev/null @@ -1,4 +0,0 @@ -package mindustry.world.producers; - -public class ProduceItem{ -} diff --git a/desktop/build.gradle b/desktop/build.gradle index 3955380145..6b383b958d 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -11,7 +11,7 @@ project.ext.assetsDir = new File("../core/assets") def enableTemplates = true def JDK_DIR = "$System.env.JDK_DIR" -def ICON_DIR = new File("core/assets/icons/icon.icns") +def ICON_DIR = new File("$rootDir/core/assets/icons/icon.icns") def spriteHashFile = new File(project.rootDir, "build/spritehash") def hashDirectory = { @@ -45,6 +45,8 @@ task run(dependsOn: classes, type: JavaExec){ jvmArgs("-XstartOnFirstThread", "-Djava.awt.headless=true") } + jvmArgs += "-XX:+ShowCodeDetailsInExceptionMessages" + /*spriteHashFile.parentFile.mkdirs() String spriteHash = hashDirectory() if(spriteHashFile.exists() && spriteHashFile.text != spriteHash){ @@ -127,13 +129,13 @@ PackrConfig.Platform.values().each{ platform -> verbose = true bundleIdentifier = getPackage() + ".mac" iconResource = ICON_DIR - outDir = file("build/packr/output") + outDir = file("$rootDir/desktop/build/packr/output") mainClass = project.ext.mainClassName - classpath = ["desktop/build/packr/desktop.jar"] - removePlatformLibs = ["desktop/build/packr/desktop.jar"] + classpath = ["$rootDir/desktop/build/packr/desktop.jar".toString()] + removePlatformLibs = ["$rootDir/desktop/build/packr/desktop.jar".toString()] vmArgs = [] - minimizeJre = "desktop/packr_minimize.json" + minimizeJre = "$rootDir/desktop/packr_minimize.json".toString() jdk = JDK_DIR + "jdk-${platform.toString().toLowerCase()}.zip" if(platform == PackrConfig.Platform.MacOS){ diff --git a/desktop/src/mindustry/desktop/DesktopLauncher.java b/desktop/src/mindustry/desktop/DesktopLauncher.java index a2f6db7d56..bd9ec3e81b 100644 --- a/desktop/src/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/mindustry/desktop/DesktopLauncher.java @@ -170,11 +170,11 @@ public class DesktopLauncher extends ClientLauncher{ String finalMessage = Strings.getFinalMesage(e); String total = Strings.getCauses(e).toString(); - if(total.contains("Couldn't create window") || total.contains("OpenGL 2.0 or higher") || total.toLowerCase().contains("pixel format") || total.contains("GLEW")){ + if(total.contains("Couldn't create window") || total.contains("OpenGL 2.0 or higher") || total.toLowerCase().contains("pixel format") || total.contains("GLEW")|| total.contains("unsupported combination of formats")){ dialog.get(() -> message( total.contains("Couldn't create window") ? "A graphics initialization error has occured! Try to update your graphics drivers:\n" + finalMessage : - "Your graphics card does not support OpenGL 2.0 with the framebuffer_object extension!\n" + + "Your graphics card does not support the right OpenGL features.\n" + "Try to update your graphics drivers. If this doesn't work, your computer may not support Mindustry.\n\n" + "Full message: " + finalMessage)); badGPU = true; diff --git a/desktop/src/mindustry/desktop/steam/SNet.java b/desktop/src/mindustry/desktop/steam/SNet.java index 9cd7c816ee..5d603067f3 100644 --- a/desktop/src/mindustry/desktop/steam/SNet.java +++ b/desktop/src/mindustry/desktop/steam/SNet.java @@ -79,10 +79,14 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, Log.err(e); } }else if(currentServer != null && fromID == currentServer.getAccountID()){ - net.handleClientReceived(output); + try{ + net.handleClientReceived(output); + }catch(Throwable t){ + net.handleException(t); + } } }catch(SteamException e){ - e.printStackTrace(); + Log.err(e); } } } @@ -233,7 +237,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, @Override public void onLobbyEnter(SteamID steamIDLobby, int chatPermissions, boolean blocked, ChatRoomEnterResponse response){ - Log.info("enter lobby @ @", steamIDLobby.getAccountID(), response); + Log.info("onLobbyEnter @ @", steamIDLobby.getAccountID(), response); if(response != ChatRoomEnterResponse.Success){ ui.loadfrag.hide(); @@ -241,6 +245,17 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, return; } + int version = Strings.parseInt(smat.getLobbyData(steamIDLobby, "version"), -1); + + //check version + if(version != Version.build){ + ui.loadfrag.hide(); + ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" + + Core.bundle.format("server.versions", Version.build, version)); + smat.leaveLobby(steamIDLobby); + return; + } + logic.reset(); net.reset(); diff --git a/desktop/src/mindustry/desktop/steam/SStats.java b/desktop/src/mindustry/desktop/steam/SStats.java index 2ee13bea4e..7e7c9ecef3 100644 --- a/desktop/src/mindustry/desktop/steam/SStats.java +++ b/desktop/src/mindustry/desktop/steam/SStats.java @@ -65,7 +65,7 @@ public class SStats implements SteamUserStatsCallback{ } for(Building entity : player.team().cores()){ - if(!content.items().contains(i -> entity.items.get(i) < entity.block().itemCapacity)){ + if(!content.items().contains(i -> entity.items.get(i) < entity.block.itemCapacity)){ fillCoreAllCampaign.complete(); break; } @@ -109,7 +109,7 @@ public class SStats implements SteamUserStatsCallback{ if(campaign() && e.unit != null && e.unit.isLocal() && !e.breaking){ SStat.blocksBuilt.add(); - if(e.tile.block() == Blocks.router && e.tile.build.proximity().contains(t -> t.block() == Blocks.router)){ + if(e.tile.block() == Blocks.router && e.tile.build.proximity().contains(t -> t.block == Blocks.router)){ chainRouters.complete(); } @@ -196,13 +196,14 @@ public class SStats implements SteamUserStatsCallback{ } }); - Events.on(LaunchEvent.class, e -> { - if(state.rules.tutorial){ - completeTutorial.complete(); - } - - SStat.timesLaunched.add(); - }); + //TODO + //Events.on(LaunchEvent.class, e -> { + // if(state.rules.tutorial){ + // completeTutorial.complete(); + // } +// + // SStat.timesLaunched.add(); + //}); Events.on(LaunchItemEvent.class, e -> { SStat.itemsLaunched.add(e.stack.amount); @@ -242,7 +243,7 @@ public class SStats implements SteamUserStatsCallback{ SStat.attacksWon.add(); } - RankResult result = state.stats.calculateRank(state.getSector(), state.launched); + RankResult result = state.stats.calculateRank(state.getSector(), true); if(result.rank == Rank.S) earnSRank.complete(); if(result.rank == Rank.SS) earnSSRank.complete(); } diff --git a/fastlane/metadata/android/cs-CZ/changelogs/29659.txt b/fastlane/metadata/android/cs-CZ/changelogs/29659.txt new file mode 100644 index 0000000000..db918ffffb --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/29659.txt @@ -0,0 +1,10 @@ +Toto je první alfa uvolnění verze 6.0 a obrovským přídavkem obsahu a kampaně. +I když bylo toto sestavení testováno ve hře více hráčů, stále může mít četné chyby. Jako obvykle, hlaste prosím problémy na Githubu. + +Přehled změn je příliš velký, ale mezi nejzajímavější patří: + +- Nový systém výroby jednotek, s přírůstkovými vylepšeními +- Přímé velení jednotkám a věžím +- Jednotky byly překresleny a přejmenovány +- Nové jednotky a bloky ve hře +- Námořní a hmyzu podobné jednotky diff --git a/fastlane/metadata/android/en-US/changelogs/29659.txt b/fastlane/metadata/android/en-US/changelogs/29659.txt new file mode 100644 index 0000000000..77646b10bd --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29659.txt @@ -0,0 +1,10 @@ +This is the first alpha release of 6.0, a massive campaign and content update. +While this build has been tested in multiplayer, it still may have numerous issues. As usual, report problems on Github. + +There are too many changes to list here, but the important bits include: + +- A new unit production system, with incremental upgrades +- Direct unit and turret control +- Renamed and re-sprited units +- New blocks and units +- Naval and insect-like units diff --git a/fastlane/metadata/android/en-US/changelogs/29661.txt b/fastlane/metadata/android/en-US/changelogs/29661.txt new file mode 100644 index 0000000000..076169ca4d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29661.txt @@ -0,0 +1,9 @@ +- Fixed some bugs +- Didn't fix some other bugs +- Added 6 new units to fill in missing T4/5 upgrades +- Added unit outlines for visual clarity, may remove later +- Added mud floor (Contributed by ThePlayerA) +- Added research costs to units in tech tree +- Added ability to replace small walls with bigger ones directly +- Added launch pad destination selection (barely tested) +- Added team colors for storage blocks (Contributed by Voz-Duh) diff --git a/fastlane/metadata/android/en-US/changelogs/29664.txt b/fastlane/metadata/android/en-US/changelogs/29664.txt new file mode 100644 index 0000000000..cd151c8499 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29664.txt @@ -0,0 +1,9 @@ +This is a small update. Not much new content, mostly bugfixes. +The next planned update will focus on the campaign, and will likely take much longer. + +- Bugfixes +- Added team color for command center (Contributed by Voz-Duh) +- Cleaned up certain sprites to match V6 style (Partially contributed by Voz-Duh) +- Added support for Java-based mods on Android (mostly undocumented for now) +- Added 2x2 high capacity memory bank for logic processors +- Balancing diff --git a/fastlane/metadata/steam/korean/achievements.vdf b/fastlane/metadata/steam/korean/achievements.vdf index 4d274ee96b..14aba2fd5e 100644 --- a/fastlane/metadata/steam/korean/achievements.vdf +++ b/fastlane/metadata/steam/korean/achievements.vdf @@ -14,11 +14,11 @@ "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_6_DESC" "적 코어 파괴인 지역에서 10번 승리하세요." "NEW_ACHIEVEMENT_20_7_NAME" "챔피언" "NEW_ACHIEVEMENT_20_7_DESC" "멀티플레이어 PvP 매치에서 10번 승리하세요." "NEW_ACHIEVEMENT_20_8_NAME" "진격!" - "NEW_ACHIEVEMENT_20_8_DESC" "캠페인의 미션:적 코어 파괴인 지역에서 5단계 이상일 때 적의 코어를 파괴하세요." + "NEW_ACHIEVEMENT_20_8_DESC" "적 코어 파괴인 지역에서 5단계 이하일 때 적의 코어를 파괴하세요." "NEW_ACHIEVEMENT_20_9_NAME" "하늘에서 코어의 비가 쏟아진다!" "NEW_ACHIEVEMENT_20_9_DESC" "캠페인 지역에 30번 도전하세요." "NEW_ACHIEVEMENT_20_10_NAME" "끈질긴" @@ -36,9 +36,9 @@ "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_18_DESC" "블록 10,000를 설치하세요." "NEW_ACHIEVEMENT_20_19_NAME" "잿더미" - "NEW_ACHIEVEMENT_20_19_DESC" "적 블럭을 1,000개 파괴하세요." + "NEW_ACHIEVEMENT_20_19_DESC" "적 블록을 1,000개 파괴하세요." "NEW_ACHIEVEMENT_20_20_NAME" "폭발은 예술이다!" "NEW_ACHIEVEMENT_20_20_DESC" "토륨 원자로를 폭발시키세요." "NEW_ACHIEVEMENT_20_21_NAME" "맵퍼" @@ -88,11 +88,11 @@ "NEW_ACHIEVEMENT_21_14_NAME" "출격!" "NEW_ACHIEVEMENT_21_14_DESC" "발사대를 사용하세요." "NEW_ACHIEVEMENT_21_15_NAME" "성급한" - "NEW_ACHIEVEMENT_21_15_DESC" "2단계 이상을 스킵하고, 당신의 코어를 적에게 파괴당하세요." + "NEW_ACHIEVEMENT_21_15_DESC" "2번 이상의 출격 기회를 스킵하고, 당신의 코어를 적에게 파괴당하세요." "NEW_ACHIEVEMENT_21_16_NAME" "2단" "NEW_ACHIEVEMENT_21_16_DESC" "분배기를 2개 붙여서 건설하세요." "NEW_ACHIEVEMENT_21_17_NAME" "고독한 수호자" - "NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블럭도 설치하지 않고 생존하세요." + "NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블록도 설치하지 않고 생존하세요." "NEW_ACHIEVEMENT_21_18_NAME" "인화성" "NEW_ACHIEVEMENT_21_18_DESC" "포탑에 파이라타이트를 사용하세요." "NEW_ACHIEVEMENT_21_19_NAME" "효율성" diff --git a/fastlane/metadata/steam/russian/achievements.vdf b/fastlane/metadata/steam/russian/achievements.vdf index 1289b5db58..628e39b9a5 100644 --- a/fastlane/metadata/steam/russian/achievements.vdf +++ b/fastlane/metadata/steam/russian/achievements.vdf @@ -68,7 +68,7 @@ "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_5_DESC" "Имейте одновременно 50 активных ботов «Ползун»." "NEW_ACHIEVEMENT_21_6_NAME" "Легионы" "NEW_ACHIEVEMENT_21_6_DESC" "Постройте в целом 1000 единиц." "NEW_ACHIEVEMENT_21_7_NAME" "Super" diff --git a/gradle.properties b/gradle.properties index 49caf1cddb..77aed771ce 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=fc3cc66e77ebf7d10ac13e615403d29783028b8e +archash=0605d29e603131326e519775758954e83866096a diff --git a/server/server_template/run_server.bat b/server/server_template/run_server.bat index 8084a7149f..b470f31189 100644 --- a/server/server_template/run_server.bat +++ b/server/server_template/run_server.bat @@ -1 +1,2 @@ +@echo off java -jar server.jar diff --git a/server/src/mindustry/server/ServerControl.java b/server/src/mindustry/server/ServerControl.java index 280bcfa615..48f529b187 100644 --- a/server/src/mindustry/server/ServerControl.java +++ b/server/src/mindustry/server/ServerControl.java @@ -4,7 +4,6 @@ import arc.*; import arc.files.*; import arc.struct.*; import arc.struct.Seq.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.Timer; import arc.util.CommandHandler.*; @@ -56,6 +55,8 @@ public class ServerControl implements ApplicationListener{ private ServerSocket serverSocket; private PrintWriter socketOutput; + private String yes; + public ServerControl(String[] args){ Core.settings.defaults( "bans", "", @@ -491,7 +492,7 @@ public class ServerControl implements ApplicationListener{ } for(Item item : content.items()){ - state.teams.cores(team).first().items.set(item, state.teams.cores(team).first().block().itemCapacity); + state.teams.cores(team).first().items.set(item, state.teams.cores(team).first().block.itemCapacity); } info("Core filled."); @@ -908,6 +909,14 @@ public class ServerControl implements ApplicationListener{ info("&ly@&lg MB collected. Memory usage now at &ly@&lg MB.", pre - post, post); }); + handler.register("yes", "Run the above \"did you mean\" suggestion.", arg -> { + if(yes == null){ + err("There is nothing to say yes to."); + }else{ + handleCommandString(yes); + } + }); + mods.eachClass(p -> p.registerServerCommands(handler)); } @@ -938,6 +947,7 @@ public class ServerControl implements ApplicationListener{ if(closest != null){ err("Command not found. Did you mean \"" + closest.text + "\"?"); + yes = line.replace(response.runCommand, closest.text); }else{ err("Invalid command. Type 'help' for help."); } @@ -945,6 +955,8 @@ public class ServerControl implements ApplicationListener{ err("Too few command arguments. Usage: " + response.command.text + " " + response.command.paramText); }else if(response.type == ResponseType.manyArguments){ err("Too many command arguments. Usage: " + response.command.text + " " + response.command.paramText); + }else if(response.type == ResponseType.valid){ + yes = null; } } @@ -967,7 +979,9 @@ public class ServerControl implements ApplicationListener{ for(Player p : players){ if(p.con == null) continue; + boolean wasAdmin = p.admin; p.reset(); + p.admin = wasAdmin; if(state.rules.pvp){ p.team(netServer.assignTeam(p, new SeqIterable<>(players))); } diff --git a/servers.json b/servers.json index 34241b026b..5b2c54d966 100644 --- a/servers.json +++ b/servers.json @@ -8,15 +8,6 @@ { "address": "mindustry.nydus.app:1337" }, - { - "address": "mindustry.ecansol.com:6597" - }, - { - "address": "mindustry.ecansol.com:6499" - }, - { - "address": "mindustry.ecansol.com:6599" - }, { "address": "mindustry.ru" }, @@ -47,6 +38,9 @@ { "address": "aamindustry.play.ai:6569" }, + { + "address": "aamindustry.play.ai:6570" + }, { "address": "mindustry.atannergaming.com" }, @@ -79,5 +73,11 @@ }, { "address": "Chaotic-Neutral.ddns.net:3333" + }, + { + "address": "pandorum.su:9999" + }, + { + "address": "mindustryranked.ddns.net" } ] diff --git a/servers_be.json b/servers_be.json index 047dfba7e0..312bc9da30 100644 --- a/servers_be.json +++ b/servers_be.json @@ -6,12 +6,9 @@ "address": "nydustry.nydus.app:6060" }, { - "address": "mindustry.pl:6000" + "address": "md.surrealment.com" }, { - "address": "routerchain.ddns.net" - }, - { - "address": "mindustry.pl:6666" + "address": "mindustry.pl:6660" } ] diff --git a/servers_v6.json b/servers_v6.json new file mode 100644 index 0000000000..85f4c11b19 --- /dev/null +++ b/servers_v6.json @@ -0,0 +1,26 @@ +[ + { + "address": "mindustry.pl:6000" + }, + { + "address": "mindustry.pl:6666" + }, + { + "address": "routerchain.ddns.net" + }, + { + "address": "mindustry.atannergaming.com:13000" + }, + { + "address": "pandorum.su:8000" + }, + { + "address": "mindustry.ecansol.com:6597" + }, + { + "address": "mindustry.ecansol.com:6499" + }, + { + "address": "mindustry.ecansol.com:6599" + } +] diff --git a/settings.gradle b/settings.gradle index b0aa7f6e3e..52b0980311 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,7 @@ +if(JavaVersion.current().ordinal() < JavaVersion.VERSION_14.ordinal()){ + throw new GradleException("!!! YOU MUST USE JAVA 14 OR ABOVE TO COMPILE AND RUN MINDUSTRY !!! Read the README. Your version: ${System.properties["java.version"]}") +} + include 'desktop', 'core', 'server', 'ios', 'annotations', 'tools', 'tests' def use = { ... names -> @@ -33,7 +37,6 @@ if(!hasProperty("release")){ ':Arc:extensions:recorder', ':Arc:extensions:arcnet', ':Arc:extensions:packer', - ':Arc:extensions:box2d', ':Arc:extensions:g3d', ':Arc:extensions:fx', ':Arc:natives', @@ -43,9 +46,6 @@ if(!hasProperty("release")){ ':Arc:natives:natives-freetype-desktop', ':Arc:natives:natives-freetype-android', ':Arc:natives:natives-freetype-ios', - ':Arc:natives:natives-box2d-desktop', - ':Arc:natives:natives-box2d-android', - ':Arc:natives:natives-box2d-ios', ':Arc:backends', ':Arc:backends:backend-sdl', ':Arc:backends:backend-android', diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index d4192ca9c6..01cf659df2 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -377,7 +377,7 @@ public class ApplicationTests{ world.tile(length + 1, 0).setBlock(new Block("___"){{ hasItems = true; destructible = true; - entityType = () -> new Building(){ + buildType = () -> new Building(){ @Override public void handleItem(Building source, Item item){ itemsa[0] ++; @@ -424,6 +424,15 @@ public class ApplicationTests{ assertEquals(300, world.height()); } + @Test + void load108Save(){ + resetWorld(); + SaveIO.load(Core.files.internal("108.msav")); + + assertEquals(256, world.width()); + assertEquals(256, world.height()); + } + @Test void arrayIterators(){ Seq arr = Seq.with("a", "b" , "c", "d", "e", "f"); @@ -574,7 +583,7 @@ public class ApplicationTests{ }catch(Throwable t){ fail("Failed to update block '" + tile.block() + "'.", t); } - assertEquals(tile.block(), tile.build.block()); + assertEquals(tile.block(), tile.build.block); assertEquals(tile.block().health, tile.build.health()); } } diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ItemLiquidGeneratorTests.java index 64959780d1..1e2224753f 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ItemLiquidGeneratorTests.java @@ -39,7 +39,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ powerProduction = 0.1f; itemDuration = fakeItemDuration; maxLiquidGenerate = maximumLiquidUsage; - entityType = ItemLiquidGeneratorBuild::new; + buildType = ItemLiquidGeneratorBuild::new; } @Override @@ -87,7 +87,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ final float expectedRemainingLiquidAmount = Math.max(0.0f, availableLiquidAmount - expectedConsumptionPerTick * Time.delta); createGenerator(inputType); - assertTrue(entity.acceptLiquid(null, liquid, availableLiquidAmount), inputType + " | " + parameterDescription + ": Liquids which will be declined by the generator don't need to be tested - The code won't be called for those cases."); + assertTrue(entity.acceptLiquid(null, liquid), inputType + " | " + parameterDescription + ": Liquids which will be declined by the generator don't need to be tested - The code won't be called for those cases."); entity.liquids.add(liquid, availableLiquidAmount); entity.cons.update(); diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 1c888070bf..7bd7e821b2 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -28,14 +28,14 @@ public class PowerTestFixture{ headless = true; Core.graphics = new FakeGraphics(); Core.files = new MockFiles(); - Vars.state = new GameState(); - Vars.tree = new FileTree(); Vars.content = new ContentLoader(){ @Override public void handleMappableContent(MappableContent content){ } }; + Vars.state = new GameState(); + Vars.tree = new FileTree(); content.createBaseContent(); Log.setUseColors(false); Time.setDeltaProvider(() -> 0.5f); @@ -43,21 +43,21 @@ public class PowerTestFixture{ protected static PowerGenerator createFakeProducerBlock(float producedPower){ return new PowerGenerator("fakegen"){{ - entityType = () -> new GeneratorBuild(); + buildType = () -> new GeneratorBuild(); powerProduction = producedPower; }}; } protected static Battery createFakeBattery(float capacity){ return new Battery("fakebattery"){{ - entityType = () -> new BatteryBuild(); + buildType = () -> new BatteryBuild(); consumes.powerBuffered(capacity); }}; } protected static Block createFakeDirectConsumer(float powerPerTick){ return new PowerBlock("fakedirectconsumer"){{ - entityType = Building::create; + buildType = Building::create; consumes.power(powerPerTick); }}; } @@ -86,7 +86,7 @@ public class PowerTestFixture{ Reflect.set(Tile.class, tile, "floor", Blocks.sand); // Simulate the "changed" method. Calling it through reflections would require half the game to be initialized. - tile.build = block.newEntity().init(tile, Team.sharded, false, 0); + tile.build = block.newBuilding().init(tile, Team.sharded, false, 0); if(block.hasPower){ tile.build.power.graph = new PowerGraph(){ //assume there's always something consuming power diff --git a/tests/src/test/resources/108.msav b/tests/src/test/resources/108.msav new file mode 100644 index 0000000000..9653e63d16 Binary files /dev/null and b/tests/src/test/resources/108.msav differ diff --git a/tools/build.gradle b/tools/build.gradle index 1b45dd95c0..3266834485 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -409,16 +409,6 @@ task genSprites(dependsOn: classes, type: JavaExec){ workingDir = genFolder } -task genSectorData(dependsOn: classes, type: JavaExec){ - main = "mindustry.tools.SectorDataGenerator" - classpath = sourceSets.main.runtimeClasspath - standardInput = System.in - workingDir = "../core/assets/" -} - -task updateCache(dependsOn: [genSectorData]){ -} - task updateBundles(dependsOn: classes, type: JavaExec){ file(genFolder).mkdirs() diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index f12be289bc..d8f67eee8c 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -2,6 +2,7 @@ package mindustry.tools; import arc.*; import arc.files.*; +import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -77,6 +78,79 @@ public class Generators{ } }); + ImagePacker.generate("cliffs", () -> { + int size = 64; + Color dark = new Color(0.5f, 0.5f, 0.6f, 1f).mul(0.98f); + Color mid = Color.lightGray; + + Image[] images = new Image[8]; + for(int i = 0; i < 8; i++){ + images[i] = ImagePacker.get("cliff" + i); + } + + for(int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++){ + Image result = new Image(size, size); + byte[][] mask = new byte[size][size]; + + byte val = (byte)i; + //check each bit/direction + for(int j = 0; j < 8; j++){ + if((val & (1 << j)) != 0){ + if(j % 2 == 1 && (((val & (1 << (j + 1))) != 0) != ((val & (1 << (j - 1))) != 0))){ + continue; + } + + Image image = images[j]; + image.each((x, y) -> { + Color color = image.getColor(x, y); + if(color.a > 0.1){ + //white -> bit 1 -> top + //black -> bit 2 -> bottom + mask[x][y] |= (color.r > 0.5f ? 1 : 2); + } + }); + } + } + + result.each((x, y) -> { + byte m = mask[x][y]; + if(m != 0){ + //mid + if(m == 3){ + //find nearest non-mid color + byte best = 0; + float bestDst = 0; + boolean found = false; + //expand search range until found + for(int rad = 9; rad < 64; rad += 7){ + for(int cx = Math.max(x - rad, 0); cx <= Math.min(x + rad, size - 1); cx++){ + for(int cy = Math.max(y - rad, 0); cy <= Math.min(y + rad, size - 1); cy++){ + byte nval = mask[cx][cy]; + if(nval == 1 || nval == 2){ + float dst2 = Mathf.dst2(cx, cy, x, y); + if(dst2 <= rad * rad && (!found || dst2 < bestDst)){ + best = nval; + bestDst = dst2; + found = true; + } + } + } + } + } + + if(found){ + m = best; + } + } + + result.draw(x, y, m == 1 ? Color.white : m == 2 ? dark : mid); + } + }); + + result.save("../blocks/environment/cliffmask" + (val & 0xff)); + } + }); + ImagePacker.generate("cracks", () -> { RidgedPerlin r = new RidgedPerlin(1, 3); for(int size = 1; size <= Block.maxCrackSize; size++){ @@ -172,7 +246,7 @@ public class Generators{ int radius = 4; GenRegion region = (GenRegion)regions[regions.length - 1]; Image base = ImagePacker.get(region); - Image out = last = new Image(region.getWidth(), region.getHeight()); + Image out = last = new Image(region.width, region.height); for(int x = 0; x < out.width; x++){ for(int y = 0; y < out.height; y++){ @@ -213,7 +287,7 @@ public class Generators{ } //draw shard (default team top) on top of first sprite - if(i == 1 && shardTeamTop != null){ + if(region == block.teamRegions[Team.sharded.id] && shardTeamTop != null){ image.draw(shardTeamTop); } } @@ -232,18 +306,22 @@ public class Generators{ boolean hasEmpty = false; Color average = new Color(); + float asum = 0f; for(int x = 0; x < image.width; x++){ for(int y = 0; y < image.height; y++){ Color color = image.getColor(x, y); - average.r += color.r; - average.g += color.g; - average.b += color.b; + average.r += color.r*color.a; + average.g += color.g*color.a; + average.b += color.b*color.a; + asum += color.a; if(color.a < 0.9f){ hasEmpty = true; } } } - average.mul(1f / (image.width * image.height)); + + average.mul(1f / asum); + if(block instanceof Floor){ average.mul(0.8f); }else{ @@ -302,18 +380,37 @@ public class Generators{ ImagePacker.generate("unit-icons", () -> content.units().each(type -> { if(type.isHidden()) return; //hidden units don't generate + ObjectSet outlined = new ObjectSet<>(); + try{ type.load(); type.init(); - Image image = ImagePacker.get(type.parts > 0 ? type.partRegions[0] : type.region); - for(int i = 1; i < type.parts; i++){ - image.draw(ImagePacker.get(type.partRegions[i])); - } - if(type.parts > 0){ - image.save(type.name); + Color outc = Pal.darkerMetal; + Func outline = i -> i.outline(3, outc); + Cons outliner = t -> { + if(t != null && t.found()){ + ImagePacker.replace(t, outline.get(ImagePacker.get(t))); + } + }; + + for(Weapon weapon : type.weapons){ + if(outlined.add(weapon.name) && ImagePacker.has(weapon.name)){ + outline.get(ImagePacker.get(weapon.name)).save(weapon.name + "-outline"); + } } + outliner.get(type.jointRegion); + outliner.get(type.footRegion); + outliner.get(type.legBaseRegion); + outliner.get(type.baseJointRegion); + if(type.constructor.get() instanceof Legsc) outliner.get(type.legRegion); + + Image image = outline.get(ImagePacker.get(type.region)); + + image.save(type.name + "-outline"); + + //draw mech parts if(type.constructor.get() instanceof Mechc){ image.drawCenter(type.baseRegion); image.drawCenter(type.legRegion); @@ -321,16 +418,21 @@ public class Generators{ image.draw(type.region); } - Image baseCell = ImagePacker.get(type.parts > 0 ? type.partCellRegions[0] : type.cellRegion); - for(int i = 1; i < type.parts; i++){ - baseCell.draw(ImagePacker.get(type.partCellRegions[i])); + //draw outlines + for(Weapon weapon : type.weapons){ + weapon.load(); + + image.draw(outline.get(ImagePacker.get(weapon.region)), + (int)(weapon.x / Draw.scl + image.width / 2f - weapon.region.width / 2f), + (int)(-weapon.y / Draw.scl + image.height / 2f - weapon.region.height / 2f), + weapon.flipSprite, false); } - if(type.parts > 0){ - image.save(type.name + "-cell"); - } + //draw base region on top to mask weapons + image.draw(type.region); - Image cell = new Image(type.cellRegion.getWidth(), type.cellRegion.getHeight()); + Image baseCell = ImagePacker.get(type.cellRegion); + Image cell = new Image(type.cellRegion.width, type.cellRegion.height); cell.each((x, y) -> cell.draw(x, y, baseCell.getColor(x, y).mul(Color.valueOf("ffa665")))); image.draw(cell, image.width / 2 - cell.width / 2, image.height / 2 - cell.height / 2); @@ -338,9 +440,9 @@ public class Generators{ for(Weapon weapon : type.weapons){ weapon.load(); - image.draw(weapon.region, - (int)(weapon.x / Draw.scl + image.width / 2f - weapon.region.getWidth() / 2f), - (int)(-weapon.y / Draw.scl + image.height / 2f - weapon.region.getHeight() / 2f), + image.draw(weapon.top ? outline.get(ImagePacker.get(weapon.region)) : ImagePacker.get(weapon.region), + (int)(weapon.x / Draw.scl + image.width / 2f - weapon.region.width / 2f), + (int)(-weapon.y / Draw.scl + image.height / 2f - weapon.region.height / 2f), weapon.flipSprite, false); } diff --git a/tools/src/mindustry/tools/Image.java b/tools/src/mindustry/tools/Image.java index 9f7e5e5eee..83594f22be 100644 --- a/tools/src/mindustry/tools/Image.java +++ b/tools/src/mindustry/tools/Image.java @@ -3,6 +3,8 @@ package mindustry.tools; import arc.func.*; import arc.graphics.Color; import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.tools.ImagePacker.*; @@ -60,6 +62,76 @@ class Image{ return color; } + Image outline(int radius, Color outlineColor){ + Image out = copy(); + for(int x = 0; x < out.width; x++){ + for(int y = 0; y < out.height; y++){ + + Color color = getColor(x, y); + out.draw(x, y, color); + if(color.a < 1f){ + boolean found = false; + outer: + for(int rx = -radius; rx <= radius; rx++){ + for(int ry = -radius; ry <= radius; ry++){ + if(Mathf.dst(rx, ry) <= radius && getColor(rx + x, ry + y).a > 0.01f){ + found = true; + break outer; + } + } + } + if(found){ + out.draw(x, y, outlineColor); + } + } + } + } + return out; + } + + Image shadow(float alpha, int rad){ + Image out = silhouette(new Color(0f, 0f, 0f, alpha)).blur(rad); + out.draw(this); + return out; + } + + Image silhouette(Color color){ + Image out = copy(); + + each((x, y) -> out.draw(x, y, getColor(x, y).set(color.r, color.g, color.b, this.color.a * color.a))); + + return out; + } + + Image blur(int radius){ + Image out = copy(); + Color c = new Color(); + int[] sum = {0}; + + for(int x = 0; x < out.width; x++){ + for(int y = 0; y < out.height; y++){ + sum[0] = 0; + + Geometry.circle(x, y, radius, (cx, cy) -> { + int rx = Mathf.clamp(cx, 0, out.width - 1), ry = Mathf.clamp(cy, 0, out.height - 1); + + Color other = getColor(rx, ry); + c.r += other.r; + c.g += other.g; + c.b += other.b; + c.a += other.a; + sum[0] ++; + }); + + c.mula(1f / sum[0]); + + out.draw(x, y, c); + } + } + + return out; + } + void each(Intc2 cons){ for(int x = 0; x < width; x++){ for(int y = 0; y < height; y++){ @@ -81,12 +153,12 @@ class Image{ /** Draws a region at the center. */ void drawCenter(TextureRegion region){ - draw(region, (width - region.getWidth()) / 2, (height - region.getHeight()) / 2, false, false); + draw(region, (width - region.width) / 2, (height - region.height) / 2, false, false); } /** Draws a region at the center. */ void drawCenter(TextureRegion region, boolean flipx, boolean flipy){ - draw(region, (width - region.getWidth()) / 2, (height - region.getHeight()) / 2, flipx, flipy); + draw(region, (width - region.width) / 2, (height - region.height) / 2, flipx, flipy); } void drawScaled(Image image){ @@ -110,16 +182,21 @@ class Image{ void draw(TextureRegion region, int x, int y, boolean flipx, boolean flipy){ GenRegion.validate(region); + draw(ImagePacker.get(region), x, y, flipx, flipy); + } + + void draw(Image region, int x, int y, boolean flipx, boolean flipy){ + int ofx = 0, ofy = 0; - graphics.drawImage(ImagePacker.get(region).image, + graphics.drawImage(region.image, x, y, - x + region.getWidth(), - y + region.getHeight(), - (flipx ? region.getWidth() : 0) + ofx, - (flipy ? region.getHeight() : 0) + ofy, - (flipx ? 0 : region.getWidth()) + ofx, - (flipy ? 0 : region.getHeight()) + ofy, + x + region.width, + y + region.height, + (flipx ? region.width : 0) + ofx, + (flipy ? region.height : 0) + ofy, + (flipx ? 0 : region.width) + ofx, + (flipy ? 0 : region.height) + ofy, null); } diff --git a/tools/src/mindustry/tools/ImagePacker.java b/tools/src/mindustry/tools/ImagePacker.java index ec2648d20b..2533f99af9 100644 --- a/tools/src/mindustry/tools/ImagePacker.java +++ b/tools/src/mindustry/tools/ImagePacker.java @@ -42,28 +42,12 @@ public class ImagePacker{ BufferedImage image = ImageIO.read(path.file()); if(image == null) throw new IOException("image " + path.absolutePath() + " is null for terrible reasons"); - GenRegion region = new GenRegion(fname, path){ - - @Override - public int getX(){ - return 0; - } - - @Override - public int getY(){ - return 0; - } - - @Override - public int getWidth(){ - return image.getWidth(); - } - - @Override - public int getHeight(){ - return image.getHeight(); - } - }; + GenRegion region = new GenRegion(fname, path){{ + width = image.getWidth(); + height = image.getHeight(); + u2 = v2 = 1f; + u = v = 0f; + }}; regionCache.put(fname, region); imageCache.put(fname, image); @@ -105,7 +89,7 @@ public class ImagePacker{ } }; - Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth(); + Draw.scl = 1f / Core.atlas.find("scale_marker").width; Time.mark(); Generators.generate(); @@ -179,6 +163,15 @@ public class ImagePacker{ return new Image(imageCache.get(((AtlasRegion)region).name)); } + static void replace(String name, Image image){ + image.save(name); + ((GenRegion)Core.atlas.find(name)).path.delete(); + } + + static void replace(TextureRegion region, Image image){ + replace(((GenRegion)region).name, image); + } + static void err(String message, Object... args){ throw new IllegalArgumentException(Strings.format(message, args)); } diff --git a/tools/src/mindustry/tools/ScriptMainGenerator.java b/tools/src/mindustry/tools/ScriptMainGenerator.java index 66a5233e29..e15335e91a 100644 --- a/tools/src/mindustry/tools/ScriptMainGenerator.java +++ b/tools/src/mindustry/tools/ScriptMainGenerator.java @@ -11,6 +11,7 @@ import arc.struct.*; import arc.util.*; import mindustry.game.*; import mindustry.gen.*; +import mindustry.io.*; import mindustry.net.*; import java.io.*; @@ -42,7 +43,7 @@ public class ScriptMainGenerator{ classes.removeAll(type -> type.isSynthetic() || type.isAnonymousClass() || type.getCanonicalName() == null || Modifier.isPrivate(type.getModifiers()) || blacklist.contains(s -> type.getName().startsWith(base + "." + s + ".")) || nameBlacklist.contains(type.getSimpleName())); - classes.add(NetConnection.class); + classes.add(NetConnection.class, SaveIO.class); classes.distinct(); classes.sortComparing(Class::getName); diff --git a/tools/src/mindustry/tools/SectorDataGenerator.java b/tools/src/mindustry/tools/SectorDataGenerator.java deleted file mode 100644 index 622a0b2466..0000000000 --- a/tools/src/mindustry/tools/SectorDataGenerator.java +++ /dev/null @@ -1,228 +0,0 @@ -package mindustry.tools; - -import arc.*; -import arc.backend.headless.mock.*; -import arc.files.*; -import arc.math.geom.*; -import arc.mock.*; -import arc.struct.*; -import arc.struct.ObjectIntMap.*; -import arc.util.*; -import arc.util.io.*; -import mindustry.*; -import mindustry.content.*; -import mindustry.core.*; -import mindustry.ctype.*; -import mindustry.game.*; -import mindustry.net.Net; -import mindustry.type.*; -import mindustry.type.Sector.*; -import mindustry.world.*; -import mindustry.world.blocks.storage.*; -import mindustry.world.blocks.storage.CoreBlock.*; - -import static mindustry.Vars.*; - -public class SectorDataGenerator{ - - public static void main(String[] args){ - ArcNativesLoader.load(); - Core.files = new MockFiles(); - Core.app = new MockApplication(); - Core.settings = new MockSettings(); - Core.graphics = new MockGraphics(); - - headless = true; - net = new Net(null); - tree = new FileTree(); - Vars.init(); - content.createBaseContent(); - - logic = new Logic(); - netServer = new NetServer(); - world = new World(); - - content.init(); - - for(Planet planet : content.getBy(ContentType.planet)){ - int[] count = {0}; - if(planet.grid == null) continue; - - Fi fi = Fi.get("planets").child(planet.name + ".dat"); - - Seq list = planet.sectors.map(sector -> { - SectorData data = new SectorData(); - - ObjectIntMap floors = new ObjectIntMap<>(); - ObjectSet content = new ObjectSet<>(); - - logic.reset(); - world.loadSector(sector); - float waterFloors = 0, totalFloors = 0; - state.rules.sector = sector; - - for(Tile tile : world.tiles){ - if(world.getDarkness(tile.x, tile.y) >= 3){ - continue; - } - - Liquid liquid = tile.floor().liquidDrop; - if(tile.floor().itemDrop != null) content.add(tile.floor().itemDrop); - if(tile.overlay().itemDrop != null) content.add(tile.overlay().itemDrop); - if(liquid != null) content.add(liquid); - - if(!tile.block().isStatic()){ - totalFloors ++; - if(liquid == Liquids.water){ - waterFloors += tile.floor().isDeep() ? 1f : 0.7f; - } - floors.increment(tile.floor()); - if(tile.overlay() != Blocks.air){ - floors.increment(tile.overlay()); - } - } - } - - CoreBuild entity = Team.sharded.core(); - int cx = entity.tileX(), cy = entity.tileY(); - - boolean path = pathfind(true); - boolean groundPath = pathfind(false); - - if(!path){ - Log.err("Sector &ly@&lr has no core path!", sector.id); - } - - if(!groundPath){ - Log.debug("&lbSector &ly@&lb is naval-only", sector.id); - - data.attributes |= (1 << SectorAttribute.navalPath.ordinal()); - } - - int nearTiles = 0; - int waterCheckRad = 5; - - //check for water presence - for(int rx = -waterCheckRad; rx <= waterCheckRad; rx++){ - for(int ry = -waterCheckRad; ry <= waterCheckRad; ry++){ - Tile tile = world.tile(cx + rx, cy + ry); - if(tile == null || tile.floor().liquidDrop != null){ - nearTiles ++; - } - } - } - - if(waterFloors / totalFloors >= 0.6f){ - Log.debug("Sector @ has @/@ water -> naval", sector.id, waterFloors, totalFloors); - } - - //naval sector guaranteed - if(nearTiles > 4){ - Log.debug("Sector @ has @ water tiles at @ @ -> naval", sector.id, nearTiles, cx, cy); - waterFloors = totalFloors; - } - - //sort counts in descending order - Seq> entries = floors.entries().toArray(); - entries.sort(e -> -e.value); - //remove all blocks occuring < 30 times - unimportant - entries.removeAll(e -> e.value < 30); - - data.floors = new Block[entries.size]; - data.floorCounts = new int[entries.size]; - for(int i = 0; i < entries.size; i++){ - data.floorCounts[i] = entries.get(i).value; - data.floors[i] = entries.get(i).key; - } - - //TODO bad code - boolean hasSnow = data.floors[0].name.contains("ice") || data.floors[0].name.contains("snow"); - boolean hasRain = !hasSnow && data.floors[0].name.contains("water"); - boolean hasDesert = !hasSnow && !hasRain && data.floors[0].name.contains("sand"); - boolean hasSpores = data.floors[0].name.contains("spore") || data.floors[0].name.contains("moss") || data.floors[0].name.contains("tainted"); - - if(hasSnow){ - data.attributes |= (1 << SectorAttribute.snowy.ordinal()); - } - - if(hasRain){ - data.attributes |= (1 << SectorAttribute.rainy.ordinal()); - } - - if(hasDesert){ - data.attributes |= (1 << SectorAttribute.desert.ordinal()); - } - - if(hasSpores){ - data.attributes |= (1 << SectorAttribute.spores.ordinal()); - } - - data.resources = content.asArray().sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))).toArray(UnlockableContent.class); - - //50% water -> naval attribute - if(waterFloors / totalFloors >= 0.6f){ - data.attributes |= (1 << SectorAttribute.naval.ordinal()); - } - - if(count[0]++ % 10 == 0){ - Log.info("&ly[ &lg@% &ly] Done with sector &lm@/@ ", (int)((float)count[0] / planet.sectors.size * 100), count[0], planet.sectors.size); - } - - return data; - }); - - //write data - try(Writes write = fi.writes()){ - write.s(list.size); - list.each(s -> s.write(write)); - } - } - } - - private static boolean pathfind(boolean allowWater){ - CoreBuild entity = Team.sharded.core(); - - IntSet enemies = new IntSet(); - world.tiles.eachTile(t -> { - if((t.team() == Team.crux && t.block() instanceof CoreBlock) || t.overlay() == Blocks.spawn){ - enemies.add(t.pos()); - } - }); - - GridBits used = new GridBits(world.width(), world.height()); - - IntQueue queue = new IntQueue(); - queue.addFirst(entity.pos()); - boolean any = false; - - outer: - while(!queue.isEmpty()){ - int pos = queue.removeFirst(); - int x = Point2.x(pos), y = Point2.y(pos); - used.set(x, y); - - for(Point2 p : Geometry.d4){ - int nx = p.x + x, ny = p.y + y; - - if(world.tiles.in(nx, ny) && !used.get(nx, ny)){ - Tile tile = world.tile(nx, ny); - - //skip full solids - if((tile.block().isStatic() && tile.solid()) || (!allowWater && tile.floor().isLiquid)) continue; - - int newpos = Point2.pack(nx, ny); - - used.set(nx, ny); - queue.addLast(newpos); - - if(enemies.contains(newpos)){ - any = true; - break outer; - } - } - } - } - - return any; - } -}