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 ca66d67e1e..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 @@ -39,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 2f040cc07c..3ec6b34cfe 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -76,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() @@ -98,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/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 231823ec9a..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.*; @@ -78,9 +76,10 @@ public class EntityProcess extends BaseProcessor{ 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() - //replace all self() invocations with this - .replaceAll("this\\.<(.*)>self\\(\\)", "this") - .replaceAll("self\\(\\)", "this") + .replaceAll("this\\.<(.*)>self\\(\\)", "this") //fix parameterized self() calls + .replaceAll("self\\(\\)", "this") //fix self() calls + .replaceAll(" yield ", "") //fix enchanced switch + .replaceAll("\\/\\*missing\\*\\/", "var") //fix vars ); } } @@ -379,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()); @@ -520,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()); @@ -587,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") @@ -595,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){ 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/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 7a9ebbbe7c..e2a00358b6 100644 --- a/build.gradle +++ b/build.gradle @@ -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") @@ -282,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") @@ -291,6 +303,8 @@ project(":core"){ compileOnly project(":annotations") annotationProcessor project(":annotations") + annotationProcessor 'com.github.Anuken:jabel:40eec868af' + } } @@ -299,7 +313,6 @@ project(":server"){ dependencies{ implementation project(":core") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("backends:backend-headless") } } @@ -312,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" } @@ -334,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/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/dune-wall1.png b/core/assets-raw/sprites/blocks/environment/dune-wall1.png index 923945dd74..64d13b3f24 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dune-wall1.png 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 index 85783da449..5e3efcaae0 100644 Binary files a/core/assets-raw/sprites/blocks/environment/dune-wall2.png and b/core/assets-raw/sprites/blocks/environment/dune-wall2.png differ 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/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/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/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/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/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/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/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/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/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.png b/core/assets-raw/sprites/units/omura.png index c6e328e1ca..02befddd78 100644 Binary files a/core/assets-raw/sprites/units/omura.png 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/sei.png b/core/assets-raw/sprites/units/sei.png index ae7e016feb..724fe9559b 100644 Binary files a/core/assets-raw/sprites/units/sei.png 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/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 2c73511d1e..651576c3de 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -20,7 +20,7 @@ gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]New highscore! 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.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 @@ -55,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} @@ -290,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 @@ -328,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 @@ -472,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 @@ -489,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} @@ -521,6 +519,8 @@ 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 @@ -575,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 @@ -599,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 @@ -629,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} @@ -640,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 @@ -827,6 +832,7 @@ 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 @@ -852,6 +858,7 @@ 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 @@ -920,6 +927,8 @@ 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 @@ -930,6 +939,8 @@ 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 @@ -937,6 +948,7 @@ 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.salt-wall.name = Salt Wall block.pebbles.name = Pebbles @@ -982,6 +994,7 @@ block.darksand-water.name = Dark Sand Water block.char.name = Char block.dacite.name = Dacite block.dacite-wall.name = Dacite Wall +block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ice Snow block.stone-wall.name = Stone Wall block.ice-wall.name = Ice Wall @@ -1044,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 @@ -1076,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 @@ -1115,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 @@ -1140,6 +1155,7 @@ 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 @@ -1200,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. @@ -1252,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. diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 9545684502..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 = Споравы прэс @@ -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 = Плавіць металалом ў шлак для далейшай апрацоўкі або выкарыстання ў турэлях «Хваля». diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index e8036557e0..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.feathub.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 @@ -113,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. @@ -124,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 modifikace jsou z podstaty nebezpečné.[]\Ujisti se, že je importuješ z důvěryhodného zdroje! +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} @@ -136,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[] @@ -341,7 +346,6 @@ 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í. -#tyto jsou záměrně malými písmeny wavemode.counts = počty wavemode.totals = součty wavemode.health = zdraví @@ -469,7 +473,6 @@ requirement.research = Vynalezeno {0} requirement.capture = Polapeno {0} resume = Zpět do mapy:\n[lightgray]{0}[] bestwave = [lightgray]Nejvyšší vlna: {0} -#TODO fix/remove this launch = < VYSLAT > launch.text = Vyslat launch.title = Vyslání bylo úspěšné @@ -479,11 +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í -#TODO 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}. @@ -505,7 +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. -#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway +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 @@ -518,10 +534,6 @@ sector.tarFields.name = Dehtová pole sector.saltFlats.name = Solné nížiny sector.fungalPass.name = Plísňový průsmyk -#unused -#sector.impact0078.name = Impact 0078 -#sector.crags.name = Crags - sector.groundZero.description = Optimální místo, kde znovu začít. Nízký výskyt nepřátel. Několik málo surovin.\nPosbírej co nejvíce olova a mědi.\nBěž dál. sector.frozenForest.description = Dokonce až sem, blízko hor, se dokázaly spóry rozrůst. Mráz je však nemůže zadržet navěky.\n\nPusť se do práce za pomocí energie. Stav spalovací generátory. Nauč se, jak používat opravovací věže. sector.saltFlats.description = Na okraji pouště leží Solné nížiny. V této lokaci se nachází jen několik málo surovin.\n\nNepřítel zde vybudoval zásobovací komplex. Znič jádro v jeho základně. Nenechej kámen na kameni. @@ -546,8 +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.save.clear.confirm = Opravdu chceš smazat všechna Tvá uložení hry? -settings.save.clear = Smazat všechna Tvá uložení hry +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[] @@ -573,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í @@ -596,6 +611,8 @@ 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 = Chybějí zdroje @@ -638,9 +655,12 @@ 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 = tis unit.millions = mio @@ -727,6 +747,7 @@ 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 @@ -739,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 @@ -766,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 @@ -800,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ů @@ -821,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 @@ -848,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} @@ -870,10 +902,11 @@ unit.fortress.name = Pevnost unit.nova.name = Nova unit.pulsar.name = Pulzar unit.quasar.name = Kvasar -unit.crawler.name = Slídil +unit.crawler.name = Slídil unit.atrax.name = Atrax -unit.spiroct.name = Spiroct +unit.spiroct.name = Spirokt unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Záře unit.horizon.name = Horizont unit.zenith.name = Zenit @@ -882,34 +915,43 @@ 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.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alfa unit.beta.name = Beta unit.gamma.name = Gama +unit.scepter.name = Žezlo +unit.reign.name = Panovník +unit.vela.name = Vela +unit.corvus.name = Corvus +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ď @@ -936,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 @@ -959,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ď @@ -998,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 @@ -1073,6 +1118,7 @@ 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 @@ -1089,7 +1135,9 @@ 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ý @@ -1151,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. @@ -1255,4 +1303,3 @@ block.spectre.description = Velká střílna s kanónem s dvěma hlavněmi. Stř block.meltdown.description = Masivní laserový kanón. Nabije se a pak pálí nepřetržitý laserový paprsek na nepřátele v okolí. Vyžaduje ke své funkci chlazení. block.repair-point.description = Nepřetržitě léčí nejbližší poškozenou jednotku v poli své působnosti. block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. - diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index e563cba321..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 @@ -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. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 96b20f1b85..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 @@ -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. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index b173b210a5..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 @@ -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. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 2a4cdf1727..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 @@ -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. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 4d14fb5eb9..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 @@ -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. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index cd63bdf61f..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 @@ -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. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 03fa670b73..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 @@ -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. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index e6fef061b4..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 @@ -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 ». diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index 254437cdc8..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 @@ -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. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 160ed3b0f8..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 @@ -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. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 0ed35ef42c..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 @@ -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. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 01e9038170..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 @@ -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. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index a73493be30..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 = 胞子圧縮機 @@ -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 = 石を熱で溶かして溶岩を生成します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index a248790871..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 = 콘텐츠를 로드하는 동안 오류가 발생함. @@ -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]차단됨 @@ -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 = 자원 부족 @@ -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 = 블록 선택 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,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,7 +906,7 @@ unit.crawler.name = 크롤러 unit.atrax.name = 아트락스 unit.spiroct.name = 스피록트 unit.arkyid.name = 아키드 -unit.toxipod.name = 독소포드 +unit.toxopid.name = Toxopid unit.flare.name = 플레어 unit.horizon.name = 호라이즌 unit.zenith.name = 제니스 @@ -865,6 +915,8 @@ 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 = 브리드 @@ -873,7 +925,12 @@ 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.resupply-point.name = Resupply Point block.parallax.name = 시차 block.cliff.name = 낭떠러지 block.sand-boulder.name = 사암 @@ -913,7 +970,6 @@ block.water.name = 물 block.tainted-water.name = 오염된 물 block.darksand-tainted-water.name = 오염된 젖은 검은 모래 block.tar.name = 석유 -block.mud.name = 진흙 block.stone.name = 바위 block.sand.name = 모래 block.darksand.name = 검은 모래 @@ -933,6 +989,7 @@ 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 = 포자낭 @@ -951,7 +1008,6 @@ block.dark-metal.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 = 티타늄 벽 @@ -987,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 = 포자 압축기 @@ -1062,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 = 항공 공장 block.naval-factory.name = 해양 공장 @@ -1074,6 +1131,15 @@ block.payload-router.name = 화물 분배기 block.disassembler.name = 가속 분해기 block.silicon-crucible.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 = 주황색 팀 @@ -1133,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 = 웨이브 포탑에서 추가 처리 또는 사용을 위해 고철을 광재로 녹입니다. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 5541eadcbf..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 @@ -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. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 4313b466d5..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 @@ -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. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index b4cd5a3b2a..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 @@ -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. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index be0c9c14d8..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 @@ -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 diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 20b03d870f..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 @@ -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. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 6863e838d1..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 @@ -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. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index f532c0caad..221ab0aab6 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -21,6 +21,7 @@ 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 @@ -74,8 +75,8 @@ nearpoint = [[ [scarlet]PLEACĂ DE LA PUNCTUL DE LANSARE IMEDIAT[] ]\nanihilare database = Datele Nucleului savegame = Salvează Jocul loadgame = Încarcă Jocul -joingame = Alătură-te Jocului -customgame = Joc Personalizat +joingame = Intră în Joc +customgame = Personalizat newgame = Joc Nou none = minimap = Minihartă @@ -169,7 +170,7 @@ server.kicked.idInUse = Ești deja pe acest server! Nu poți conecta două contu 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}[] +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 @@ -317,7 +318,7 @@ editor.brush = Pensulă editor.openin = Deschide în Editor editor.oregen = Generarea Minereurilor editor.oregen.info = Generarea Minereurilor: -editor.mapinfo = Informații despre Hartă +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ă. @@ -345,8 +346,6 @@ 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ă. - -#astea-s intenționat cu literă mică wavemode.counts = numere wavemode.totals = totaluri wavemode.health = viață @@ -369,7 +368,7 @@ editor.update = Update editor.randomize = Aleatoriu editor.apply = Aplică editor.generate = Generează -editor.resize = Altă Dimensiue +editor.resize = Schimbă Dimensiune editor.loadmap = Încarcă Harta editor.savemap = Salvează Harta editor.saved = Salvat! @@ -391,7 +390,7 @@ editor.exportimage.description = Exportă o hartă imagine conținând doar tere 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 = Altă Dimensiune Hartă +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}[]" @@ -474,7 +473,6 @@ requirement.research = Cercetează {0} requirement.capture = Capturează {0} resume = Revin la Zonă:\n[lightgray]{0} bestwave = [lightgray]Cel Mai Bun Val: {0} -#TODO fix/remove this launch = < LANSARE > launch.text = Lansează launch.title = Lansare Finalizată @@ -484,11 +482,11 @@ launch.confirm = Asta va lansa toate resursele din nucleu.\nNu te vei mai putea launch.skip.confirm = Dacă sari acum, Nu vei mai putea lansa decât valurile viitoare. uncover = Descoperă configure = Configurează Încărcarea -#TODO 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} @@ -521,8 +519,9 @@ sectors.production = Producție: sectors.stored = Stocat: sectors.resume = Revino sectors.launch = Lansare +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 sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -535,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 = 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ă. @@ -576,14 +571,14 @@ 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 = Produs +blocks.output = Produce blocks.booster = Booster -blocks.tiles = Pătrate Necesare +blocks.tiles = Teren Necesar blocks.affinities = Efecte Teren block.unknown = [lightgray]??? blocks.powercapacity = Capacitate electrică blocks.powershot = Electricitate/Glonț -blocks.damage = Deteriorare +blocks.damage = Forță blocks.targetsair = Lovește Aeronave blocks.targetsground = Lovește Artilerie blocks.itemsmoved = Viteza de Mișcare a Materialelor @@ -597,7 +592,7 @@ blocks.linkrange = Raza Legăturilor blocks.instructions = Instrucțiuni blocks.powerconnections = Maxim Conexiuni blocks.poweruse = Consum Electricitate -blocks.powerdamage = Electricitate/Deteriorare +blocks.powerdamage = Electricitate/Forța Glonțului blocks.itemcapacity = Capacitate Materiale blocks.basepowergeneration = Generare Electricitate (Bază) blocks.productiontime = Timp Producție @@ -609,13 +604,15 @@ blocks.drillspeed = Viteză Burghiu (Bază) blocks.boosteffect = Efect de Boost blocks.maxunits = Maxim Unități Active blocks.health = Viață -blocks.buildtime = Timp de Construcție +blocks.buildtime = Timp Construcție blocks.maxconsecutive = Maxim Consecutive -blocks.buildcost = Cost de Construcție +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ă @@ -636,15 +633,15 @@ bar.heat = Căldură bar.power = Electricitate bar.progress = Progres bar.input = Necesită -bar.output = Produs +bar.output = Produce -bullet.damage = [stat]{0}[lightgray] deteriorare -bullet.splashdamage = [stat]{0}[lightgray] zonă deteriorare ~[stat] {1}[lightgray] pătrate +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]greu +bullet.knockback = [stat]{0} [lightgray]împingere bullet.freezing = [stat]înghețat bullet.tarred = [stat]lipicios bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție @@ -658,11 +655,12 @@ unit.liquidunits = unități lichid unit.powerunits = electricitate unit.degrees = grade unit.seconds = secunde -unit.minutes = minute +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 @@ -671,7 +669,7 @@ category.general = General category.power = Electricitate category.liquids = Lichide category.items = Materiale -category.crafting = Necesită/Produs +category.crafting = Necesită/Produce category.shooting = Lovire category.optional = Îmbunătățiri opționale setting.landscape.name = Blochează Mod Peisaj @@ -723,7 +721,7 @@ 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.ambientvol.name = Volum Ambiental setting.mutemusic.name = Muzica pe Mut setting.sfxvol.name = Volum SFX setting.mutesound.name = Sunetul pe Mut @@ -750,7 +748,7 @@ command.attack = Atac command.rally = Adunare command.retreat = Retragere command.idle = Inactiv -placement.blockselectkeys = \n[lightgray]Tastă: [{0}, +placement.blockselectkeys = \n[lightgray]Taste: [{0}, keybind.respawn.name = Regenerare keybind.control.name = Controlează Unități keybind.clear_building.name = Șterge Clădirea @@ -767,7 +765,7 @@ 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.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 @@ -790,6 +788,9 @@ 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 @@ -824,8 +825,8 @@ rules.reactorexplosions = Explozia Reactoarelor rules.wavetimer = Valuri pe Timp rules.waves = Valuri rules.attack = Modul Atac -rules.enemyCheat = Resurse infinite pt AI (echipa roșie) 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 @@ -865,8 +866,8 @@ item.titanium.name = Titan item.thorium.name = Toriu item.silicon.name = Silicon item.plastanium.name = Plastaniu -item.phase-fabric.name = Material de Fază -item.surge-alloy.name = Aliaj de Supratensiune +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 @@ -877,9 +878,11 @@ 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} @@ -912,14 +915,20 @@ 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 @@ -980,6 +989,7 @@ 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 @@ -998,7 +1008,6 @@ block.dark-metal.name = Metal Negru block.basalt.name = Bazalt block.hotrock.name = Piatră Caldă block.magmarock.name = Piatră cu Magmă -block.cliffs.name = Dealuri block.copper-wall.name = Perete de Cupru block.copper-wall-large.name = Perete Mare de Cupru block.titanium-wall.name = Perete de Titan @@ -1034,7 +1043,7 @@ 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.cryofluidmixer.name = Mixer de Criofluid +block.cryofluid-mixer.name = Mixer de Criofluid block.melter.name = Topitor block.incinerator.name = Incinerator block.spore-press.name = Presă de Spori @@ -1090,7 +1099,7 @@ 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 = Generaor Termal +block.thermal-generator.name = Generator Termal block.alloy-smelter.name = Topitorie Aliaj block.mender.name = Reparator block.mend-projector.name = Proiector de Reparare @@ -1186,12 +1195,12 @@ block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre 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ă. Neciesită puțină electricitate pt pornire. +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ă material de 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 aliaj de supratensiune. -block.cryofluidmixer.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 compus explozibil. +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. @@ -1213,17 +1222,17 @@ block.plastanium-wall.description = Un tip special de perete care absoarbe laser 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 material de fază. Reflectă majoritatea gloanțelor la impact. -block.phase-wall-large.description = Un perete învelit într-un material reflexiv special bazat pe material de fază. Reflectă majoritatea gloanțelor la impact.\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 material de 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 material de 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. Materialul de fază poate fi folosit pt a crește mărimea scutului. -block.shock-mine.description = Lovește inamicii care calcă pe ea. Aproape invizibilă pt inamic. +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ă. @@ -1245,7 +1254,7 @@ block.pulse-conduit.description = Un bloc avansat de transport al lichidelor. Tr 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 2 conducte diferite cară divesre lichide către diverse locații. +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. @@ -1255,23 +1264,23 @@ block.diode.description = Energia din baterii poate trece prin acest bloc doar 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 când este plasat în locuri calde. +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.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 pirn tehnologia bazată pe laser, dar necesită electricitate. Poate mina toriu. +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-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. @@ -1282,14 +1291,14 @@ block.duo.description = O armă mică, ieftină. Util împotriva unităților de 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. Extinde focul automat când este alimentată cu apă. +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 unitățile inamice. +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. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index d0f39f97f2..684b957989 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1215,8 +1215,8 @@ block.silicon-smelter.description = Соединяет песок с чисты block.kiln.description = Выплавляет песок и свинец в соединение, известное как метастекло. Требуется небольшое количество энергии для работы. block.plastanium-compressor.description = Производит пластан из нефти и титана. block.phase-weaver.description = Синтезирует фазовую ткань из радиоактивного тория и песка. Требуется огромное количество энергии для работы. -block.alloy-smelter.description = Соединяет титан, свинец, кремний и медь для производства кинетического сплава. -block.cryofluidmixer.description = Смешивает воду и мелкий титановый порошок в криогенную жидкость. Неотъемлемая часть при использования ториевого реактора +block.alloy-smelter.description = Использует титан, свинец, кремний и медь для производства кинетического сплава. +block.cryofluid-mixer.description = Смешивает воду и мелкий титановый порошок в криогенную жидкость. Неотъемлемая часть при использовании ториевого реактора block.blast-mixer.description = Раздавливает и смешивает скопления спор с пиротитом для получения взрывчатого вещества. block.pyratite-mixer.description = Смешивает уголь, свинец и песок в легковоспламеняющийся пиротит. block.melter.description = Плавит металлолом в шлак для дальнейшей обработки или использования в турелях «Волна». diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index d6f7460f0d..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 @@ -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. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index dc649c6fe2..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 = เครื่องอัดสปอร์ @@ -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 = หลอมเศษเหล็กเป็กกากแร่เพื่อใช้สำหรับกระบวนการต่อไปหรือใช้ในป้อมปืนเวฟ. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index d5bb1dd197..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 @@ -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. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 914c5f53a2..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 @@ -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. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 6d73c191a9..df5bfc1db1 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -345,9 +345,11 @@ waves.load = Завантажити з буфера обміну waves.invalid = Недійсні хвилі в буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. + wavemode.counts = кількість wavemode.totals = усього wavemode.health = здоров’я + editor.default = [lightgray]<За замовчуванням> details = Подробиці… edit = Редагувати… @@ -467,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 = < ЗАПУСК > @@ -483,6 +486,7 @@ loadout = Вивантаження resources = Ресурси bannedblocks = Заборонені блоки addall = Додати все +launch.destination = Destination: {0} configure.invalid = Кількість має бути числом між 0 та {0}. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1} @@ -515,6 +519,8 @@ sectors.production = Виробництво: sectors.stored = Зберігає: sectors.resume = Продовжити sectors.launch = Запуск +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) sector.groundZero.name = Відправний пункт sector.craters.name = Кратери @@ -538,7 +544,7 @@ sector.overgrowth.description = Ближче до джерела спор є т 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 = Ігрові дані @@ -605,6 +611,8 @@ blocks.inaccuracy = Розкид blocks.shots = Постріли blocks.reload = Постріли/секунду blocks.ammo = Боєприпаси +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Потребується кращий бур bar.noresources = Бракує ресурсів @@ -652,6 +660,7 @@ unit.persecond = за секунду unit.perminute = за хвилину unit.timesspeed = x швидкість unit.percent = % +unit.shieldhealth = shield health unit.items = предм. unit.thousands = тис unit.millions = млн @@ -779,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 = Меню @@ -841,7 +853,6 @@ rules.ambientlight = Навколишнє світло rules.weather = Погода rules.weather.frequency = Повторюваність: rules.weather.duration = Тривалість: -rules.solarpowermultiplier = Множник сонячної енергії content.item.name = Предмети content.liquid.name = Рідини @@ -867,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} @@ -878,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} @@ -901,14 +915,20 @@ 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 = Паралакс @@ -969,6 +989,7 @@ 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 = Скупчення спор @@ -987,7 +1008,6 @@ block.dark-metal.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 = Титанова стіна @@ -1023,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 = Споровий прес @@ -1110,7 +1130,8 @@ 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 = Логічний процесор @@ -1118,6 +1139,7 @@ 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 = Помаранчева @@ -1177,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 = Розплавляє брухт у шлак для подальшого перероблювання, або використання в баштах «Хвиля». diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index f3b85a3464..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 = 孢子压缩机 @@ -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 = 将废料熔化成矿渣,以便进一步加工或用于炮塔弹药。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index cf729a4a7f..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 = 孢子壓縮機 @@ -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 = 將廢料加熱到很高的溫度產生熔渣,用於進一步製程或波浪炮。 diff --git a/core/assets/contributors b/core/assets/contributors index 07c55986f8..69de5a3d8e 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -92,3 +92,6 @@ SnakkiZXZ sk7725 The Slaylord ThePlayerA +YellOw139 +PetrGasparik +LeoDog896 diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 3041e7fa9c..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 @@ -314,3 +306,11 @@ 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/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/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/sprites/block_colors.png b/core/assets/sprites/block_colors.png index d1ac03356d..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 ccb99e892c..fd8aece5ae 100644 --- a/core/assets/sprites/fallback/sprites.atlas +++ b/core/assets/sprites/fallback/sprites.atlas @@ -6,1252 +6,769 @@ filter: nearest,nearest repeat: none white-tree rotate: false - xy: 1322, 1721 + xy: 1127, 1273 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead rotate: false - xy: 1, 83 + xy: 1127, 951 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead-shadow rotate: false - xy: 1, 1693 + xy: 403, 843 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 white-tree-shadow rotate: false - xy: 1, 1693 + xy: 403, 843 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 factory-in-9 rotate: false - xy: 613, 851 + xy: 1015, 371 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 factory-out-9 rotate: false - xy: 903, 1141 + xy: 725, 81 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor rotate: false - xy: 1193, 1431 + xy: 1015, 81 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor-top rotate: false - xy: 613, 561 + xy: 1338, 515 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 block-tetrative-reconstructor-full rotate: false - xy: 1644, 1753 + xy: 1449, 1385 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 -cracks-8-0 - rotate: false - xy: 1475, 1061 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-1 - rotate: false - xy: 895, 79 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-2 - rotate: false - xy: 1765, 1495 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-3 - rotate: false - xy: 1765, 1237 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-4 - rotate: false - xy: 1733, 979 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-5 - rotate: false - xy: 1475, 803 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-6 - rotate: false - xy: 1467, 545 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-7 - rotate: false - xy: 1467, 287 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 cracks-9-0 rotate: false - xy: 323, 1403 + xy: 1449, 1095 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-1 rotate: false - xy: 323, 1113 + xy: 1449, 805 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-2 rotate: false - xy: 323, 823 + xy: 1739, 1385 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-3 rotate: false - xy: 323, 533 + xy: 1739, 1095 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-4 rotate: false - xy: 323, 243 + xy: 1739, 805 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-5 rotate: false - xy: 613, 1431 + xy: 758, 661 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-6 rotate: false - xy: 613, 1141 + xy: 1048, 661 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-7 rotate: false - xy: 903, 1431 + xy: 725, 371 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 eclipse-outline rotate: false - xy: 1, 1049 + xy: 1, 67 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck0 rotate: false - xy: 678, 1721 + xy: 403, 521 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck1 rotate: false - xy: 1, 727 + xy: 1529, 1675 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck2 rotate: false - xy: 1000, 1721 + xy: 403, 199 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 +oct-outline + rotate: false + xy: 403, 1595 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck0 + rotate: false + xy: 1, 791 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck1 + rotate: false + xy: 403, 1193 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck2 + rotate: false + xy: 805, 1595 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 omura-outline rotate: false - xy: 1193, 1029 + xy: 1587, 1 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 -omura-wreck0 - rotate: false - xy: 1185, 627 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -omura-wreck1 - rotate: false - xy: 903, 337 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -omura-wreck2 - rotate: false - xy: 1185, 225 - size: 280, 400 - orig: 280, 400 - offset: 0, 0 - index: -1 -sei-outline - rotate: false - xy: 1725, 253 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-wreck0 - rotate: false - xy: 323, 1 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-wreck1 - rotate: false - xy: 1467, 45 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-wreck2 - rotate: false - xy: 1709, 11 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -toxopid-leg-base - rotate: false - xy: 1, 17 - size: 270, 64 - orig: 270, 64 - offset: 0, 0 - index: -1 unit-eclipse-full rotate: false - xy: 1, 405 + xy: 805, 951 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 -unit-omura-full +unit-oct-full rotate: false - xy: 1483, 1319 - size: 280, 400 - orig: 280, 400 + xy: 1, 389 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 eclipse rotate: false - xy: 1, 1371 + xy: 805, 1273 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-cell rotate: false - xy: 356, 1721 + xy: 1207, 1675 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 +oct + rotate: false + xy: 1, 1595 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-cell + rotate: false + xy: 1, 1193 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 omura rotate: false - xy: 903, 739 + xy: 1305, 113 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 omura-cell rotate: false - xy: 613, 159 + xy: 1628, 403 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 -sei - rotate: false - xy: 1733, 737 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 -sei-cell - rotate: false - xy: 1725, 495 - size: 240, 240 - orig: 240, 240 - offset: 0, 0 - index: -1 sprites2.png size: 2048,2048 format: rgba8888 filter: nearest,nearest repeat: none -core-silo - rotate: false - xy: 1459, 1637 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -launch-pad-large - rotate: false - xy: 1687, 336 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill - rotate: false - xy: 1864, 859 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rim - rotate: false - xy: 1580, 726 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rotator - rotate: false - xy: 1607, 596 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-top - rotate: false - xy: 1607, 466 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 large-logic-display rotate: false - xy: 1243, 1427 + xy: 1567, 102 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 -impact-reactor - rotate: false - xy: 983, 120 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-bottom - rotate: false - xy: 1113, 120 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-light - rotate: false - xy: 1243, 120 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-0 - rotate: false - xy: 1297, 250 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-1 - rotate: false - xy: 1373, 120 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-2 - rotate: false - xy: 1427, 328 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-3 - rotate: false - xy: 1557, 328 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation - rotate: false - xy: 779, 416 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team - rotate: false - xy: 909, 396 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus - rotate: false - xy: 1343, 986 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team - rotate: false - xy: 1505, 986 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-4 - rotate: false - xy: 1710, 726 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -meltdown-heat - rotate: false - xy: 1503, 68 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 exponential-reconstructor rotate: false - xy: 1147, 1815 + xy: 767, 1071 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 exponential-reconstructor-top rotate: false - xy: 1, 443 + xy: 993, 1313 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 -factory-in-5 - rotate: false - xy: 1785, 1151 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 factory-in-7 rotate: false - xy: 1373, 1815 + xy: 993, 1087 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 -factory-out-5 - rotate: false - xy: 1667, 989 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 factory-out-7 rotate: false - xy: 1, 217 + xy: 1219, 1313 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 -multiplicative-reconstructor - rotate: false - xy: 1829, 989 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-top - rotate: false - xy: 617, 519 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -scrap-wall-gigantic - rotate: false - xy: 1763, 76 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -thruster - rotate: false - xy: 1893, 76 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 circle-shadow rotate: false - xy: 445, 681 + xy: 1620, 684 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 antumbra-outline rotate: false - xy: 227, 1557 + xy: 719, 143 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck0 rotate: false - xy: 227, 1315 + xy: 941, 385 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck1 rotate: false - xy: 227, 1073 + xy: 937, 143 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck2 rotate: false - xy: 227, 831 + xy: 1667, 1313 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 -arkyid-outline - rotate: false - xy: 1347, 458 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck0 - rotate: false - xy: 1477, 458 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck1 - rotate: false - xy: 1604, 856 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck2 - rotate: false - xy: 1734, 859 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-blast-drill-full - rotate: false - xy: 1840, 729 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-foundation-full - rotate: false - xy: 1737, 596 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-nucleus-full - rotate: false - xy: 1019, 986 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 block-exponential-reconstructor-full rotate: false - xy: 1, 1573 + xy: 1823, 1797 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 -block-impact-reactor-full +corvus-outline rotate: false - xy: 1737, 466 - size: 128, 128 - orig: 128, 128 + xy: 933, 1 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -block-meltdown-full +corvus-wreck0 rotate: false - xy: 1867, 599 - size: 128, 128 - orig: 128, 128 + xy: 993, 945 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-full +corvus-wreck1 rotate: false - xy: 1181, 986 - size: 160, 160 - orig: 160, 160 + xy: 985, 803 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -block-spectre-full +corvus-wreck2 rotate: false - xy: 1867, 469 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -bryde-outline - rotate: false - xy: 921, 526 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck0 - rotate: false - xy: 1063, 510 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck1 - rotate: false - xy: 1296, 718 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck2 - rotate: false - xy: 1438, 718 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -core-foundation-team-crux - rotate: false - xy: 1039, 380 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team-sharded - rotate: false - xy: 1169, 380 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-team-crux - rotate: false - xy: 399, 93 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team-sharded - rotate: false - xy: 561, 93 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-4-0 - rotate: false - xy: 777, 286 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-1 - rotate: false - xy: 907, 266 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-2 - rotate: false - xy: 1037, 250 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-3 - rotate: false - xy: 1167, 250 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-4 - rotate: false - xy: 723, 156 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-5 - rotate: false - xy: 723, 26 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-6 - rotate: false - xy: 853, 136 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-7 - rotate: false - xy: 853, 6 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-5-0 - rotate: false - xy: 1621, 1637 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-1 - rotate: false - xy: 1783, 1637 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-2 - rotate: false - xy: 1437, 1459 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-3 - rotate: false - xy: 1599, 1475 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-4 - rotate: false - xy: 1761, 1475 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-5 - rotate: false - xy: 1623, 1313 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-6 - rotate: false - xy: 1623, 1151 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-7 - rotate: false - xy: 1785, 1313 - 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: 661, 1479 + xy: 1367, 494 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-1 rotate: false - xy: 653, 1285 + xy: 1561, 490 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-2 rotate: false - xy: 653, 1091 + xy: 1755, 490 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-3 rotate: false - xy: 877, 1621 + xy: 1823, 693 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-4 rotate: false - xy: 1071, 1621 + xy: 1373, 296 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-5 rotate: false - xy: 1265, 1621 + xy: 1567, 296 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-6 rotate: false - xy: 855, 1427 + xy: 1761, 296 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-7 rotate: false - xy: 1049, 1427 + xy: 1373, 102 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-7-0 rotate: false - xy: 243, 1815 + xy: 1823, 1571 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-1 rotate: false - xy: 1, 1347 + xy: 807, 1539 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-2 rotate: false - xy: 469, 1815 + xy: 1033, 1539 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-3 rotate: false - xy: 1, 1121 + xy: 541, 1297 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-4 rotate: false - xy: 695, 1815 + xy: 541, 1071 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-5 rotate: false - xy: 1, 895 + xy: 1259, 1539 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-6 rotate: false - xy: 921, 1815 + xy: 1485, 1555 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-7 rotate: false - xy: 1, 669 + xy: 767, 1297 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 -meltdown +cracks-8-0 rotate: false - xy: 1503, 198 - size: 128, 128 - orig: 128, 128 + xy: 565, 1765 + size: 256, 256 + orig: 256, 256 offset: 0, 0 index: -1 -omura-cannon-outline +cracks-8-1 rotate: false - xy: 1429, 1148 - size: 192, 277 - orig: 192, 277 + xy: 1, 559 + size: 256, 256 + orig: 256, 256 offset: 0, 0 index: -1 -reign-leg +cracks-8-2 rotate: false - xy: 810, 688 - size: 152, 124 - orig: 152, 124 + 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: 227, 447 + xy: 1661, 1171 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 reign-wreck0 rotate: false - xy: 227, 305 + xy: 1441, 1033 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 reign-wreck1 rotate: false - xy: 445, 1673 + xy: 1657, 1029 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 reign-wreck2 rotate: false - xy: 445, 1531 + xy: 1219, 949 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 -scepter-leg +sei-outline rotate: false - xy: 1763, 206 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scepter-outline - rotate: false - xy: 443, 397 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck0 - rotate: false - xy: 443, 255 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck1 - rotate: false - xy: 227, 163 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -scepter-wreck2 - rotate: false - xy: 217, 21 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 1893, 206 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -toxopid-cannon-outline - rotate: false - xy: 445, 1087 - size: 206, 220 - orig: 206, 220 - offset: 0, 0 - index: -1 -toxopid-leg - rotate: false - xy: 1, 1 - size: 150, 72 - orig: 150, 72 - offset: 0, 0 - index: -1 -toxopid-outline - rotate: false - xy: 648, 895 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck0 - rotate: false - xy: 648, 703 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck1 - rotate: false - xy: 810, 814 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -toxopid-wreck2 - rotate: false - xy: 972, 794 - size: 160, 190 - orig: 160, 190 - offset: 0, 0 - index: -1 -unit-antumbra-full - rotate: false - xy: 227, 589 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -unit-bryde-full - rotate: false - xy: 1205, 510 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -unit-reign-full - rotate: false - xy: 661, 1673 - size: 214, 140 - orig: 214, 140 - offset: 0, 0 - index: -1 -unit-scepter-full - rotate: false - xy: 847, 1006 - size: 170, 140 - orig: 170, 140 - offset: 0, 0 - index: -1 -unit-sei-full - rotate: false - xy: 1, 1799 + xy: 283, 797 size: 240, 240 orig: 240, 240 offset: 0, 0 index: -1 -unit-toxopid-full +sei-wreck0 rotate: false - xy: 1134, 794 - size: 160, 190 - orig: 160, 190 + 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: 445, 884 + xy: 1417, 688 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 antumbra rotate: false - xy: 1599, 1799 + xy: 501, 163 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-cell rotate: false - xy: 1817, 1799 + xy: 723, 385 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 -arkyid +corvus rotate: false - xy: 1347, 588 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-cell - rotate: false - xy: 1477, 588 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -bryde - rotate: false - xy: 1118, 652 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-cell - rotate: false - xy: 779, 546 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -minke-cell - rotate: false - xy: 1633, 198 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -omura-cannon-heat - rotate: false - xy: 1041, 1148 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 -reign - rotate: false - xy: 1, 75 + xy: 501, 21 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 -reign-base +corvus-cell rotate: false - xy: 1296, 860 - size: 152, 124 - orig: 152, 124 + xy: 717, 1 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -reign-cell +corvus-weapon-heat rotate: false - xy: 1450, 860 - size: 152, 124 - orig: 152, 124 + xy: 1149, 1 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -scepter +quad rotate: false - xy: 445, 539 - size: 170, 140 - orig: 170, 140 + xy: 1219, 1091 + size: 220, 220 + orig: 220, 220 offset: 0, 0 index: -1 -scepter-base +quad-cell rotate: false - xy: 1633, 68 - size: 128, 128 - orig: 128, 128 + xy: 1445, 1317 + size: 220, 220 + orig: 220, 220 offset: 0, 0 index: -1 -scepter-cell +reign rotate: false - xy: 1817, 336 - size: 128, 128 - orig: 128, 128 + xy: 1445, 1175 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -toxopid +sei rotate: false - xy: 615, 327 - size: 160, 190 - orig: 160, 190 + 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: 445, 1309 + xy: 1159, 439 size: 206, 220 orig: 206, 220 offset: 0, 0 index: -1 -toxopid-cell - rotate: false - xy: 964, 668 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 omura-cannon rotate: false - xy: 847, 1148 - size: 192, 277 - orig: 192, 277 - offset: 0, 0 - index: -1 -omura-cannon-heat - rotate: false - xy: 1235, 1148 + xy: 1761, 17 size: 192, 277 orig: 192, 277 offset: 0, 0 @@ -1264,5950 +781,2128 @@ filter: nearest,nearest repeat: none launch-pad rotate: false - xy: 201, 843 + xy: 813, 99 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +launch-pad-large + rotate: false + xy: 725, 1041 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 launch-pad-light rotate: false - xy: 201, 745 + xy: 813, 1 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -launchpod - rotate: false - xy: 1099, 1547 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 force-projector rotate: false - xy: 507, 1751 + xy: 1527, 1221 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector-top rotate: false - xy: 507, 1653 + xy: 1625, 1193 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -mend-projector - rotate: false - xy: 1231, 1549 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mend-projector-top - rotate: false - xy: 1165, 1417 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mender - rotate: false - xy: 987, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mender-top - rotate: false - xy: 1021, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 overdrive-dome rotate: false - xy: 299, 857 + xy: 1589, 1095 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-top rotate: false - xy: 299, 759 + xy: 1687, 1095 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -overdrive-projector - rotate: false - xy: 1231, 1483 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overdrive-projector-top - rotate: false - xy: 1231, 1417 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shock-mine - rotate: false - xy: 1113, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-loader rotate: false - xy: 115, 1625 + xy: 1267, 529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader rotate: false - xy: 311, 1641 + xy: 1231, 235 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -bridge-arrow - rotate: false - xy: 973, 583 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor - rotate: false - xy: 1917, 1629 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-bridge - rotate: false - xy: 1951, 1655 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-end - rotate: false - xy: 1951, 1621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -center - rotate: false - xy: 1985, 1629 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-0 - rotate: false - xy: 851, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-full - rotate: false - xy: 851, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-1 - rotate: false - xy: 839, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-2 - rotate: false - xy: 841, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-3 - rotate: false - xy: 841, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-0 - rotate: false - xy: 841, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-1 - rotate: false - xy: 841, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-2 - rotate: false - xy: 841, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-3 - rotate: false - xy: 841, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-0 - rotate: false - xy: 841, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-1 - rotate: false - xy: 841, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-2 - rotate: false - xy: 841, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-3 - rotate: false - xy: 841, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-0 - rotate: false - xy: 841, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-1 - rotate: false - xy: 841, 181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-2 - rotate: false - xy: 837, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-3 - rotate: false - xy: 1038, 721 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-0 - rotate: false - xy: 1072, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-1 - rotate: false - xy: 1106, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-2 - rotate: false - xy: 1000, 683 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-3 - rotate: false - xy: 1801, 1531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-1 - rotate: false - xy: 1202, 873 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-2 - rotate: false - xy: 1202, 839 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-3 - rotate: false - xy: 1236, 873 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-0 - rotate: false - xy: 1202, 805 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-1 - rotate: false - xy: 1236, 839 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-2 - rotate: false - xy: 1270, 873 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-3 - rotate: false - xy: 1236, 805 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-0 - rotate: false - xy: 1270, 839 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-1 - rotate: false - xy: 1270, 805 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-2 - rotate: false - xy: 1202, 771 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-3 - rotate: false - xy: 1236, 771 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-0 - rotate: false - xy: 1270, 771 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-1 - rotate: false - xy: 1304, 873 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-2 - rotate: false - xy: 1304, 839 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-3-3 - rotate: false - xy: 1304, 805 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-0 - rotate: false - xy: 1304, 771 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-1 - rotate: false - xy: 875, 549 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-2 - rotate: false - xy: 875, 515 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-4-3 - rotate: false - xy: 875, 481 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor - rotate: false - xy: 1045, 517 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-0 - rotate: false - xy: 1045, 483 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-1 - rotate: false - xy: 1045, 449 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-2 - rotate: false - xy: 1045, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-edge - rotate: false - xy: 1045, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-conveyor-stack - rotate: false - xy: 1045, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-1 - rotate: false - xy: 1139, 75 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-2 - rotate: false - xy: 1157, 41 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-3 - rotate: false - xy: 1157, 7 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-0 - rotate: false - xy: 1147, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-1 - rotate: false - xy: 1143, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-2 - rotate: false - xy: 1143, 117 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-1-3 - rotate: false - xy: 1177, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-0 - rotate: false - xy: 1177, 117 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-1 - rotate: false - xy: 1173, 83 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-2 - rotate: false - xy: 1191, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-2-3 - rotate: false - xy: 1191, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-0 - rotate: false - xy: 1207, 83 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-1 - rotate: false - xy: 1225, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-2 - rotate: false - xy: 1225, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-3-3 - rotate: false - xy: 1267, 1318 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-0 - rotate: false - xy: 1267, 1284 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-1 - rotate: false - xy: 1267, 1250 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-2 - rotate: false - xy: 1267, 1216 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-4-3 - rotate: false - xy: 1267, 1182 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cross - rotate: false - xy: 909, 547 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -distributor - rotate: false - xy: 901, 1415 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -inverted-sorter - rotate: false - xy: 909, 207 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction - rotate: false - xy: 905, 139 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 mass-driver-base rotate: false - xy: 201, 157 + xy: 1009, 5 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -overflow-gate - rotate: false - xy: 1055, 5 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 payload-conveyor rotate: false - xy: 299, 661 + xy: 1785, 1095 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-edge rotate: false - xy: 299, 563 + xy: 1589, 997 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-top rotate: false - xy: 299, 465 + xy: 1687, 997 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-top rotate: false - xy: 299, 465 + xy: 1687, 997 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router rotate: false - xy: 299, 367 + xy: 1785, 997 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-edge rotate: false - xy: 299, 269 + xy: 1883, 1095 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-over rotate: false - xy: 299, 171 + xy: 1883, 997 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -phase-conveyor +blast-drill rotate: false - xy: 1015, 619 - size: 32, 32 - orig: 32, 32 + xy: 335, 1233 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -phase-conveyor-arrow +blast-drill-rim rotate: false - xy: 1049, 619 - size: 32, 32 - orig: 32, 32 + xy: 335, 1103 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -phase-conveyor-bridge +blast-drill-rotator rotate: false - xy: 1041, 585 - size: 32, 32 - orig: 32, 32 + xy: 465, 1233 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -phase-conveyor-end +blast-drill-top rotate: false - xy: 1083, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -router - rotate: false - xy: 1075, 109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sorter - rotate: false - xy: 1113, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -underflow-gate - rotate: false - xy: 1267, 1080 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -drill-top - rotate: false - xy: 967, 1415 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-liquid - rotate: false - xy: 967, 1415 - size: 64, 64 - orig: 64, 64 + xy: 335, 973 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 605, 1459 + xy: 1491, 1025 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 201, 1137 + xy: 813, 295 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 201, 1039 + xy: 911, 295 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 201, 941 + xy: 813, 197 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -mechanical-drill - rotate: false - xy: 1165, 1549 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-rotator - rotate: false - xy: 1231, 1615 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-top - rotate: false - xy: 1165, 1483 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 oil-extractor rotate: false - xy: 299, 1249 + xy: 1205, 137 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 299, 1151 + xy: 1205, 39 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 299, 1053 + xy: 1303, 137 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 299, 955 + xy: 1303, 39 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -pneumatic-drill - rotate: false - xy: 1363, 1654 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-rotator - rotate: false - xy: 1429, 1720 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-top - rotate: false - xy: 1297, 1522 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor - rotate: false - xy: 1759, 1739 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-liquid - rotate: false - xy: 1561, 1475 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-rotator - rotate: false - xy: 1627, 1541 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-top - rotate: false - xy: 1693, 1607 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border - rotate: false - xy: 1168, 893 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-middle - rotate: false - xy: 1165, 1347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-select - rotate: false - xy: 1233, 1281 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-liquid - rotate: false - xy: 1245, 941 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 place-arrow rotate: false - xy: 299, 73 + xy: 1919, 1193 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -bridge-conduit - rotate: false - xy: 1007, 583 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-arrow - rotate: false - xy: 1817, 1589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-arrow - rotate: false - xy: 1817, 1589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-bridge - rotate: false - xy: 901, 45 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-end - rotate: false - xy: 919, 11 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom - rotate: false - xy: 1233, 1009 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-0 - rotate: false - xy: 1197, 975 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-1 - rotate: false - xy: 1231, 975 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-2 - rotate: false - xy: 1211, 941 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-3 - rotate: false - xy: 1211, 941 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-4 - rotate: false - xy: 1211, 941 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-0 - rotate: false - xy: 1265, 975 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-1 - rotate: false - xy: 1279, 941 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-2 - rotate: false - xy: 1211, 907 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-3 - rotate: false - xy: 1245, 907 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-3 - rotate: false - xy: 1245, 907 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-4 - rotate: false - xy: 1279, 907 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-junction - rotate: false - xy: 939, 139 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate - rotate: false - xy: 973, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-overflow-gate-top - rotate: false - xy: 1007, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-bottom - rotate: false - xy: 973, 107 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-liquid - rotate: false - xy: 1007, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-top - rotate: false - xy: 1007, 107 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 liquid-tank-bottom rotate: false - xy: 201, 647 + xy: 911, 197 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 201, 549 + xy: 911, 99 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 201, 451 + xy: 911, 1 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -mechanical-pump - rotate: false - xy: 1037, 73 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-pump-liquid - rotate: false - xy: 953, 37 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump-liquid - rotate: false - xy: 953, 37 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thermal-pump-liquid - rotate: false - xy: 953, 37 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit - rotate: false - xy: 1071, 73 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-arrow - rotate: false - xy: 1089, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-bridge - rotate: false - xy: 1089, 5 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-end - rotate: false - xy: 1034, 653 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-cap - rotate: false - xy: 1045, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-0 - rotate: false - xy: 1045, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-1 - rotate: false - xy: 1045, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-2 - rotate: false - xy: 1075, 585 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-3 - rotate: false - xy: 1079, 551 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plated-conduit-top-4 - rotate: false - xy: 1079, 517 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-0 - rotate: false - xy: 1079, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-1 - rotate: false - xy: 1079, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-2 - rotate: false - xy: 1079, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-4 - rotate: false - xy: 1079, 279 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump - rotate: false - xy: 1429, 1588 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 thermal-pump rotate: false - xy: 397, 513 + xy: 1365, 847 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hyper-processor rotate: false - xy: 605, 1751 + xy: 1491, 1123 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-display rotate: false - xy: 201, 353 + xy: 1009, 201 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -logic-processor - rotate: false - xy: 1099, 1481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -memory-cell - rotate: false - xy: 987, 37 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message - rotate: false - xy: 1021, 5 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -micro-processor - rotate: false - xy: 1055, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch - rotate: false - xy: 1105, 75 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -switch-on - rotate: false - xy: 1123, 41 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery - rotate: false - xy: 1126, 763 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 battery-large rotate: false - xy: 1171, 1951 + xy: 1169, 921 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-large-top rotate: false - xy: 1269, 1951 + xy: 1169, 823 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -battery-top - rotate: false - xy: 1140, 729 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator - rotate: false - xy: 1985, 1595 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator-top - rotate: false - xy: 1199, 1009 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 differential-generator rotate: false - xy: 103, 351 + xy: 1445, 1319 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 103, 253 + xy: 1543, 1319 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 103, 155 + xy: 1641, 1389 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -diode +impact-reactor rotate: false - xy: 909, 513 - size: 32, 32 - orig: 32, 32 + xy: 595, 583 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -diode-arrow +impact-reactor-bottom rotate: false - xy: 909, 479 - size: 32, 32 - orig: 32, 32 + xy: 595, 453 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -illuminator +impact-reactor-light rotate: false - xy: 909, 309 - size: 32, 32 - orig: 32, 32 + xy: 585, 323 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -illuminator-top +impact-reactor-plasma-0 rotate: false - xy: 909, 275 - size: 32, 32 - orig: 32, 32 + xy: 585, 193 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -power-node +impact-reactor-plasma-1 rotate: false - xy: 1079, 483 - size: 32, 32 - orig: 32, 32 + xy: 585, 63 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -power-node-large +impact-reactor-plasma-2 rotate: false - xy: 1363, 1588 - size: 64, 64 - orig: 64, 64 + xy: 725, 1301 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -power-source +impact-reactor-plasma-3 rotate: false - xy: 1079, 449 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void - rotate: false - xy: 1079, 415 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator - rotate: false - xy: 1495, 1654 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rtg-generator-top - rotate: false - xy: 1109, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel - rotate: false - xy: 1113, 249 - size: 32, 32 - orig: 32, 32 + xy: 725, 1171 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 397, 611 + xy: 1883, 899 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -steam-generator - rotate: false - xy: 667, 93 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-cap - rotate: false - xy: 651, 23 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-top - rotate: false - xy: 717, 27 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine0 - rotate: false - xy: 1561, 1739 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -steam-generator-turbine1 - rotate: false - xy: 1561, 1673 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-tower - rotate: false - xy: 1627, 1739 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-generator - rotate: false - xy: 1693, 1739 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 thorium-reactor rotate: false - xy: 397, 415 + xy: 1365, 749 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 397, 317 + xy: 1365, 651 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-top rotate: false - xy: 397, 219 + xy: 1365, 553 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter rotate: false - xy: 975, 1951 + xy: 1071, 725 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 1073, 1951 + xy: 1071, 627 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -blast-mixer - rotate: false - xy: 1683, 1805 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 block-forge rotate: false - xy: 1857, 1951 + xy: 1267, 725 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -coal-centrifuge - rotate: false - xy: 835, 1679 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-bottom - rotate: false - xy: 967, 1613 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-liquid - rotate: false - xy: 1033, 1679 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-top - rotate: false - xy: 835, 1415 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator - rotate: false - xy: 901, 1481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-middle - rotate: false - xy: 967, 1547 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-top - rotate: false - xy: 1033, 1613 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 disassembler rotate: false - xy: 103, 57 + xy: 1739, 1389 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-liquid rotate: false - xy: 409, 1787 + xy: 1837, 1389 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-spinner rotate: false - xy: 409, 1689 + xy: 1641, 1291 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -graphite-press - rotate: false - xy: 1033, 1415 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -incinerator - rotate: false - xy: 909, 241 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source - rotate: false - xy: 1011, 481 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void - rotate: false - xy: 905, 173 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln - rotate: false - xy: 1099, 1811 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln-top - rotate: false - xy: 1099, 1745 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter-top - rotate: false - xy: 1099, 1745 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -liquid-source - rotate: false - xy: 1041, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-void - rotate: false - xy: 1041, 107 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -melter - rotate: false - xy: 953, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 multi-press rotate: false - xy: 201, 59 + xy: 1107, 137 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -phase-weaver - rotate: false - xy: 1297, 1720 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-bottom - rotate: false - xy: 1429, 1786 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-weave - rotate: false - xy: 1297, 1654 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor - rotate: false - xy: 1363, 1720 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor-top - rotate: false - xy: 1495, 1786 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulverizer - rotate: false - xy: 1079, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-rotator - rotate: false - xy: 1079, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer - rotate: false - xy: 1495, 1720 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator - rotate: false - xy: 676, 753 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-liquid - rotate: false - xy: 673, 687 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-spinner - rotate: false - xy: 673, 621 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 silicon-crucible rotate: false - xy: 397, 807 + xy: 1687, 899 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-crucible-top rotate: false - xy: 397, 709 + xy: 1785, 899 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -silicon-smelter +core-foundation rotate: false - xy: 667, 555 - size: 64, 64 - orig: 64, 64 + xy: 465, 583 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -spore-press +core-foundation-team rotate: false - xy: 667, 489 - size: 64, 64 - orig: 64, 64 + xy: 335, 453 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -spore-press-frame0 +core-nucleus rotate: false - xy: 667, 423 - size: 64, 64 - orig: 64, 64 + xy: 1, 11 + size: 160, 160 + orig: 160, 160 offset: 0, 0 index: -1 -spore-press-frame1 +core-nucleus-team rotate: false - xy: 667, 357 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame2 - rotate: false - xy: 667, 291 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-liquid - rotate: false - xy: 667, 225 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-top - rotate: false - xy: 667, 159 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -boulder1 - rotate: false - xy: 865, 1315 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -boulder2 - rotate: false - xy: 815, 1215 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder1 - rotate: false - xy: 965, 1215 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dacite-boulder2 - rotate: false - xy: 1015, 1265 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sand-boulder1 - rotate: false - xy: 1143, 593 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-boulder2 - rotate: false - xy: 1113, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder1 - rotate: false - xy: 1113, 351 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder2 - rotate: false - xy: 1113, 317 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-boulder1 - rotate: false - xy: 908, 807 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-boulder2 - rotate: false - xy: 958, 807 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-cluster1 - rotate: false - xy: 1050, 797 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster2 - rotate: false - xy: 1092, 797 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster3 - rotate: false - xy: 1008, 755 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -container - rotate: false - xy: 1033, 1811 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-team - rotate: false - xy: 769, 1547 - size: 64, 64 - orig: 64, 64 + xy: 1421, 1887 + size: 160, 160 + orig: 160, 160 offset: 0, 0 index: -1 core-shard rotate: false - xy: 115, 1429 + xy: 1331, 1141 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team rotate: false - xy: 213, 1445 + xy: 1295, 1039 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -unloader - rotate: false - xy: 1267, 1046 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-center - rotate: false - xy: 1267, 1012 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 vault rotate: false - xy: 397, 121 + xy: 1463, 535 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 vault-team rotate: false - xy: 507, 1359 + xy: 1561, 801 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -arc-heat - rotate: false - xy: 817, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-1 - rotate: false - xy: 1134, 889 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-2 - rotate: false - xy: 1749, 1805 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 block-3 rotate: false - xy: 1367, 1951 + xy: 1169, 725 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -hail-heat +block-4 rotate: false - xy: 1561, 1810 - size: 40, 40 - orig: 40, 40 + xy: 465, 1103 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -lancer-heat +foreshadow-heat rotate: false - xy: 1099, 1613 - size: 64, 64 - orig: 64, 64 + 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: 397, 1199 + xy: 1401, 39 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -salvo-heat +tsunami-liquid rotate: false - xy: 1429, 1522 - size: 64, 64 - orig: 64, 64 + xy: 1463, 731 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 -salvo-panel-left +tsunami-top rotate: false - xy: 1495, 1588 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-right - rotate: false - xy: 1429, 1456 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch-heat - rotate: false - xy: 1113, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -wave-liquid - rotate: false - xy: 1825, 1739 - size: 64, 64 - orig: 64, 64 + xy: 1463, 633 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 additive-reconstructor rotate: false - xy: 681, 1951 + xy: 1099, 1019 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 additive-reconstructor-top rotate: false - xy: 779, 1951 + xy: 1071, 921 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory rotate: false - xy: 877, 1951 + xy: 1071, 823 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -command-center - rotate: false - xy: 901, 1745 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 factory-in-3 rotate: false - xy: 409, 1591 + 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: 409, 1493 + 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: 409, 1395 + xy: 1429, 1221 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ground-factory rotate: false - xy: 507, 1457 + 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: 299, 1347 + xy: 1107, 39 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -rally-point +scrap-wall-gigantic rotate: false - xy: 1297, 1456 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -repair-point-base - rotate: false - xy: 1075, 143 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -resupply-point - rotate: false - xy: 1363, 1522 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -copper-wall - rotate: false - xy: 875, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large - rotate: false - xy: 967, 1745 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door - rotate: false - xy: 909, 445 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large - rotate: false - xy: 967, 1481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large-open - rotate: false - xy: 1033, 1547 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-open - rotate: false - xy: 909, 411 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall - rotate: false - xy: 1045, 551 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large - rotate: false - xy: 1363, 1786 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-wall - rotate: false - xy: 1045, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-wall-large - rotate: false - xy: 1297, 1588 - size: 64, 64 - orig: 64, 64 + xy: 985, 1313 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge2 rotate: false - xy: 397, 1003 + xy: 1491, 927 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 397, 905 + xy: 1589, 899 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -scrap-wall-large1 +thruster rotate: false - xy: 1495, 1456 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large2 - rotate: false - xy: 1297, 1390 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large3 - rotate: false - xy: 1363, 1390 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large4 - rotate: false - xy: 1429, 1390 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall2 - rotate: false - xy: 1113, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall3 - rotate: false - xy: 1113, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall4 - rotate: false - xy: 1113, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall5 - rotate: false - xy: 1113, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall - rotate: false - xy: 1109, 109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large - rotate: false - xy: 1561, 1607 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-wall - rotate: false - xy: 1123, 7 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large - rotate: false - xy: 1561, 1541 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -titanium-wall - rotate: false - xy: 1267, 1148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large - rotate: false - xy: 1627, 1607 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bullet - rotate: false - xy: 733, 151 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -bullet-back - rotate: false - xy: 733, 97 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -casing - rotate: false - xy: 191, 39 - size: 8, 16 - orig: 8, 16 + xy: 985, 1183 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 circle-end rotate: false - xy: 1, 1262 + xy: 969, 852 size: 100, 199 orig: 100, 199 offset: 0, 0 index: -1 -circle-mid +large-bomb rotate: false - xy: 1301, 1151 - size: 1, 199 - orig: 1, 199 + xy: 1245, 1341 + size: 100, 100 + orig: 100, 100 offset: 0, 0 index: -1 -error +large-bomb-back rotate: false - xy: 765, 1161 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -laser - rotate: false - xy: 585, 672 - size: 4, 48 - orig: 4, 48 + xy: 855, 495 + size: 100, 100 + orig: 100, 100 offset: 0, 0 index: -1 laser-end rotate: false - xy: 817, 1877 + xy: 1945, 1543 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -minelaser - rotate: false - xy: 1687, 1491 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 minelaser-end rotate: false - xy: 891, 1877 + xy: 1951, 325 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -missile - rotate: false - xy: 1050, 759 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -missile-back - rotate: false - xy: 1088, 759 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -parallax-laser - rotate: false - xy: 1753, 1557 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 parallax-laser-end rotate: false - xy: 965, 1877 + xy: 1609, 303 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -particle - rotate: false - xy: 1092, 839 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -scale_marker - rotate: false - xy: 1955, 1951 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -shell - rotate: false - xy: 1000, 717 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -shell-back - rotate: false - xy: 1139, 927 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -transfer - rotate: false - xy: 1819, 1623 - size: 4, 48 - orig: 4, 48 - offset: 0, 0 - index: -1 -transfer-arrow - rotate: false - xy: 1267, 1114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -white - rotate: false - xy: 676, 1082 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -alpha-outline - rotate: false - xy: 763, 1361 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck0 - rotate: false - xy: 765, 1311 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck1 - rotate: false - xy: 765, 1261 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck2 - rotate: false - xy: 765, 1211 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -arc - rotate: false - xy: 783, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 arkyid-foot rotate: false - xy: 299, 1 + xy: 1757, 319 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-joint-base rotate: false - xy: 1113, 1879 + xy: 1829, 319 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 -arkyid-leg - rotate: false - xy: 201, 1 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 arkyid-leg-base rotate: false - xy: 473, 1983 + xy: 725, 455 size: 104, 64 orig: 104, 64 offset: 0, 0 index: -1 +arkyid-outline + rotate: false + 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: 1257, 1879 + xy: 1755, 247 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 -artillery-outline - rotate: false - xy: 1684, 1375 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -atrax-foot - rotate: false - xy: 2007, 1705 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -atrax-joint - rotate: false - xy: 837, 119 - size: 26, 26 - orig: 26, 26 - offset: 0, 0 - index: -1 -atrax-leg - rotate: false - xy: 259, 31 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -atrax-leg-base - rotate: false - xy: 2009, 1777 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 atrax-outline rotate: false - xy: 495, 590 + xy: 1519, 245 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck0 rotate: false - xy: 495, 524 + xy: 1499, 179 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck1 rotate: false - xy: 495, 458 + xy: 1499, 113 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck2 rotate: false - xy: 495, 392 + xy: 1499, 47 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 beam-weapon-outline rotate: false - xy: 569, 1 + xy: 1827, 555 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -beta-outline - rotate: false - xy: 913, 1365 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck0 - rotate: false - xy: 963, 1365 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 1013, 1365 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 1063, 1365 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 block-additive-reconstructor-full rotate: false - xy: 1465, 1951 + xy: 1169, 627 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-air-factory-full rotate: false - xy: 1563, 1951 + xy: 1197, 1019 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-arc-full +block-blast-drill-full rotate: false - xy: 1134, 855 - size: 32, 32 - orig: 32, 32 + xy: 335, 843 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -block-basalt-full +block-core-foundation-full rotate: false - xy: 1134, 821 - size: 32, 32 - orig: 32, 32 + xy: 465, 973 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -block-boulder-full +block-core-nucleus-full rotate: false - xy: 1113, 1365 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-full - rotate: false - xy: 1168, 859 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 1168, 825 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-full - rotate: false - xy: 1815, 1805 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 867, 43 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 867, 43 - size: 32, 32 - orig: 32, 32 + xy: 1, 335 + size: 160, 160 + orig: 160, 160 offset: 0, 0 index: -1 block-core-shard-full rotate: false - xy: 1661, 1951 + xy: 1267, 921 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-craters-full - rotate: false - xy: 885, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-full - rotate: false - xy: 1881, 1805 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cultivator-full - rotate: false - xy: 703, 1807 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 block-cyclone-full rotate: false - xy: 1759, 1951 + xy: 1267, 823 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-dacite-boulder-full +block-foreshadow-full rotate: false - xy: 815, 1315 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dacite-full - rotate: false - xy: 1038, 687 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dacite-wall-full - rotate: false - xy: 1072, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-full - rotate: false - xy: 1106, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 1140, 695 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-full - rotate: false - xy: 1168, 791 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dirt-wall-full - rotate: false - xy: 871, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dune-wall-full - rotate: false - xy: 871, 113 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 871, 79 - size: 32, 32 - orig: 32, 32 + xy: 335, 713 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 block-fuse-full rotate: false - xy: 473, 1885 + xy: 1267, 627 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-grass-full - rotate: false - xy: 1072, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-ground-factory-full rotate: false - xy: 571, 1849 + xy: 1035, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-hail-full +block-impact-reactor-full rotate: false - xy: 1106, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 1140, 661 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 1140, 627 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 1885, 1663 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-wall-full - rotate: false - xy: 1883, 1629 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-full - rotate: false - xy: 703, 1741 - size: 64, 64 - orig: 64, 64 + xy: 465, 843 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 block-laser-drill-full rotate: false - xy: 115, 1821 + xy: 1071, 529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-liquid-router-full - rotate: false - xy: 1163, 1381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-liquid-tank-full rotate: false - xy: 115, 1723 + xy: 1169, 529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-magmarock-full - rotate: false - xy: 1197, 1383 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-mass-driver-full rotate: false - xy: 115, 1527 + xy: 1133, 431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-mechanical-drill-full +block-meltdown-full rotate: false - xy: 703, 1675 - size: 64, 64 - orig: 64, 64 + xy: 335, 583 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -block-metal-floor-damaged-full +block-multiplicative-reconstructor-full rotate: false - xy: 1231, 1383 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 1165, 1313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mud-full - rotate: false - xy: 1165, 1279 - size: 32, 32 - orig: 32, 32 + xy: 1, 173 + size: 160, 160 + orig: 160, 160 offset: 0, 0 index: -1 block-naval-factory-full rotate: false - xy: 213, 1837 + xy: 1231, 431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-oil-extractor-full rotate: false - xy: 311, 1837 + xy: 1329, 431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-ore-coal-full - rotate: false - xy: 1165, 1245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 1165, 1211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 1165, 1177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 1165, 1143 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 1165, 1109 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 1165, 1075 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-full - rotate: false - xy: 703, 1609 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 block-payload-conveyor-full rotate: false - xy: 213, 1739 + xy: 1133, 333 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-icon rotate: false - xy: 213, 1739 + xy: 1133, 333 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-payload-router-full rotate: false - xy: 213, 1641 + xy: 1231, 333 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon rotate: false - xy: 213, 1641 + xy: 1231, 333 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-pebbles-full - rotate: false - xy: 1199, 1349 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-full - rotate: false - xy: 703, 1543 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-plated-conduit-full - rotate: false - xy: 1199, 1315 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-full - rotate: false - xy: 703, 1477 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pulse-conduit-full - rotate: false - xy: 1199, 1281 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 1199, 1247 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 1199, 1213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-ripple-full rotate: false - xy: 311, 1739 + xy: 1329, 333 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-salt-wall-full - rotate: false - xy: 1199, 1179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-full - rotate: false - xy: 703, 1411 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sand-boulder-full - rotate: false - xy: 1199, 1145 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 1199, 1111 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-full - rotate: false - xy: 1199, 1077 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-full - rotate: false - xy: 769, 1811 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scorch-full - rotate: false - xy: 1233, 1349 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 1233, 1315 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 1233, 1315 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-scrap-wall-huge-full rotate: false - xy: 213, 1543 + xy: 1035, 299 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge1 rotate: false - xy: 213, 1543 + xy: 1035, 299 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-scrap-wall-large-full +block-spectre-full rotate: false - xy: 835, 1811 - size: 64, 64 - orig: 64, 64 + xy: 465, 713 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -block-segment-full +block-tsunami-full rotate: false - xy: 769, 1745 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-shale-boulder-full - rotate: false - xy: 1233, 1247 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 1233, 1213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-full - rotate: false - xy: 1233, 1179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 1233, 1145 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-full - rotate: false - xy: 815, 1265 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 1233, 1111 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-full - rotate: false - xy: 1233, 1077 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-full - rotate: false - xy: 2007, 1663 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 1165, 1041 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-full - rotate: false - xy: 901, 1811 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-spore-wall-full - rotate: false - xy: 1199, 1043 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-steam-generator-full - rotate: false - xy: 769, 1679 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 1233, 1043 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-full - rotate: false - xy: 1163, 1007 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-full - rotate: false - xy: 835, 1745 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 1163, 973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-full - rotate: false - xy: 1177, 939 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 1177, 939 - size: 32, 32 - orig: 32, 32 + xy: 1133, 235 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 block-vault-full rotate: false - xy: 311, 1543 + xy: 1329, 235 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-water-extractor-full +bryde-outline rotate: false - xy: 967, 1811 - size: 64, 64 - orig: 64, 64 + xy: 675, 1573 + size: 140, 140 + orig: 140, 140 offset: 0, 0 index: -1 -block-wave-full +bryde-wreck0 rotate: false - xy: 769, 1613 - size: 64, 64 - orig: 64, 64 + xy: 817, 1573 + size: 140, 140 + orig: 140, 140 offset: 0, 0 index: -1 -container-team-crux +bryde-wreck1 rotate: false - xy: 835, 1613 - size: 64, 64 - orig: 64, 64 + xy: 959, 1573 + size: 140, 140 + orig: 140, 140 offset: 0, 0 index: -1 -container-team-sharded +bryde-wreck2 rotate: false - xy: 901, 1679 - size: 64, 64 - orig: 64, 64 + 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: 311, 1445 + xy: 1393, 1043 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team-sharded rotate: false - xy: 103, 1331 + xy: 1357, 1515 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cracks-1-0 +corvus-foot rotate: false - xy: 875, 413 - size: 32, 32 - orig: 32, 32 + xy: 1427, 289 + size: 90, 90 + orig: 90, 90 offset: 0, 0 index: -1 -cracks-1-1 +corvus-joint-base rotate: false - xy: 875, 379 - size: 32, 32 - orig: 32, 32 + xy: 1827, 247 + size: 70, 70 + orig: 70, 70 offset: 0, 0 index: -1 -cracks-1-2 +toxopid-joint-base rotate: false - xy: 875, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-3 - rotate: false - xy: 875, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-4 - rotate: false - xy: 875, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-5 - rotate: false - xy: 875, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-6 - rotate: false - xy: 875, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-7 - rotate: false - xy: 909, 581 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 769, 1481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-1 - rotate: false - xy: 835, 1547 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-2 - rotate: false - xy: 901, 1613 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-3 - rotate: false - xy: 967, 1679 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-4 - rotate: false - xy: 1033, 1745 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-5 - rotate: false - xy: 769, 1415 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-6 - rotate: false - xy: 835, 1481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-7 - rotate: false - xy: 901, 1547 - size: 64, 64 - orig: 64, 64 + xy: 1827, 247 + size: 70, 70 + orig: 70, 70 offset: 0, 0 index: -1 cracks-3-0 rotate: false - xy: 103, 1233 + xy: 1455, 1515 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-1 rotate: false - xy: 103, 1135 + xy: 1553, 1515 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-2 rotate: false - xy: 103, 1037 + xy: 1651, 1487 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-3 rotate: false - xy: 103, 939 + xy: 1749, 1487 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-4 rotate: false - xy: 103, 841 + xy: 1847, 1487 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-5 rotate: false - xy: 103, 743 + xy: 1347, 1417 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-6 rotate: false - xy: 103, 645 + xy: 1347, 1319 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-7 rotate: false - xy: 103, 547 + xy: 1445, 1417 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -crawler-leg +cracks-4-0 rotate: false - xy: 915, 1265 - size: 48, 48 - orig: 48, 48 + xy: 325, 193 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -crawler-outline +cracks-4-1 rotate: false - xy: 965, 1315 - size: 48, 48 - orig: 48, 48 + xy: 455, 323 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -crawler-wreck0 +cracks-4-2 rotate: false - xy: 915, 1215 - size: 48, 48 - orig: 48, 48 + xy: 325, 63 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -crawler-wreck1 +cracks-4-3 rotate: false - xy: 965, 1265 - size: 48, 48 - orig: 48, 48 + xy: 455, 193 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -crawler-wreck2 +cracks-4-4 rotate: false - xy: 1015, 1315 - size: 48, 48 - orig: 48, 48 + 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: 103, 449 + xy: 1543, 1417 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dagger-leg +foreshadow rotate: false - xy: 1065, 1265 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-outline - rotate: false - xy: 1065, 1215 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck0 - rotate: false - xy: 1115, 1315 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck1 - rotate: false - xy: 1115, 1265 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 1115, 1215 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -duo - rotate: false - xy: 909, 377 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -eruption-outline - rotate: false - xy: 815, 1157 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flamethrower-outline - rotate: false - xy: 965, 1157 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flare-outline - rotate: false - xy: 1065, 1165 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 1115, 1165 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 865, 1115 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 915, 1107 - size: 48, 48 - orig: 48, 48 + xy: 595, 843 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 591, 745 + xy: 325, 1 size: 80, 60 orig: 80, 60 offset: 0, 0 index: -1 fortress-outline rotate: false - xy: 1, 1016 + xy: 969, 606 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck0 rotate: false - xy: 1, 934 + xy: 1357, 1613 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck1 rotate: false - xy: 1, 852 + xy: 1459, 1613 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck2 rotate: false - xy: 1, 770 + xy: 1561, 1613 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fuse rotate: false - xy: 507, 1555 + xy: 1723, 1193 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 gamma-outline rotate: false - xy: 1627, 1433 - size: 56, 56 - orig: 56, 56 + xy: 1967, 105 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 gamma-wreck0 rotate: false - xy: 1626, 1375 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 1693, 1499 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 1759, 1565 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -hail - rotate: false - xy: 909, 343 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -heal-shotgun-weapon-outline - rotate: false - xy: 1015, 1115 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount-outline - rotate: false - xy: 1735, 1449 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-outline - rotate: false - xy: 1735, 1399 - size: 48, 48 - orig: 48, 48 + xy: 1967, 35 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 horizon-outline rotate: false - xy: 676, 893 + xy: 1837, 1687 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck0 rotate: false - xy: 676, 819 + xy: 1911, 1691 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck1 rotate: false - xy: 669, 1873 + xy: 1867, 1613 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck2 rotate: false - xy: 743, 1877 + xy: 1941, 1617 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -item-blast-compound-large - rotate: false - xy: 797, 589 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-medium - rotate: false - xy: 977, 549 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-blast-compound-small - rotate: false - xy: 371, 47 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-blast-compound-tiny - rotate: false - xy: 935, 53 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 1734, 1349 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 847, 623 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-medium - rotate: false - xy: 977, 515 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-small - rotate: false - xy: 905, 79 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-coal-tiny - rotate: false - xy: 669, 1855 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 1727, 1299 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 889, 615 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-medium - rotate: false - xy: 977, 481 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-small - rotate: false - xy: 371, 21 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-copper-tiny - rotate: false - xy: 1134, 803 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 1015, 1065 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 787, 77 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-medium - rotate: false - xy: 977, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-small - rotate: false - xy: 717, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-graphite-tiny - rotate: false - xy: 1817, 1571 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 1065, 1065 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 783, 35 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-medium - rotate: false - xy: 977, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-small - rotate: false - xy: 743, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-lead-tiny - rotate: false - xy: 1985, 1671 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 1115, 1065 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 931, 615 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-medium - rotate: false - xy: 977, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-small - rotate: false - xy: 1297, 1853 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-metaglass-tiny - rotate: false - xy: 1117, 639 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 1777, 1299 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 973, 617 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-medium - rotate: false - xy: 977, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-small - rotate: false - xy: 1947, 1845 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-phase-fabric-tiny - rotate: false - xy: 371, 3 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 1784, 1349 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 1785, 1457 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-medium - rotate: false - xy: 977, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-small - rotate: false - xy: 259, 5 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-plastanium-tiny - rotate: false - xy: 651, 5 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 1827, 1299 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 1785, 1415 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-medium - rotate: false - xy: 977, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-small - rotate: false - xy: 2009, 1751 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-pyratite-tiny - rotate: false - xy: 1929, 1611 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 791, 537 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 829, 77 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-medium - rotate: false - xy: 977, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-small - rotate: false - xy: 1801, 1505 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-sand-tiny - rotate: false - xy: 669, 5 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 791, 487 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 825, 35 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-medium - rotate: false - xy: 977, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-small - rotate: false - xy: 1265, 1391 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-scrap-tiny - rotate: false - xy: 687, 5 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 791, 437 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 1013, 923 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-medium - rotate: false - xy: 1011, 515 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-small - rotate: false - xy: 1919, 1671 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-silicon-tiny - rotate: false - xy: 1835, 1571 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 791, 387 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 1055, 923 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-medium - rotate: false - xy: 1011, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-small - rotate: false - xy: 2019, 1637 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-spore-pod-tiny - rotate: false - xy: 998, 665 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 791, 337 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 1097, 923 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-medium - rotate: false - xy: 1011, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-small - rotate: false - xy: 943, 589 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-surge-alloy-tiny - rotate: false - xy: 1016, 665 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 791, 287 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 1008, 881 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-medium - rotate: false - xy: 1011, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-small - rotate: false - xy: 875, 183 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-thorium-tiny - rotate: false - xy: 2019, 1593 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 791, 237 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 1050, 881 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-medium - rotate: false - xy: 1011, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-small - rotate: false - xy: 1947, 1819 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-titanium-tiny - rotate: false - xy: 1835, 1553 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-titanium-xlarge - rotate: false - xy: 791, 187 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 1099, 1679 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -large-artillery-outline - rotate: false - xy: 813, 1089 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 large-bullet-mount-outline rotate: false - xy: 1401, 1852 + xy: 1679, 55 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount-outline rotate: false - xy: 201, 1235 + xy: 715, 65 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 large-purple-mount-outline rotate: false - xy: 1545, 1852 + xy: 1823, 148 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 -large-weapon-outline - rotate: false - xy: 863, 1065 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-cryofluid-large - rotate: false - xy: 1008, 839 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-medium - rotate: false - xy: 939, 173 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-small - rotate: false - xy: 2019, 1611 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-cryofluid-tiny - rotate: false - xy: 1835, 1535 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 813, 989 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 1092, 881 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-medium - rotate: false - xy: 973, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-small - rotate: false - xy: 1851, 1605 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-oil-tiny - rotate: false - xy: 1160, 773 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 863, 1015 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 1050, 839 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-medium - rotate: false - xy: 1041, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-small - rotate: false - xy: 1877, 1603 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-slag-tiny - rotate: false - xy: 1178, 773 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 913, 1057 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 1008, 797 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-medium - rotate: false - xy: 1003, 73 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-small - rotate: false - xy: 1903, 1603 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-water-tiny - rotate: false - xy: 1267, 1373 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 963, 1057 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mace-leg - rotate: false - xy: 1165, 1747 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-outline - rotate: false - xy: 1165, 1681 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck0 - rotate: false - xy: 1231, 1747 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck1 - rotate: false - xy: 1165, 1615 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck2 - rotate: false - xy: 1231, 1681 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 mass-driver rotate: false - xy: 201, 255 + xy: 1009, 103 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mega-outline rotate: false - xy: 1, 464 + xy: 1245, 1239 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck0 rotate: false - xy: 1, 362 + xy: 1229, 1137 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck1 rotate: false - xy: 1, 260 + xy: 831, 393 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck2 rotate: false - xy: 1, 158 + 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: 495, 186 + xy: 1589, 142 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 minke-wreck0 rotate: false - xy: 495, 83 + xy: 1589, 39 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 minke-wreck1 rotate: false - xy: 397, 18 + xy: 1935, 1384 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 minke-wreck2 rotate: false - xy: 593, 1256 + xy: 1757, 719 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 -missiles-mount-outline +omura-cannon-outline rotate: false - xy: 808, 839 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-outline - rotate: false - xy: 1013, 1015 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck0 - rotate: false - xy: 1063, 1015 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 1113, 1015 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 863, 965 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon-outline - rotate: false - xy: 858, 865 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon-outline - rotate: false - xy: 963, 957 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-leg - rotate: false - xy: 1063, 965 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-outline - rotate: false - xy: 1949, 1689 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 1619, 1317 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 755, 1057 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 755, 999 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -parallax - rotate: false - xy: 1297, 1786 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -poly-outline - rotate: false - xy: 750, 825 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck0 - rotate: false - xy: 742, 761 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 742, 703 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 739, 645 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-leg - rotate: false - xy: 1429, 1654 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pulsar-outline - rotate: false - xy: 1627, 1491 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 1693, 1557 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 1759, 1623 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 1825, 1689 - size: 58, 48 - orig: 58, 48 + xy: 195, 1770 + size: 192, 277 + orig: 192, 277 offset: 0, 0 index: -1 quasar-leg rotate: false - xy: 585, 417 + xy: 1937, 735 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-outline rotate: false - xy: 585, 335 + xy: 1705, 481 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck0 rotate: false - xy: 585, 253 + xy: 1705, 399 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck1 rotate: false - xy: 585, 171 + xy: 1787, 473 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck2 rotate: false - xy: 585, 89 + 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: 591, 807 + xy: 1742, 579 size: 83, 138 orig: 83, 138 offset: 0, 0 index: -1 -repair-point - rotate: false - xy: 1075, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 ripple rotate: false - xy: 397, 1297 + xy: 1401, 137 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 risso-outline rotate: false - xy: 1689, 1871 + xy: 1823, 68 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 risso-wreck0 rotate: false - xy: 1761, 1871 + xy: 1895, 167 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 risso-wreck1 rotate: false - xy: 1833, 1871 + xy: 1895, 87 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 risso-wreck2 rotate: false - xy: 1905, 1871 + xy: 1895, 7 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 -salvo +scepter-leg rotate: false - xy: 1363, 1456 - size: 64, 64 - orig: 64, 64 + xy: 855, 1183 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -scatter +vela-leg rotate: false - xy: 1495, 1522 - size: 64, 64 - orig: 64, 64 + xy: 855, 1183 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -scepter-weapon-outline +scepter-outline rotate: false - xy: 733, 379 - size: 56, 102 - orig: 56, 102 + xy: 195, 1628 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 -scorch +scepter-wreck0 rotate: false - xy: 1113, 521 - size: 32, 32 - orig: 32, 32 + xy: 389, 1907 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 -segment +scepter-wreck1 rotate: false - xy: 1495, 1390 - size: 64, 64 - orig: 64, 64 + 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: 683, 1197 + xy: 1869, 391 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -small-basic-weapon-outline +spectre rotate: false - xy: 958, 907 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon-outline - rotate: false - xy: 958, 857 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-foot - rotate: false - xy: 950, 659 - size: 46, 46 - orig: 46, 46 - offset: 0, 0 - index: -1 -spiroct-joint - rotate: false - xy: 1147, 559 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spiroct-leg - rotate: false - xy: 507, 1849 - size: 48, 34 - orig: 48, 34 - offset: 0, 0 - index: -1 -spiroct-leg-base - rotate: false - xy: 763, 1125 - size: 48, 34 - orig: 48, 34 + xy: 855, 1053 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 spiroct-outline rotate: false - xy: 495, 1030 + xy: 1757, 822 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 -spiroct-weapon-outline - rotate: false - xy: 808, 781 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 spiroct-wreck0 rotate: false - xy: 495, 953 + xy: 1561, 549 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-wreck1 rotate: false - xy: 495, 876 + xy: 1853, 822 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-wreck2 rotate: false - xy: 495, 799 + xy: 1427, 458 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 -splash-0 - rotate: false - xy: 1147, 525 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-1 - rotate: false - xy: 1147, 491 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-10 - rotate: false - xy: 1109, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-11 - rotate: false - xy: 1109, 143 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-2 - rotate: false - xy: 1147, 457 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-3 - rotate: false - xy: 1147, 423 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-4 - rotate: false - xy: 1147, 389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-5 - rotate: false - xy: 1147, 355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-6 - rotate: false - xy: 1147, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-7 - rotate: false - xy: 1147, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-8 - rotate: false - xy: 1147, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-9 - rotate: false - xy: 1147, 219 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -swarmer - rotate: false - xy: 1627, 1673 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 toxopid-foot rotate: false - xy: 1955, 1957 + xy: 1523, 443 size: 90, 90 orig: 90, 90 offset: 0, 0 index: -1 -toxopid-joint-base +toxopid-leg rotate: false - xy: 1977, 1885 - size: 70, 70 - orig: 70, 70 + xy: 1685, 1687 + size: 150, 72 + orig: 150, 72 offset: 0, 0 index: -1 -unit-alpha-full +toxopid-outline rotate: false - xy: 800, 731 - size: 48, 48 - orig: 48, 48 + 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: 1, 1919 + xy: 1115, 1313 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 unit-atrax-full rotate: false - xy: 591, 1190 + xy: 1935, 1318 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 -unit-beta-full +unit-bryde-full rotate: false - xy: 858, 765 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-crawler-full - rotate: false - xy: 908, 757 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 958, 757 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-full - rotate: false - xy: 800, 681 - size: 48, 48 - orig: 48, 48 + xy: 665, 1431 + size: 140, 140 + orig: 140, 140 offset: 0, 0 index: -1 unit-fortress-full rotate: false - xy: 1, 76 + xy: 1115, 1117 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 -unit-gamma-full - rotate: false - xy: 733, 321 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 unit-horizon-full rotate: false - xy: 1039, 1877 + xy: 1683, 325 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -unit-mace-full - rotate: false - xy: 1693, 1673 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 unit-mega-full rotate: false - xy: 579, 1947 + xy: 957, 495 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 unit-minke-full rotate: false - xy: 591, 1087 + xy: 1847, 719 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 -unit-mono-full - rotate: false - xy: 797, 631 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 733, 263 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-poly-full - rotate: false - xy: 733, 205 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 1891, 1755 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 unit-quasar-full rotate: false - xy: 681, 1115 + xy: 1951, 473 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 unit-risso-full rotate: false - xy: 1977, 1805 + 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: 495, 722 + 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: 1, 1805 + xy: 1243, 1601 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 vault-team-crux rotate: false - xy: 605, 1361 + xy: 1561, 703 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 vault-team-sharded rotate: false - xy: 495, 1261 + xy: 1659, 801 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -wave +vela-outline rotate: false - xy: 1759, 1673 - size: 64, 64 - orig: 64, 64 + xy: 1, 781 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 -zenith-missiles-outline +vela-wreck0 rotate: false - xy: 900, 657 - size: 48, 48 - orig: 48, 48 + 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: 245, 1935 + xy: 1115, 1199 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck0 rotate: false - xy: 1, 1577 + xy: 855, 825 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck1 rotate: false - xy: 359, 1935 + xy: 855, 711 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck2 rotate: false - xy: 1, 1463 + xy: 855, 597 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 -item-blast-compound +arkyid rotate: false - xy: 943, 549 - size: 32, 32 - orig: 32, 32 + xy: 807, 1443 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -item-coal +arkyid-cell rotate: false - xy: 943, 515 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper - rotate: false - xy: 943, 481 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite - rotate: false - xy: 943, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead - rotate: false - xy: 943, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass - rotate: false - xy: 943, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric - rotate: false - xy: 943, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium - rotate: false - xy: 943, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite - rotate: false - xy: 943, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand - rotate: false - xy: 943, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap - rotate: false - xy: 943, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon - rotate: false - xy: 1011, 549 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod - rotate: false - xy: 1011, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy - rotate: false - xy: 1011, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium - rotate: false - xy: 1011, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium - rotate: false - xy: 1011, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid - rotate: false - xy: 905, 105 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil - rotate: false - xy: 939, 105 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag - rotate: false - xy: 935, 71 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water - rotate: false - xy: 969, 71 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blank - rotate: false - xy: 673, 804 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -shape-3 - rotate: false - xy: 1561, 1410 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 91, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 141, 7 - size: 48, 48 - orig: 48, 48 + xy: 937, 1443 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 atrax rotate: false - xy: 1, 10 + xy: 1523, 377 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 -atrax-base - rotate: false - xy: 1617, 1805 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 atrax-cell rotate: false - xy: 495, 656 + xy: 1519, 311 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 -beta +bryde rotate: false - xy: 813, 1365 - size: 48, 48 - orig: 48, 48 + xy: 1907, 1907 + size: 140, 140 + orig: 140, 140 offset: 0, 0 index: -1 -beta-cell +bryde-cell rotate: false - xy: 863, 1365 - size: 48, 48 - orig: 48, 48 + xy: 1907, 1765 + size: 140, 140 + orig: 140, 140 offset: 0, 0 index: -1 -crawler +corvus-base rotate: false - xy: 865, 1265 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-base - rotate: false - xy: 915, 1315 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-cell - rotate: false - xy: 865, 1215 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger - rotate: false - xy: 1065, 1315 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-base - rotate: false - xy: 1015, 1215 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare - rotate: false - xy: 1015, 1165 - size: 48, 48 - orig: 48, 48 + xy: 1685, 1761 + size: 152, 124 + orig: 152, 124 offset: 0, 0 index: -1 fortress rotate: false - xy: 1, 1180 + xy: 969, 770 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 -fortress-base - rotate: false - xy: 1033, 1481 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 fortress-cell rotate: false - xy: 1, 1098 + xy: 969, 688 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 gamma rotate: false - xy: 1951, 1747 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-cell - rotate: false - xy: 1561, 1352 - size: 56, 56 - orig: 56, 56 + xy: 1967, 175 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 horizon rotate: false - xy: 681, 1041 + xy: 1347, 1245 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-cell rotate: false - xy: 676, 967 + xy: 1951, 399 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -mace - rotate: false - xy: 1099, 1415 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-base - rotate: false - xy: 1165, 1813 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-cell - rotate: false - xy: 1231, 1813 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 mega rotate: false - xy: 1, 668 + xy: 1663, 1585 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-cell rotate: false - xy: 1, 566 + xy: 1765, 1585 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 minke rotate: false - xy: 495, 289 + xy: 1615, 446 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 -mono +minke-cell rotate: false - xy: 913, 1007 - size: 48, 48 - orig: 48, 48 + xy: 725, 651 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -mono-cell +omura-cannon-heat rotate: false - xy: 963, 1007 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova - rotate: false - xy: 1825, 1631 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 1013, 965 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-cell - rotate: false - xy: 1891, 1697 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly - rotate: false - xy: 750, 941 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-cell - rotate: false - xy: 750, 883 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -power-cell - rotate: false - xy: 739, 587 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar - rotate: false - xy: 409, 1885 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-base - rotate: false - xy: 1113, 965 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pulsar-cell - rotate: false - xy: 703, 1361 - size: 58, 48 - orig: 58, 48 + xy: 1, 1770 + size: 192, 277 + orig: 192, 277 offset: 0, 0 index: -1 quasar rotate: false - xy: 591, 663 + xy: 1909, 637 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-base rotate: false - xy: 585, 581 + xy: 1909, 555 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-cell rotate: false - xy: 585, 499 + xy: 1949, 817 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 +reign-base + rotate: false + xy: 367, 1619 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-cell + rotate: false + xy: 521, 1619 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 risso rotate: false - xy: 1617, 1871 + xy: 1751, 68 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 risso-cell rotate: false - xy: 397, 1101 + xy: 1393, 945 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +scepter + rotate: false + xy: 1, 1349 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-base + rotate: false + 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: 855, 1313 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 spiroct rotate: false - xy: 495, 1184 + xy: 1561, 626 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-cell rotate: false - xy: 495, 1107 + xy: 1659, 724 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 -vanguard +toxopid rotate: false - xy: 850, 715 - size: 48, 48 - orig: 48, 48 + xy: 713, 1715 + size: 160, 190 + orig: 160, 190 offset: 0, 0 index: -1 -vanguard-cell +toxopid-cell rotate: false - xy: 850, 665 - size: 48, 48 - orig: 48, 48 + xy: 511, 1493 + size: 152, 124 + orig: 152, 124 offset: 0, 0 index: -1 -artillery +vela rotate: false - xy: 1677, 1317 - size: 48, 56 - orig: 48, 56 + xy: 1, 923 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-cell + rotate: false + xy: 905, 1907 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-weapon-heat + rotate: false + xy: 1077, 1907 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 artillery-mount rotate: false - xy: 1185, 1879 + xy: 1683, 253 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 beam-weapon rotate: false - xy: 487, 1 + xy: 1827, 637 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -eruption - rotate: false - xy: 1685, 1433 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flakgun - rotate: false - xy: 865, 1165 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flamethrower - rotate: false - xy: 915, 1157 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -heal-shotgun-weapon - rotate: false - xy: 965, 1107 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon - rotate: false - xy: 1065, 1115 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount - rotate: false - xy: 1115, 1115 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -large-artillery - rotate: false - xy: 787, 119 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 large-bullet-mount rotate: false - xy: 1329, 1852 + xy: 1679, 154 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount rotate: false - xy: 605, 1557 + xy: 715, 259 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 large-purple-mount rotate: false - xy: 1473, 1852 + xy: 1751, 148 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 -large-weapon +omura-cannon-heat rotate: false - xy: 813, 1039 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles - rotate: false - xy: 808, 939 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles-mount - rotate: false - xy: 808, 889 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon - rotate: false - xy: 858, 915 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon - rotate: false - xy: 913, 957 - size: 48, 48 - orig: 48, 48 + xy: 1, 1491 + size: 192, 277 + orig: 192, 277 offset: 0, 0 index: -1 reign-weapon rotate: false - xy: 591, 947 + xy: 1657, 563 size: 83, 138 orig: 83, 138 offset: 0, 0 index: -1 -scepter-weapon - rotate: false - xy: 733, 483 - size: 56, 102 - orig: 56, 102 - offset: 0, 0 - index: -1 sei-launcher rotate: false - xy: 683, 1279 + xy: 1787, 391 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -small-basic-weapon - rotate: false - xy: 908, 907 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon - rotate: false - xy: 908, 857 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-weapon - rotate: false - xy: 858, 815 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-weapon - rotate: false - xy: 1751, 1499 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -weapon - rotate: false - xy: 900, 707 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith-missiles - rotate: false - xy: 950, 707 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 zenith rotate: false - xy: 131, 1935 + xy: 855, 939 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-cell rotate: false - xy: 1, 1691 + xy: 985, 1069 size: 112, 112 orig: 112, 112 offset: 0, 0 @@ -7218,6 +2913,4667 @@ 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: 785, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mender-top + rotate: false + 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: 819, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-arrow + rotate: false + xy: 425, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor + rotate: false + xy: 445, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-bridge + rotate: false + xy: 445, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-end + rotate: false + xy: 462, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +center + rotate: false + xy: 462, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-0 + rotate: false + xy: 133, 495 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-armored-conveyor-full + rotate: false + xy: 133, 495 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-1 + rotate: false + xy: 133, 461 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-2 + rotate: false + xy: 133, 427 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-3 + rotate: false + xy: 167, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-0 + rotate: false + xy: 190, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-1 + rotate: false + xy: 190, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-2 + rotate: false + xy: 187, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-3 + rotate: false + xy: 187, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-0 + rotate: false + xy: 187, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-1 + rotate: false + xy: 201, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-2 + rotate: false + xy: 224, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-3 + rotate: false + xy: 224, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-0 + rotate: false + xy: 221, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-1 + rotate: false + xy: 221, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-2 + rotate: false + xy: 221, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-3 + rotate: false + xy: 235, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-0 + rotate: false + xy: 258, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-1 + rotate: false + xy: 258, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-2 + rotate: false + xy: 255, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-3 + rotate: false + xy: 255, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-1 + rotate: false + xy: 493, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-2 + rotate: false + xy: 493, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-3 + rotate: false + xy: 507, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-0 + rotate: false + xy: 513, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-1 + rotate: false + xy: 513, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-2 + rotate: false + xy: 513, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-3 + rotate: false + xy: 513, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-0 + rotate: false + xy: 513, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-1 + rotate: false + xy: 530, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-2 + rotate: false + xy: 530, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-3 + rotate: false + xy: 527, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-3-0 + rotate: false + xy: 527, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-3-1 + rotate: false + xy: 527, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-3-2 + rotate: false + xy: 541, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-3-3 + rotate: false + xy: 547, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-4-0 + rotate: false + xy: 547, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-4-1 + rotate: false + xy: 547, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-4-2 + rotate: false + xy: 547, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-4-3 + rotate: false + xy: 547, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor + rotate: false + xy: 847, 469 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-0 + rotate: false + xy: 881, 463 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-1 + rotate: false + xy: 915, 463 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-2 + rotate: false + xy: 813, 447 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-edge + rotate: false + xy: 847, 435 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-stack + rotate: false + xy: 881, 429 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-1 + rotate: false + xy: 938, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-2 + rotate: false + xy: 938, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-3 + rotate: false + xy: 935, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-1-0 + rotate: false + xy: 935, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-1-1 + rotate: false + xy: 955, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-1-2 + rotate: false + xy: 955, 123 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-1-3 + rotate: false + xy: 955, 89 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-2-0 + rotate: false + xy: 955, 55 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-2-1 + rotate: false + xy: 955, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-2-2 + rotate: false + xy: 171, 709 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-2-3 + rotate: false + xy: 171, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-3-0 + rotate: false + xy: 171, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-3-1 + rotate: false + xy: 171, 607 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-3-2 + rotate: false + xy: 171, 573 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-3-3 + rotate: false + xy: 205, 725 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-4-0 + rotate: false + xy: 205, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-4-1 + rotate: false + xy: 205, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-4-2 + rotate: false + xy: 205, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-4-3 + rotate: false + xy: 205, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cross + rotate: false + 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: 615, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +junction + rotate: false + xy: 717, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +overflow-gate + rotate: false + xy: 847, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conveyor + rotate: false + xy: 881, 531 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conveyor-arrow + rotate: false + xy: 915, 531 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conveyor-bridge + rotate: false + xy: 881, 497 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conveyor-end + rotate: false + xy: 915, 497 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +router + rotate: false + xy: 836, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sorter + rotate: false + xy: 819, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +underflow-gate + rotate: false + 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: 1923, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-liquid + rotate: false + xy: 67, 697 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-rotator + rotate: false + xy: 67, 631 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-top + rotate: false + xy: 67, 565 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-border + rotate: false + xy: 241, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-middle + rotate: false + xy: 323, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-select + rotate: false + xy: 391, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-liquid + rotate: false + xy: 479, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit + rotate: false + xy: 439, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-arrow + rotate: false + xy: 445, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-arrow + rotate: false + xy: 445, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-bridge + rotate: false + xy: 445, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-end + rotate: false + xy: 445, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom + rotate: false + xy: 459, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-0 + rotate: false + xy: 473, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-1 + rotate: false + xy: 479, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-2 + rotate: false + xy: 479, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-3 + rotate: false + xy: 479, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-4 + rotate: false + xy: 479, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-0 + rotate: false + xy: 479, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-1 + rotate: false + xy: 479, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-2 + rotate: false + xy: 496, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-3 + rotate: false + xy: 496, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-3 + rotate: false + xy: 496, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-4 + rotate: false + xy: 493, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-junction + rotate: false + xy: 731, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-overflow-gate + rotate: false + xy: 745, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-overflow-gate-top + rotate: false + xy: 751, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-router-bottom + rotate: false + xy: 751, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-router-liquid + rotate: false + xy: 751, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-router-top + rotate: false + xy: 751, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mechanical-pump + rotate: false + xy: 779, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mechanical-pump-liquid + rotate: false + xy: 813, 617 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rotary-pump-liquid + rotate: false + xy: 813, 617 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thermal-pump-liquid + rotate: false + xy: 813, 617 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit + rotate: false + xy: 813, 549 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit-arrow + rotate: false + xy: 847, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit-bridge + rotate: false + xy: 813, 515 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit-end + rotate: false + xy: 847, 503 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-cap + rotate: false + xy: 813, 413 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-0 + rotate: false + xy: 847, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-1 + rotate: false + xy: 813, 379 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-2 + rotate: false + xy: 881, 395 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-3 + rotate: false + xy: 915, 395 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-4 + rotate: false + xy: 847, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-0 + rotate: false + xy: 847, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-1 + rotate: false + xy: 881, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-2 + rotate: false + xy: 915, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-4 + rotate: false + 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: 785, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +message + rotate: false + xy: 785, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +micro-processor + rotate: false + xy: 813, 583 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +switch + rotate: false + xy: 921, 89 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +switch-on + rotate: false + xy: 921, 55 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +battery + rotate: false + xy: 255, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +battery-top + rotate: false + xy: 241, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +combustion-generator + rotate: false + xy: 459, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +combustion-generator-top + rotate: false + xy: 459, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +diode + rotate: false + xy: 581, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +diode-arrow + rotate: false + xy: 598, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +illuminator + rotate: false + xy: 609, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +illuminator-top + rotate: false + xy: 615, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +power-node + rotate: false + 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: 915, 361 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +power-void + rotate: false + 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: 833, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +solar-panel + rotate: false + 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: 1461, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thermal-generator + rotate: false + xy: 1659, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +blast-mixer + rotate: false + xy: 1, 697 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +coal-centrifuge + rotate: false + xy: 1, 103 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cryofluid-mixer-bottom + rotate: false + xy: 1927, 957 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cryofluid-mixer-liquid + rotate: false + xy: 211, 891 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cryofluid-mixer-top + rotate: false + 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: 615, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-source + rotate: false + xy: 700, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-void + rotate: false + 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: 768, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-void + rotate: false + xy: 765, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +melter + rotate: false + 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: 802, 277 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulverizer-rotator + rotate: false + 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: 471, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator-liquid + rotate: false + xy: 537, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator-spinner + rotate: false + xy: 603, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +silicon-smelter + rotate: false + xy: 669, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press + rotate: false + xy: 735, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame0 + rotate: false + xy: 801, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame1 + rotate: false + xy: 867, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame2 + rotate: false + xy: 933, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-liquid + rotate: false + xy: 999, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-top + rotate: false + xy: 1065, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +boulder1 + rotate: false + xy: 1527, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +boulder2 + rotate: false + 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: 870, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-boulder2 + rotate: false + xy: 904, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-boulder1 + rotate: false + xy: 867, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-boulder2 + rotate: false + xy: 901, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow-boulder1 + rotate: false + xy: 1547, 509 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +snow-boulder2 + rotate: false + xy: 1597, 509 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spore-cluster1 + rotate: false + xy: 1317, 509 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +spore-cluster2 + rotate: false + xy: 1359, 509 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +spore-cluster3 + rotate: false + 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: 239, 599 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unloader-center + rotate: false + xy: 273, 633 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +arc-heat + rotate: false + xy: 133, 529 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-1 + rotate: false + 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: 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: 904, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +wave-liquid + rotate: false + 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: 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: 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: 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: 595, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-wall + rotate: false + 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: 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: 867, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall3 + rotate: false + xy: 901, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall4 + rotate: false + xy: 833, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall5 + rotate: false + xy: 833, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +surge-wall + rotate: false + xy: 921, 123 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +surge-wall-large + rotate: false + xy: 1527, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thorium-wall + rotate: false + xy: 921, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium-wall-large + rotate: false + xy: 1725, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +titanium-wall + rotate: false + xy: 239, 667 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-wall-large + rotate: false + xy: 1791, 759 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +bullet + rotate: false + xy: 1993, 969 + size: 52, 52 + orig: 52, 52 + offset: 0, 0 + index: -1 +bullet-back + rotate: false + xy: 821, 705 + size: 52, 52 + orig: 52, 52 + offset: 0, 0 + index: -1 +casing + rotate: false + xy: 1987, 473 + size: 8, 16 + orig: 8, 16 + offset: 0, 0 + index: -1 +circle-mid + rotate: false + xy: 975, 244 + size: 1, 199 + orig: 1, 199 + offset: 0, 0 + index: -1 +error + rotate: false + xy: 1147, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +laser + rotate: false + xy: 1977, 709 + size: 4, 48 + orig: 4, 48 + offset: 0, 0 + index: -1 +minelaser + rotate: false + xy: 1983, 709 + size: 4, 48 + orig: 4, 48 + offset: 0, 0 + index: -1 +missile + rotate: false + xy: 133, 677 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +missile-back + rotate: false + xy: 133, 639 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +parallax-laser + rotate: false + xy: 975, 445 + size: 4, 48 + orig: 4, 48 + offset: 0, 0 + index: -1 +particle + rotate: false + xy: 1275, 509 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +scale_marker + rotate: false + xy: 1191, 603 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +shell + rotate: false + xy: 133, 601 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +shell-back + rotate: false + xy: 133, 563 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +transfer + rotate: false + xy: 981, 449 + size: 4, 48 + orig: 4, 48 + offset: 0, 0 + index: -1 +transfer-arrow + rotate: false + xy: 239, 633 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +white + rotate: false + 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: 1077, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-wreck1 + rotate: false + xy: 1127, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-wreck2 + rotate: false + xy: 1177, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +arc + rotate: false + xy: 133, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +arkyid-leg + rotate: false + 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: 1945, 449 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +atrax-joint + rotate: false + xy: 175, 743 + size: 26, 26 + orig: 26, 26 + offset: 0, 0 + index: -1 +atrax-leg + rotate: false + xy: 137, 743 + size: 36, 26 + orig: 36, 26 + offset: 0, 0 + index: -1 +atrax-leg-base + rotate: false + xy: 133, 715 + size: 36, 26 + orig: 36, 26 + offset: 0, 0 + index: -1 +beta-outline + rotate: false + 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 +block-char-full + rotate: false + 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 +block-dacite-full + rotate: false + 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 +block-snow-full + rotate: false + xy: 411, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-full + rotate: false + 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: 1777, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-outline + rotate: false + xy: 1827, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck0 + rotate: false + 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: 897, 657 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-outline + rotate: false + xy: 947, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck0 + rotate: false + xy: 997, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck1 + rotate: false + xy: 1047, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck2 + rotate: false + xy: 1097, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +duo + rotate: false + 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: 1197, 593 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-outline + rotate: false + xy: 125, 70 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck0 + rotate: false + xy: 125, 12 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck1 + rotate: false + xy: 183, 128 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck2 + rotate: false + xy: 183, 70 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +parallax + rotate: false + 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 +small-mount-weapon-outline + rotate: false + xy: 1447, 509 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spiroct-foot + rotate: false + xy: 1897, 443 + size: 46, 46 + orig: 46, 46 + offset: 0, 0 + index: -1 +spiroct-joint + rotate: false + xy: 819, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spiroct-leg + rotate: false + xy: 1, 1 + size: 48, 34 + orig: 48, 34 + offset: 0, 0 + index: -1 +spiroct-leg-base + rotate: false + 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: 1997, 473 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +vanguard-cell + rotate: false + xy: 1697, 451 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +artillery + rotate: false + xy: 1227, 701 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +eruption + rotate: false + xy: 1197, 643 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flakgun + rotate: false + xy: 1297, 651 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flamethrower + rotate: false + xy: 1347, 651 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +heal-shotgun-weapon + rotate: false + xy: 1993, 917 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +heal-weapon + rotate: false + xy: 1697, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +heal-weapon-mount + rotate: false + xy: 1747, 659 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +large-artillery + rotate: false + xy: 1897, 591 + size: 48, 66 + orig: 48, 66 + offset: 0, 0 + index: -1 +large-weapon + rotate: false + xy: 1997, 573 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +missiles + rotate: false + xy: 1697, 559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +missiles-mount + rotate: false + xy: 1747, 559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-purple-weapon + rotate: false + xy: 947, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-weapon + rotate: false + xy: 1047, 609 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +scepter-weapon + rotate: false + xy: 531, 655 + size: 56, 102 + orig: 56, 102 + offset: 0, 0 + index: -1 +small-basic-weapon + rotate: false + xy: 1297, 551 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-mount-weapon + rotate: false + xy: 1397, 551 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-weapon + rotate: false + xy: 1497, 509 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spiroct-weapon + rotate: false + xy: 1697, 501 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +weapon + rotate: false + xy: 1747, 451 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +zenith-missiles + rotate: false + xy: 1797, 459 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 + +sprites5.png +size: 2048,1024 +format: rgba8888 +filter: nearest,nearest +repeat: none rubble-1-0 rotate: false xy: 1933, 723 @@ -7499,3701 +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, 395 + xy: 1, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 basalt1 rotate: false - xy: 1561, 459 + xy: 2005, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 basalt2 rotate: false - xy: 1595, 459 + xy: 1299, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 basalt3 rotate: false - xy: 1629, 459 + xy: 1333, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char1 rotate: false - xy: 1663, 459 + xy: 1367, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char2 rotate: false - xy: 1697, 459 + xy: 1401, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char3 rotate: false - xy: 1731, 459 + xy: 1435, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliff rotate: false - xy: 1765, 459 + xy: 1469, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +cliff0 + rotate: false + 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: 1799, 459 + xy: 1503, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal2 rotate: false - xy: 1833, 459 + xy: 1537, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal3 rotate: false - xy: 1867, 459 + xy: 1571, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper1 rotate: false - xy: 1901, 459 + xy: 1605, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper2 rotate: false - xy: 1935, 459 + xy: 1639, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper3 rotate: false - xy: 1969, 459 + xy: 1673, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters1 rotate: false - xy: 2003, 459 + xy: 1707, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters2 rotate: false - xy: 491, 1 + xy: 1741, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters3 rotate: false - xy: 557, 67 + xy: 1775, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters4 rotate: false - xy: 655, 165 + xy: 1809, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters5 rotate: false - xy: 753, 263 + xy: 1843, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters6 rotate: false - xy: 851, 361 + xy: 1877, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite-edge rotate: false - xy: 1, 297 + xy: 1, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dacite-wall-large rotate: false - xy: 491, 35 + xy: 919, 135 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dacite-wall1 rotate: false - xy: 851, 327 + xy: 755, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite-wall2 rotate: false - xy: 1411, 409 + xy: 789, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite1 rotate: false - xy: 525, 1 + xy: 1911, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite2 rotate: false - xy: 655, 131 + xy: 1945, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite3 rotate: false - xy: 753, 229 + xy: 721, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal-large rotate: false - xy: 589, 133 + xy: 919, 69 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dark-metal1 rotate: false - xy: 1445, 409 + xy: 853, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal2 rotate: false - xy: 1479, 409 + xy: 887, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1 rotate: false - xy: 1513, 409 + xy: 921, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-edge rotate: false - xy: 99, 395 + xy: 99, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-2 rotate: false - xy: 1561, 425 + xy: 2007, 331 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-edge rotate: false - xy: 1, 199 + xy: 1, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-3 rotate: false - xy: 1595, 425 + xy: 985, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-edge rotate: false - xy: 99, 297 + xy: 99, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-4 rotate: false - xy: 1629, 425 + xy: 1019, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-edge rotate: false - xy: 197, 395 + xy: 197, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-5 rotate: false - xy: 1663, 425 + xy: 1053, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-edge rotate: false - xy: 1, 101 + xy: 1, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-6 rotate: false - xy: 1697, 425 + xy: 1087, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-edge rotate: false - xy: 99, 199 + xy: 99, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-edge rotate: false - xy: 197, 297 + xy: 197, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water rotate: false - xy: 1833, 425 + xy: 1233, 199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-edge rotate: false - xy: 295, 395 + xy: 295, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water1 rotate: false - xy: 1867, 425 + xy: 1233, 165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water2 rotate: false - xy: 1901, 425 + xy: 1233, 131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water3 rotate: false - xy: 1935, 425 + xy: 1299, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water rotate: false - xy: 1969, 425 + xy: 1333, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-edge rotate: false - xy: 1, 3 + xy: 1, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-water1 rotate: false - xy: 2003, 425 + xy: 1367, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water2 rotate: false - xy: 591, 99 + xy: 1401, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water3 rotate: false - xy: 591, 65 + xy: 1435, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand1 rotate: false - xy: 1731, 425 + xy: 1121, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand2 rotate: false - xy: 1765, 425 + xy: 1183, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand3 rotate: false - xy: 1799, 425 + xy: 2007, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater rotate: false - xy: 625, 97 + xy: 1469, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-edge rotate: false - xy: 99, 101 + xy: 99, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dirt-edge rotate: false - xy: 197, 199 + xy: 197, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dirt-wall-large rotate: false - xy: 687, 231 + xy: 985, 233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dirt-wall1 rotate: false - xy: 787, 295 + xy: 1605, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-wall2 rotate: false - xy: 787, 261 + xy: 1639, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt1 rotate: false - xy: 625, 63 + xy: 1503, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt2 rotate: false - xy: 659, 97 + xy: 1537, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt3 rotate: false - xy: 659, 63 + xy: 1571, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dune-wall-large rotate: false - xy: 785, 329 + xy: 985, 167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dune-wall1 rotate: false - xy: 787, 227 + xy: 1673, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dune-wall2 rotate: false - xy: 821, 293 + xy: 1707, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge rotate: false - xy: 821, 259 + xy: 1741, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge-stencil rotate: false - xy: 295, 297 + xy: 295, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 edgier rotate: false - xy: 821, 225 + xy: 1775, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-edge rotate: false - xy: 393, 395 + xy: 393, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 grass1 rotate: false - xy: 855, 293 + xy: 1809, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass2 rotate: false - xy: 855, 259 + xy: 1843, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass3 rotate: false - xy: 855, 225 + xy: 1877, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock1 rotate: false - xy: 1547, 391 + xy: 1911, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock2 rotate: false - xy: 1581, 391 + xy: 1945, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock3 rotate: false - xy: 1615, 391 + xy: 1217, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-edge rotate: false - xy: 99, 3 + xy: 99, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow-edge rotate: false - xy: 197, 101 + xy: 197, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow1 rotate: false - xy: 1751, 391 + xy: 2013, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow2 rotate: false - xy: 1785, 391 + xy: 2013, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow3 rotate: false - xy: 1819, 391 + xy: 1155, 65 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-wall-large rotate: false - xy: 883, 427 + xy: 1051, 233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ice-wall1 rotate: false - xy: 1853, 391 + xy: 1189, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-wall2 rotate: false - xy: 1887, 391 + xy: 1223, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice1 rotate: false - xy: 1649, 391 + xy: 1251, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice2 rotate: false - xy: 1683, 391 + xy: 1979, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice3 rotate: false - xy: 1717, 391 + xy: 1979, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead1 rotate: false - xy: 1921, 391 + xy: 1257, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead2 rotate: false - xy: 1955, 391 + xy: 823, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead3 rotate: false - xy: 1989, 391 + xy: 857, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock1 rotate: false - xy: 689, 197 + xy: 891, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock2 rotate: false - xy: 689, 163 + xy: 925, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock3 rotate: false - xy: 723, 195 + xy: 1267, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor rotate: false - xy: 723, 161 + xy: 1267, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2 rotate: false - xy: 757, 193 + xy: 1301, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-edge rotate: false - xy: 295, 199 + xy: 295, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-3 rotate: false - xy: 757, 159 + xy: 1301, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-edge rotate: false - xy: 393, 297 + xy: 393, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-5 rotate: false - xy: 791, 191 + xy: 1335, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-edge rotate: false - xy: 491, 395 + xy: 491, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged-edge rotate: false - xy: 197, 3 + xy: 197, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged1 rotate: false - xy: 825, 191 + xy: 1335, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged2 rotate: false - xy: 791, 157 + xy: 1369, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged3 rotate: false - xy: 825, 157 + xy: 1369, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-edge rotate: false - xy: 295, 101 + xy: 295, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss-edge rotate: false - xy: 393, 199 + xy: 393, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss1 rotate: false - xy: 859, 191 + xy: 1403, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss2 rotate: false - xy: 859, 157 + xy: 1403, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss3 rotate: false - xy: 885, 393 + xy: 1437, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mud-edge rotate: false - xy: 491, 297 + xy: 491, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mud1 rotate: false - xy: 885, 359 + xy: 1437, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mud2 rotate: false - xy: 919, 393 + xy: 1471, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mud3 rotate: false - xy: 953, 393 + xy: 1471, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal1 rotate: false - xy: 919, 359 + xy: 1505, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal2 rotate: false - xy: 987, 393 + xy: 1505, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal3 rotate: false - xy: 953, 359 + xy: 1539, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper1 rotate: false - xy: 1021, 393 + xy: 1539, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper2 rotate: false - xy: 987, 359 + xy: 1573, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper3 rotate: false - xy: 1055, 393 + xy: 1573, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead1 rotate: false - xy: 1021, 359 + xy: 1607, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead2 rotate: false - xy: 1089, 393 + xy: 1607, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead3 rotate: false - xy: 1055, 359 + xy: 1641, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap1 rotate: false - xy: 1123, 393 + xy: 1641, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap2 rotate: false - xy: 1089, 359 + xy: 1675, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap3 rotate: false - xy: 1157, 393 + xy: 1675, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium1 rotate: false - xy: 1123, 359 + xy: 1709, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium2 rotate: false - xy: 1191, 393 + xy: 1709, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium3 rotate: false - xy: 1157, 359 + xy: 1743, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium1 rotate: false - xy: 1225, 393 + xy: 1743, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium2 rotate: false - xy: 1191, 359 + xy: 1777, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium3 rotate: false - xy: 1259, 393 + xy: 1777, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles1 rotate: false - xy: 1225, 359 + xy: 1811, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles2 rotate: false - xy: 1293, 393 + xy: 1811, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles3 rotate: false - xy: 1259, 359 + xy: 1845, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pine rotate: false - xy: 1411, 443 + xy: 1183, 183 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 salt rotate: false - xy: 1327, 393 + xy: 1845, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-edge rotate: false - xy: 589, 395 + xy: 589, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salt-wall-large rotate: false - xy: 949, 427 + xy: 985, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salt-wall1 rotate: false - xy: 1293, 359 + xy: 1879, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-wall2 rotate: false - xy: 1361, 393 + xy: 1879, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-edge rotate: false - xy: 295, 3 + xy: 295, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-wall-large rotate: false - xy: 1015, 427 + xy: 1051, 167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-wall1 rotate: false - xy: 1429, 375 + xy: 1319, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-wall2 rotate: false - xy: 1463, 375 + xy: 1353, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water rotate: false - xy: 1497, 375 + xy: 1387, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-edge rotate: false - xy: 393, 101 + xy: 393, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-water1 rotate: false - xy: 1395, 341 + xy: 1421, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water2 rotate: false - xy: 1429, 341 + xy: 1455, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water3 rotate: false - xy: 1463, 341 + xy: 1489, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand1 rotate: false - xy: 1327, 359 + xy: 1913, 197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 1361, 359 + xy: 1913, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand3 rotate: false - xy: 1395, 375 + xy: 1285, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap1 rotate: false - xy: 1497, 341 + xy: 1523, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap2 rotate: false - xy: 1531, 357 + xy: 1557, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap3 rotate: false - xy: 1565, 357 + xy: 1591, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-edge rotate: false - xy: 491, 199 + xy: 491, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 shale-wall-large rotate: false - xy: 1081, 427 + xy: 1117, 233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-wall1 rotate: false - xy: 1701, 357 + xy: 1727, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-wall2 rotate: false - xy: 1735, 357 + xy: 1761, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale1 rotate: false - xy: 1599, 357 + xy: 1625, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale2 rotate: false - xy: 1633, 357 + xy: 1659, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale3 rotate: false - xy: 1667, 357 + xy: 1693, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-large rotate: false - xy: 1147, 427 + xy: 1051, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shrubs1 rotate: false - xy: 1769, 357 + xy: 1795, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs2 rotate: false - xy: 1803, 357 + xy: 1829, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag rotate: false - xy: 1837, 357 + xy: 1863, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-edge rotate: false - xy: 589, 297 + xy: 589, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-edge rotate: false - xy: 687, 395 + xy: 687, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-pine rotate: false - xy: 1461, 443 + xy: 1249, 249 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-wall-large rotate: false - xy: 1213, 427 + xy: 1117, 167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snow-wall1 rotate: false - xy: 1973, 357 + xy: 1325, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-wall2 rotate: false - xy: 1531, 323 + xy: 1359, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow1 rotate: false - xy: 1871, 357 + xy: 1897, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow2 rotate: false - xy: 1905, 357 + xy: 1931, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow3 rotate: false - xy: 1939, 357 + xy: 1291, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +space + rotate: false + xy: 1393, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +space-edge + rotate: false + xy: 393, 7 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 spawn rotate: false - xy: 1565, 323 + xy: 1427, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-edge rotate: false - xy: 393, 3 + xy: 491, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 spore-moss1 rotate: false - xy: 1599, 323 + xy: 1461, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss2 rotate: false - xy: 1633, 323 + xy: 1495, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss3 rotate: false - xy: 1667, 323 + xy: 1529, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-pine rotate: false - xy: 1511, 443 + xy: 1183, 133 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-wall-large rotate: false - xy: 1279, 427 + xy: 1183, 233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-wall1 rotate: false - xy: 1701, 323 + xy: 1563, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-wall2 rotate: false - xy: 1735, 323 + xy: 1597, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-edge rotate: false - xy: 491, 101 + xy: 589, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 stone-wall-large rotate: false - xy: 1345, 427 + xy: 1117, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stone-wall1 rotate: false - xy: 1871, 323 + xy: 1733, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-wall2 rotate: false - xy: 1905, 323 + xy: 1767, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone1 rotate: false - xy: 1769, 323 + xy: 1631, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 1803, 323 + xy: 1665, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone3 rotate: false - xy: 1837, 323 + xy: 1699, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water rotate: false - xy: 1939, 323 + xy: 1801, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-edge rotate: false - xy: 589, 199 + xy: 687, 301 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tar rotate: false - xy: 1973, 323 + xy: 1835, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-edge rotate: false - xy: 687, 297 + xy: 785, 399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tendrils1 rotate: false - xy: 2007, 357 + xy: 1869, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils2 rotate: false - xy: 2007, 323 + xy: 1903, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils3 rotate: false - xy: 889, 325 + xy: 1291, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 923, 325 + xy: 1325, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 889, 291 + xy: 1359, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 957, 325 + xy: 1393, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 889, 257 + xy: 1427, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 923, 291 + xy: 1461, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 991, 325 + xy: 1495, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 923, 257 + xy: 1529, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-edge rotate: false - xy: 785, 395 + 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: 613, 743 + xy: 613, 763 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory-icon-editor rotate: false - xy: 1717, 905 + xy: 1847, 925 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-icon-editor rotate: false - xy: 711, 743 + xy: 711, 763 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 2011, 969 + xy: 1667, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 1893, 707 + xy: 423, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 basalt-icon-editor rotate: false - xy: 2011, 935 + xy: 423, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-basalt1 rotate: false - xy: 2011, 935 + xy: 423, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 1927, 707 + xy: 423, 307 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 1815, 905 + xy: 1945, 925 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 1, 3 + xy: 1, 23 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 1103, 807 + xy: 1397, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 2011, 901 + xy: 423, 273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-forge-icon-editor rotate: false - xy: 809, 743 + xy: 809, 763 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-loader-icon-editor rotate: false - xy: 1913, 905 + xy: 227, 281 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader-icon-editor rotate: false - xy: 227, 261 + xy: 227, 183 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 boulder-icon-editor rotate: false - xy: 1535, 625 + xy: 1793, 843 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bridge-conduit-icon-editor rotate: false - xy: 1961, 707 + xy: 423, 239 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 2011, 867 + xy: 327, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 2011, 833 + xy: 361, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 2011, 833 + xy: 361, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 615, 544 + xy: 2043, 1020 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliff-icon-editor rotate: false - xy: 131, 1 + xy: 1009, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 1169, 807 + xy: 1463, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 165, 1 + xy: 1043, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-center-icon-editor rotate: false - xy: 1235, 807 + xy: 1529, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conduit-icon-editor rotate: false - xy: 943, 447 + xy: 1077, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 1301, 807 + xy: 1595, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 1995, 707 + xy: 1111, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 977, 447 + xy: 1145, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 1367, 807 + xy: 1661, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 323, 389 + xy: 323, 409 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 613, 841 + xy: 613, 861 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 227, 163 + xy: 517, 635 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 229, 31 + xy: 1179, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 229, 31 + 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, 807 + xy: 1727, 827 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 1499, 807 + xy: 943, 501 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 517, 615 + xy: 131, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dacite-boulder-icon-editor rotate: false - xy: 1601, 691 + xy: 1667, 711 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dacite-icon-editor rotate: false - xy: 263, 31 + xy: 1213, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dacite1 rotate: false - xy: 263, 31 + xy: 1213, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite-wall-icon-editor rotate: false - xy: 423, 355 + xy: 1247, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal-icon-editor rotate: false - xy: 423, 321 + xy: 1281, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 423, 287 + xy: 1315, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 423, 287 + xy: 1315, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 423, 253 + xy: 1349, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 423, 253 + xy: 1349, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 423, 219 + xy: 649, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 423, 219 + xy: 649, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 327, 61 + xy: 683, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 327, 61 + xy: 683, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 361, 61 + xy: 717, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 361, 61 + xy: 717, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 649, 415 + xy: 751, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 649, 415 + xy: 751, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 683, 415 + xy: 785, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 683, 415 + xy: 785, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 717, 415 + xy: 819, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 751, 415 + xy: 853, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 785, 415 + xy: 887, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 785, 415 + xy: 887, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 131, 35 + xy: 517, 537 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode-icon-editor rotate: false - xy: 819, 415 + xy: 395, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-icon-editor rotate: false - xy: 853, 415 + xy: 1383, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dirt1 rotate: false - xy: 853, 415 + xy: 1383, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-wall-icon-editor rotate: false - xy: 887, 415 + xy: 1793, 809 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 disassembler-icon-editor rotate: false - xy: 517, 517 + xy: 325, 311 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 1565, 807 + xy: 1007, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 395, 61 + xy: 1783, 775 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 1631, 807 + xy: 1007, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dune-wall-icon-editor rotate: false - xy: 1535, 591 + xy: 1717, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 1585, 641 + xy: 1717, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-basalt2 rotate: false - xy: 1619, 657 + xy: 1717, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-basalt3 rotate: false - xy: 1653, 657 + xy: 1701, 625 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 1687, 657 + xy: 1735, 625 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 1721, 657 + xy: 985, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters2 rotate: false - xy: 1755, 657 + xy: 1019, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 1789, 657 + xy: 1053, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dacite2 rotate: false - xy: 1823, 657 + xy: 1087, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dacite3 rotate: false - xy: 1857, 665 + xy: 1121, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water1 rotate: false - xy: 1653, 623 + xy: 1223, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water2 rotate: false - xy: 1687, 623 + xy: 1257, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water3 rotate: false - xy: 1721, 623 + xy: 1291, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water1 rotate: false - xy: 1755, 623 + xy: 1325, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water2 rotate: false - xy: 1789, 623 + xy: 1359, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water3 rotate: false - xy: 1823, 623 + xy: 1393, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 1569, 591 + xy: 1155, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 1619, 623 + xy: 1189, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dirt2 rotate: false - xy: 1857, 631 + xy: 1817, 775 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dirt3 rotate: false - xy: 1603, 589 + xy: 1851, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 1637, 589 + xy: 1885, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 1637, 589 + xy: 1885, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 1671, 589 + xy: 1919, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 1705, 589 + xy: 1953, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 1739, 589 + xy: 1987, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 1739, 589 + xy: 1987, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 1773, 589 + xy: 1851, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 1807, 589 + xy: 1885, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 989, 413 + xy: 425, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 989, 413 + xy: 425, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 1893, 673 + xy: 425, 171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 1927, 673 + xy: 425, 137 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 1841, 589 + xy: 1919, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 1841, 589 + xy: 1919, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 921, 413 + xy: 1953, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 955, 413 + xy: 1987, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 1961, 673 + xy: 429, 103 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 1961, 673 + xy: 429, 103 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 1995, 673 + xy: 429, 69 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 1891, 639 + xy: 231, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 1925, 639 + xy: 265, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 1925, 639 + xy: 265, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 1959, 639 + xy: 231, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 1959, 639 + xy: 231, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 1993, 639 + xy: 265, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 1993, 639 + xy: 265, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 1875, 597 + xy: 299, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 1875, 597 + xy: 299, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 1909, 605 + xy: 333, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 1909, 605 + xy: 333, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 1943, 605 + xy: 367, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 1977, 605 + xy: 299, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 2011, 605 + xy: 333, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 2011, 605 + xy: 333, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 1875, 563 + xy: 367, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 1909, 571 + xy: 401, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-mud1 rotate: false - xy: 1943, 571 + xy: 435, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mud-icon-editor rotate: false - xy: 1943, 571 + xy: 435, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-mud2 rotate: false - xy: 1977, 571 + xy: 401, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-mud3 rotate: false - xy: 2011, 571 + xy: 435, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 1909, 537 + xy: 985, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 1943, 537 + xy: 1019, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 1977, 537 + xy: 1053, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 2011, 537 + xy: 1087, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 425, 185 + xy: 1121, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 425, 151 + xy: 1155, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 425, 117 + xy: 1189, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 429, 83 + xy: 1223, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 429, 49 + xy: 1257, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 1011, 477 + xy: 1291, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 1045, 477 + xy: 1325, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 457, 385 + xy: 1359, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 457, 351 + xy: 1393, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 491, 385 + xy: 457, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 457, 317 + xy: 491, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 525, 385 + xy: 457, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 491, 351 + xy: 525, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 457, 283 + xy: 457, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 559, 385 + xy: 491, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 491, 317 + xy: 559, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 525, 351 + xy: 457, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 457, 249 + xy: 491, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 457, 249 + xy: 491, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water1 rotate: false - xy: 559, 351 + xy: 491, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water2 rotate: false - xy: 491, 249 + xy: 525, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water3 rotate: false - xy: 525, 283 + xy: 559, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 593, 385 + xy: 525, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 593, 385 + xy: 525, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 491, 283 + xy: 593, 405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 525, 317 + xy: 457, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 559, 317 + xy: 491, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 559, 317 + xy: 491, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 593, 351 + xy: 525, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 525, 249 + xy: 559, 337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-slag rotate: false - xy: 559, 283 + xy: 593, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-icon-editor rotate: false - xy: 559, 283 + xy: 593, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 593, 317 + xy: 525, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 559, 249 + xy: 559, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 593, 283 + 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: 593, 249 + xy: 593, 303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 627, 381 + xy: 593, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 627, 381 + xy: 593, 269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 627, 347 + xy: 627, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 661, 381 + xy: 627, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 627, 313 + xy: 661, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 627, 313 + xy: 661, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 661, 347 + xy: 627, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 695, 381 + xy: 661, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 627, 279 + xy: 695, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 627, 279 + xy: 695, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 661, 313 + xy: 627, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 661, 313 + xy: 627, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 695, 347 + xy: 661, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 729, 381 + xy: 695, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 661, 279 + xy: 729, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 695, 313 + xy: 661, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 695, 313 + xy: 661, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 exponential-reconstructor-icon-editor rotate: false - xy: 1, 133 + xy: 1, 153 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 force-projector-icon-editor rotate: false - xy: 325, 291 + 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: 325, 193 + xy: 615, 665 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 943, 481 + xy: 1073, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ground-factory-icon-editor rotate: false - xy: 615, 645 + xy: 615, 567 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hail-icon-editor rotate: false - xy: 729, 347 + xy: 695, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hyper-processor-icon-editor rotate: false - xy: 615, 547 + xy: 713, 665 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-wall-icon-editor rotate: false - xy: 763, 381 + xy: 729, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-icon-editor rotate: false - xy: 695, 279 + xy: 763, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 937, 873 + xy: 1067, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 729, 313 + xy: 695, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 763, 347 + xy: 729, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 797, 381 + xy: 763, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 729, 279 + xy: 797, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 763, 313 + xy: 729, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 1007, 709 + xy: 1007, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 1007, 643 + xy: 1073, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 large-logic-display-icon-editor rotate: false - xy: 323, 519 + xy: 323, 539 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 laser-drill-icon-editor rotate: false - xy: 713, 645 + xy: 713, 567 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 713, 547 + xy: 811, 665 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large-icon-editor rotate: false - xy: 1067, 873 + xy: 1197, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 797, 347 + xy: 763, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 831, 381 + xy: 797, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 763, 279 + xy: 831, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 811, 645 + xy: 811, 567 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-void-icon-editor rotate: false - xy: 797, 313 + xy: 763, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-display-icon-editor rotate: false - xy: 811, 547 + xy: 229, 85 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor-icon-editor rotate: false - xy: 1007, 577 + xy: 1139, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 229, 65 + xy: 327, 115 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 1009, 511 + xy: 1073, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 831, 347 + xy: 797, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 1197, 873 + xy: 1327, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 865, 381 + 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: 797, 279 + xy: 865, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 1103, 741 + xy: 1205, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 831, 313 + xy: 797, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 865, 347 + xy: 831, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor-icon-editor rotate: false - xy: 831, 279 + xy: 865, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 327, 95 + xy: 453, 439 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor-icon-editor rotate: false - xy: 775, 841 + xy: 775, 861 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory-icon-editor rotate: false - xy: 453, 419 + xy: 551, 439 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 551, 419 + xy: 649, 469 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-icon-editor rotate: false - xy: 649, 449 + xy: 747, 469 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 1169, 741 + xy: 1139, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 865, 313 + xy: 831, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 parallax-icon-editor rotate: false - xy: 1235, 741 + xy: 1205, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 payload-conveyor-icon-editor rotate: false - xy: 747, 449 + xy: 845, 469 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon-editor rotate: false - xy: 845, 449 + xy: 1847, 827 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 865, 279 + xy: 865, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 627, 245 + xy: 865, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 661, 245 + xy: 627, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 695, 245 + xy: 661, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 1301, 741 + xy: 1271, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 1367, 741 + xy: 1205, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 1651, 691 + xy: 1733, 777 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 1433, 741 + xy: 1271, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-conveyor-icon-editor rotate: false - xy: 729, 245 + xy: 695, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-icon-editor rotate: false - xy: 763, 245 + xy: 729, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large-icon-editor rotate: false - xy: 1499, 741 + xy: 1271, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plated-conduit-icon-editor rotate: false - xy: 797, 245 + xy: 763, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 1565, 741 + xy: 1337, 729 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 831, 245 + xy: 797, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 1631, 741 + xy: 1337, 663 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 865, 245 + xy: 831, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 899, 379 + xy: 865, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 899, 345 + xy: 899, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 933, 379 + xy: 899, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 1697, 741 + xy: 1337, 597 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 899, 311 + xy: 899, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point-icon-editor rotate: false - xy: 1763, 741 + xy: 1009, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 1717, 807 + xy: 1945, 827 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rotary-pump-icon-editor rotate: false - xy: 1829, 741 + xy: 1075, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 933, 345 + xy: 899, 299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 1895, 741 + xy: 1141, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salt-wall-icon-editor rotate: false - xy: 967, 379 + xy: 899, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 1961, 741 + xy: 1207, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 899, 277 + xy: 459, 235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-wall-icon-editor rotate: false - xy: 933, 311 + xy: 459, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 967, 345 + xy: 493, 235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 1073, 675 + xy: 1273, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 933, 277 + xy: 459, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 1327, 873 + xy: 1457, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 1815, 807 + xy: 907, 763 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 967, 311 + xy: 493, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 1073, 609 + xy: 1339, 531 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 segment-icon-editor rotate: false - xy: 1139, 675 + xy: 1403, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 1139, 609 + xy: 1403, 695 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 967, 277 + xy: 527, 235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-wall-icon-editor rotate: false - xy: 899, 243 + xy: 493, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 933, 243 + xy: 527, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 967, 243 + xy: 561, 235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-crucible-icon-editor rotate: false - xy: 1913, 807 + xy: 909, 665 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 1205, 675 + xy: 1469, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snow-boulder-icon-editor rotate: false - xy: 1701, 691 + xy: 1667, 661 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-icon-editor rotate: false - xy: 1001, 379 + xy: 527, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 1751, 691 + xy: 131, 5 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-wall-icon-editor rotate: false - xy: 1001, 345 + xy: 561, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 1001, 311 + xy: 561, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 907, 743 + xy: 909, 567 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 1001, 277 + xy: 463, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 1001, 243 + xy: 463, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 1457, 873 + xy: 1587, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 1851, 699 + xy: 943, 459 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 1801, 691 + xy: 181, 5 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 1205, 609 + xy: 1403, 629 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-wall-icon-editor rotate: false - xy: 459, 215 + xy: 497, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 steam-generator-icon-editor rotate: false - xy: 1271, 675 + xy: 1469, 695 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stone-wall-icon-editor rotate: false - xy: 493, 215 + xy: 497, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 1271, 609 + xy: 1535, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 459, 181 + xy: 531, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 1337, 675 + xy: 1469, 629 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 1337, 609 + xy: 1535, 695 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 switch-icon-editor rotate: false - xy: 527, 215 + xy: 531, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 459, 147 + xy: 565, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tetrative-reconstructor-icon-editor rotate: false - xy: 323, 713 + xy: 323, 733 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 1403, 675 + xy: 1601, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 909, 645 + xy: 1005, 795 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 909, 547 + xy: 1103, 795 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 493, 181 + xy: 565, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 1403, 609 + xy: 1535, 629 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 1587, 873 + xy: 1717, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 561, 215 + xy: 469, 65 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 493, 147 + xy: 469, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 1469, 675 + xy: 1601, 695 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +tsunami-icon-editor + rotate: false + xy: 1201, 795 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 underflow-gate-icon-editor rotate: false - xy: 527, 181 + xy: 503, 65 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 527, 147 + xy: 503, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 1005, 775 + xy: 1299, 795 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 1469, 609 + xy: 1667, 761 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 1535, 675 + xy: 1601, 629 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 681 + xy: 1, 701 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 1, 359 + 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 @@ -11207,7 +13460,7 @@ alpha-bg index: -1 bar rotate: false - xy: 1807, 512 + xy: 950, 175 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -11215,7 +13468,7 @@ bar index: -1 bar-top rotate: false - xy: 1778, 512 + xy: 950, 213 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -11230,21 +13483,21 @@ block-additive-reconstructor-large index: -1 block-additive-reconstructor-medium rotate: false - xy: 1989, 723 + xy: 1571, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-additive-reconstructor-small rotate: false - xy: 983, 563 + xy: 2023, 789 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-additive-reconstructor-tiny rotate: false - xy: 1219, 438 + xy: 1549, 553 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11265,21 +13518,21 @@ block-air-factory-large index: -1 block-air-factory-medium rotate: false - xy: 881, 563 + xy: 1605, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-air-factory-small rotate: false - xy: 1009, 563 + xy: 1489, 399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-air-factory-tiny rotate: false - xy: 301, 1 + xy: 1009, 47 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11293,28 +13546,28 @@ block-air-factory-xlarge index: -1 block-alloy-smelter-large rotate: false - xy: 601, 288 + xy: 651, 283 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alloy-smelter-medium rotate: false - xy: 915, 563 + xy: 1639, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alloy-smelter-small rotate: false - xy: 2023, 731 + xy: 950, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 319, 1 + xy: 301, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11328,28 +13581,28 @@ block-alloy-smelter-xlarge index: -1 block-arc-large rotate: false - xy: 701, 383 + xy: 596, 191 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 949, 563 + xy: 1825, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 2023, 705 + xy: 979, 204 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 337, 1 + xy: 319, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11363,28 +13616,28 @@ block-arc-xlarge index: -1 block-armored-conveyor-large rotate: false - xy: 451, 74 + xy: 646, 241 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 877, 529 + xy: 881, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 2023, 679 + xy: 979, 178 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 959, 1 + xy: 337, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11398,28 +13651,28 @@ block-armored-conveyor-xlarge index: -1 block-basalt-large rotate: false - xy: 501, 124 + xy: 701, 324 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-basalt-medium rotate: false - xy: 911, 529 + xy: 915, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-basalt-small rotate: false - xy: 622, 126 + xy: 979, 152 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-basalt-tiny rotate: false - xy: 977, 1 + xy: 1403, 333 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11433,35 +13686,35 @@ block-basalt-xlarge index: -1 block-battery-large rotate: false - xy: 694, 341 + xy: 501, 74 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-large rotate: false - xy: 401, 24 + xy: 693, 282 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-medium rotate: false - xy: 877, 495 + xy: 877, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-large-small rotate: false - xy: 2016, 893 + xy: 1455, 367 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-large-tiny rotate: false - xy: 995, 1 + xy: 331, 598 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11475,21 +13728,21 @@ block-battery-large-xlarge index: -1 block-battery-medium rotate: false - xy: 911, 495 + xy: 911, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-small rotate: false - xy: 1038, 168 + xy: 1421, 346 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-tiny rotate: false - xy: 1013, 1 + xy: 309, 672 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11503,28 +13756,28 @@ block-battery-xlarge index: -1 block-blast-drill-large rotate: false - xy: 551, 193 + xy: 688, 240 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-drill-medium rotate: false - xy: 945, 529 + xy: 877, 503 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-small rotate: false - xy: 1038, 142 + xy: 485, 6 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-drill-tiny rotate: false - xy: 1031, 1 + xy: 331, 580 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11538,28 +13791,28 @@ block-blast-drill-xlarge index: -1 block-blast-mixer-large rotate: false - xy: 546, 151 + xy: 451, 35 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-mixer-medium rotate: false - xy: 877, 461 + xy: 911, 503 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-mixer-small rotate: false - xy: 1081, 414 + xy: 1013, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-mixer-tiny rotate: false - xy: 1049, 1 + xy: 1681, 345 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11573,28 +13826,28 @@ block-blast-mixer-xlarge index: -1 block-block-forge-large rotate: false - xy: 543, 109 + xy: 493, 32 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-forge-medium rotate: false - xy: 911, 461 + xy: 877, 469 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-forge-small rotate: false - xy: 1625, 484 + xy: 1039, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-forge-tiny rotate: false - xy: 331, 598 + xy: 355, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11608,28 +13861,28 @@ block-block-forge-xlarge index: -1 block-block-loader-large rotate: false - xy: 501, 82 + xy: 401, 8 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-loader-medium rotate: false - xy: 945, 495 + xy: 911, 469 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-loader-small rotate: false - xy: 1651, 484 + xy: 1065, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-loader-tiny rotate: false - xy: 1646, 315 + xy: 373, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11643,28 +13896,28 @@ block-block-loader-xlarge index: -1 block-block-unloader-large rotate: false - xy: 543, 67 + xy: 551, 91 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-unloader-medium rotate: false - xy: 877, 427 + xy: 877, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-unloader-small rotate: false - xy: 1677, 484 + xy: 1091, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-unloader-tiny rotate: false - xy: 1617, 289 + xy: 1421, 328 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11685,21 +13938,21 @@ block-boulder-large index: -1 block-boulder-medium rotate: false - xy: 911, 427 + xy: 911, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-boulder-small rotate: false - xy: 1115, 435 + xy: 1117, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-boulder-tiny rotate: false - xy: 309, 672 + xy: 1403, 315 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11720,21 +13973,21 @@ block-bridge-conduit-large index: -1 block-bridge-conduit-medium rotate: false - xy: 945, 461 + xy: 877, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conduit-small rotate: false - xy: 1141, 435 + xy: 1143, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conduit-tiny rotate: false - xy: 653, 32 + xy: 1421, 310 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11755,21 +14008,21 @@ block-bridge-conveyor-large index: -1 block-bridge-conveyor-medium rotate: false - xy: 945, 427 + xy: 911, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conveyor-small rotate: false - xy: 1167, 435 + xy: 1169, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conveyor-tiny rotate: false - xy: 331, 580 + xy: 1371, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11790,21 +14043,21 @@ block-char-large index: -1 block-char-medium rotate: false - xy: 1989, 689 + xy: 1673, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-small rotate: false - xy: 1193, 435 + xy: 1195, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-char-tiny rotate: false - xy: 1594, 263 + xy: 1373, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11825,21 +14078,21 @@ block-cliff-large index: -1 block-cliff-medium rotate: false - xy: 1129, 597 + xy: 1707, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliff-small rotate: false - xy: 1865, 509 + xy: 1221, 325 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cliff-tiny rotate: false - xy: 593, 199 + xy: 1373, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11860,21 +14113,21 @@ block-coal-centrifuge-large index: -1 block-coal-centrifuge-medium rotate: false - xy: 911, 393 + xy: 1741, 658 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-small rotate: false - xy: 1891, 509 + xy: 1007, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-coal-centrifuge-tiny rotate: false - xy: 611, 199 + xy: 1373, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11888,28 +14141,28 @@ block-coal-centrifuge-xlarge index: -1 block-combustion-generator-large rotate: false - xy: 793, 452 + xy: 751, 410 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-combustion-generator-medium rotate: false - xy: 945, 393 + xy: 1909, 731 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-combustion-generator-small rotate: false - xy: 1917, 509 + xy: 1033, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-combustion-generator-tiny rotate: false - xy: 1672, 360 + xy: 1373, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11923,28 +14176,28 @@ block-combustion-generator-xlarge index: -1 block-command-center-large rotate: false - xy: 835, 494 + xy: 793, 452 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-command-center-medium rotate: false - xy: 1083, 576 + xy: 1867, 709 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-command-center-small rotate: false - xy: 1943, 509 + xy: 1059, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-command-center-tiny rotate: false - xy: 1690, 360 + xy: 1439, 323 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11958,28 +14211,28 @@ block-command-center-xlarge index: -1 block-conduit-large rotate: false - xy: 835, 452 + xy: 835, 494 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conduit-medium rotate: false - xy: 1217, 618 + xy: 1499, 597 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-small rotate: false - xy: 1969, 509 + xy: 1085, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conduit-tiny rotate: false - xy: 1708, 360 + xy: 1457, 323 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11993,28 +14246,28 @@ block-conduit-xlarge index: -1 block-container-large rotate: false - xy: 751, 410 + xy: 751, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-container-medium rotate: false - xy: 1251, 618 + xy: 1951, 749 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-small rotate: false - xy: 553, 1 + xy: 1111, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-container-tiny rotate: false - xy: 1726, 360 + xy: 1475, 323 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12035,21 +14288,21 @@ block-conveyor-large index: -1 block-conveyor-medium rotate: false - xy: 1285, 618 + xy: 1007, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-small rotate: false - xy: 579, 1 + xy: 1137, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conveyor-tiny rotate: false - xy: 1744, 360 + xy: 1493, 323 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12063,35 +14316,35 @@ block-conveyor-xlarge index: -1 block-copper-wall-large rotate: false - xy: 835, 410 + xy: 835, 452 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-large rotate: false - xy: 743, 368 + xy: 793, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-medium rotate: false - xy: 1319, 618 + xy: 1041, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-small rotate: false - xy: 605, 1 + xy: 1163, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-large-tiny rotate: false - xy: 1762, 360 + xy: 1439, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12105,21 +14358,21 @@ block-copper-wall-large-xlarge index: -1 block-copper-wall-medium rotate: false - xy: 1353, 618 + xy: 1075, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-small rotate: false - xy: 631, 1 + xy: 1189, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-tiny rotate: false - xy: 355, 8 + xy: 1457, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12133,28 +14386,28 @@ block-copper-wall-xlarge index: -1 block-core-foundation-large rotate: false - xy: 785, 368 + xy: 835, 410 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-foundation-medium rotate: false - xy: 1387, 618 + xy: 1109, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-small rotate: false - xy: 657, 1 + xy: 1215, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-foundation-tiny rotate: false - xy: 373, 8 + xy: 1475, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12168,28 +14421,28 @@ block-core-foundation-xlarge index: -1 block-core-nucleus-large rotate: false - xy: 827, 368 + xy: 835, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-nucleus-medium rotate: false - xy: 1421, 618 + xy: 1143, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-nucleus-small rotate: false - xy: 683, 1 + xy: 1009, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-nucleus-tiny rotate: false - xy: 1635, 289 + xy: 1493, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12203,28 +14456,28 @@ block-core-nucleus-xlarge index: -1 block-core-shard-large rotate: false - xy: 736, 326 + xy: 646, 199 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-shard-medium rotate: false - xy: 1455, 618 + xy: 1177, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-shard-small rotate: false - xy: 1107, 409 + xy: 1009, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-shard-tiny rotate: false - xy: 1568, 246 + xy: 2029, 661 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12238,28 +14491,28 @@ block-core-shard-xlarge index: -1 block-craters-large rotate: false - xy: 778, 326 + xy: 688, 198 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-craters-medium rotate: false - xy: 1489, 618 + xy: 1211, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-craters-small rotate: false - xy: 1133, 409 + xy: 1035, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-craters-tiny rotate: false - xy: 1197, 621 + xy: 1365, 47 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12271,35 +14524,35 @@ block-craters-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-cryofluidmixer-large +block-cryofluid-mixer-large rotate: false - xy: 820, 326 + xy: 543, 49 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cryofluidmixer-medium +block-cryofluid-mixer-medium rotate: false - xy: 1523, 618 + xy: 1245, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cryofluidmixer-small +block-cryofluid-mixer-small rotate: false - xy: 1159, 409 + xy: 1035, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cryofluidmixer-tiny +block-cryofluid-mixer-tiny rotate: false - xy: 1197, 603 + xy: 1365, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cryofluidmixer-xlarge +block-cryofluid-mixer-xlarge rotate: false xy: 907, 975 size: 48, 48 @@ -12308,28 +14561,28 @@ block-cryofluidmixer-xlarge index: -1 block-cultivator-large rotate: false - xy: 694, 299 + xy: 535, 7 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cultivator-medium rotate: false - xy: 1557, 618 + xy: 1279, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cultivator-small rotate: false - xy: 1185, 409 + xy: 1061, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cultivator-tiny rotate: false - xy: 1755, 498 + xy: 1365, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12343,28 +14596,28 @@ block-cultivator-xlarge index: -1 block-cyclone-large rotate: false - xy: 736, 284 + xy: 596, 149 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cyclone-medium rotate: false - xy: 1591, 618 + xy: 1313, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cyclone-small rotate: false - xy: 1703, 482 + xy: 1061, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cyclone-tiny rotate: false - xy: 1067, 240 + xy: 2030, 883 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12378,28 +14631,28 @@ block-cyclone-xlarge index: -1 block-dacite-boulder-large rotate: false - xy: 778, 284 + xy: 638, 157 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dacite-boulder-medium rotate: false - xy: 1625, 618 + xy: 1347, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dacite-boulder-small rotate: false - xy: 1729, 482 + xy: 1087, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dacite-boulder-tiny rotate: false - xy: 1067, 222 + xy: 2030, 865 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12413,56 +14666,56 @@ block-dacite-boulder-xlarge index: -1 block-dacite-large rotate: false - xy: 820, 284 + xy: 680, 156 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dacite-medium rotate: false - xy: 1659, 618 + xy: 1381, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dacite-small rotate: false - xy: 1211, 409 + xy: 1087, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dacite-tiny rotate: false - xy: 1067, 204 + xy: 1373, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dacite-wall-large rotate: false - xy: 443, 24 + xy: 594, 107 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dacite-wall-medium rotate: false - xy: 1693, 618 + xy: 1415, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dacite-wall-small rotate: false - xy: 553, 41 + xy: 1113, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dacite-wall-tiny rotate: false - xy: 2025, 841 + xy: 1697, 397 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12483,28 +14736,28 @@ block-dacite-xlarge index: -1 block-dark-metal-large rotate: false - xy: 869, 368 + xy: 593, 65 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-metal-medium rotate: false - xy: 1727, 618 + xy: 949, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-metal-small rotate: false - xy: 579, 31 + xy: 1113, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-metal-tiny rotate: false - xy: 2024, 823 + xy: 1697, 379 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12518,28 +14771,28 @@ block-dark-metal-xlarge index: -1 block-dark-panel-1-large rotate: false - xy: 862, 326 + xy: 638, 115 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-1-medium rotate: false - xy: 1761, 618 + xy: 945, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-1-small rotate: false - xy: 605, 31 + xy: 1139, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-1-tiny rotate: false - xy: 2024, 805 + xy: 1347, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12553,28 +14806,28 @@ block-dark-panel-1-xlarge index: -1 block-dark-panel-2-large rotate: false - xy: 862, 284 + xy: 680, 114 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-2-medium rotate: false - xy: 1795, 618 + xy: 945, 503 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-2-small rotate: false - xy: 1557, 462 + xy: 1139, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-2-tiny rotate: false - xy: 2024, 787 + xy: 1343, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12588,28 +14841,28 @@ block-dark-panel-2-xlarge index: -1 block-dark-panel-3-large rotate: false - xy: 643, 288 + xy: 743, 324 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-3-medium rotate: false - xy: 1829, 618 + xy: 945, 469 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-3-small rotate: false - xy: 1583, 462 + xy: 1165, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-3-tiny rotate: false - xy: 2024, 769 + xy: 1343, 173 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12623,28 +14876,28 @@ block-dark-panel-3-xlarge index: -1 block-dark-panel-4-large rotate: false - xy: 904, 326 + xy: 735, 282 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-4-medium rotate: false - xy: 1863, 618 + xy: 945, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-4-small rotate: false - xy: 1995, 509 + xy: 1165, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-4-tiny rotate: false - xy: 1067, 186 + xy: 1343, 155 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12658,28 +14911,28 @@ block-dark-panel-4-xlarge index: -1 block-dark-panel-5-large rotate: false - xy: 904, 284 + xy: 730, 240 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-5-medium rotate: false - xy: 1163, 597 + xy: 945, 401 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-5-small rotate: false - xy: 1609, 458 + xy: 1191, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-5-tiny rotate: false - xy: 1064, 168 + xy: 1343, 137 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12693,28 +14946,28 @@ block-dark-panel-5-xlarge index: -1 block-dark-panel-6-large rotate: false - xy: 821, 933 + xy: 730, 198 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-6-medium rotate: false - xy: 1901, 637 + xy: 1901, 697 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-6-small rotate: false - xy: 1635, 458 + xy: 1191, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-6-tiny rotate: false - xy: 1064, 150 + xy: 1343, 119 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12728,49 +14981,49 @@ block-dark-panel-6-xlarge index: -1 block-darksand-large rotate: false - xy: 863, 933 + xy: 722, 156 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-medium rotate: false - xy: 1897, 603 + xy: 1859, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-small rotate: false - xy: 1661, 458 + xy: 1217, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-large rotate: false - xy: 905, 933 + xy: 722, 114 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-tainted-water-medium rotate: false - xy: 1935, 637 + xy: 1893, 663 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-tainted-water-small rotate: false - xy: 1687, 456 + xy: 1217, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-tiny rotate: false - xy: 1064, 132 + xy: 1655, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12784,35 +15037,35 @@ block-darksand-tainted-water-xlarge index: -1 block-darksand-tiny rotate: false - xy: 1064, 114 + xy: 1652, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-water-large rotate: false - xy: 947, 933 + xy: 785, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-water-medium rotate: false - xy: 1931, 603 + xy: 1943, 715 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-water-small rotate: false - xy: 1713, 456 + xy: 1009, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-water-tiny rotate: false - xy: 1061, 96 + xy: 1673, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12833,28 +15086,28 @@ block-darksand-xlarge index: -1 block-deepwater-large rotate: false - xy: 989, 933 + xy: 827, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-deepwater-medium rotate: false - xy: 1117, 563 + xy: 1935, 681 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-deepwater-small rotate: false - xy: 1739, 456 + xy: 1035, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-deepwater-tiny rotate: false - xy: 1061, 78 + xy: 1670, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12868,28 +15121,28 @@ block-deepwater-xlarge index: -1 block-differential-generator-large rotate: false - xy: 1031, 933 + xy: 577, 7 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-differential-generator-medium rotate: false - xy: 1151, 563 + xy: 1927, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-differential-generator-small rotate: false - xy: 1219, 456 + xy: 1061, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-differential-generator-tiny rotate: false - xy: 1061, 60 + xy: 1691, 327 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12903,28 +15156,28 @@ block-differential-generator-xlarge index: -1 block-diode-large rotate: false - xy: 1073, 933 + xy: 777, 282 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-diode-medium rotate: false - xy: 1185, 563 + xy: 1741, 624 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-diode-small rotate: false - xy: 1245, 456 + xy: 1087, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-diode-tiny rotate: false - xy: 1061, 42 + xy: 1511, 319 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12938,56 +15191,56 @@ block-diode-xlarge index: -1 block-dirt-large rotate: false - xy: 1115, 933 + xy: 772, 240 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dirt-medium rotate: false - xy: 1219, 584 + xy: 1707, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dirt-small rotate: false - xy: 1271, 456 + xy: 1113, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dirt-tiny rotate: false - xy: 1061, 24 + xy: 1529, 319 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dirt-wall-large rotate: false - xy: 1157, 933 + xy: 772, 198 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dirt-wall-medium rotate: false - xy: 1253, 584 + xy: 1741, 590 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dirt-wall-small rotate: false - xy: 1297, 456 + xy: 1139, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dirt-wall-tiny rotate: false - xy: 1586, 245 + xy: 1547, 319 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13008,28 +15261,28 @@ block-dirt-xlarge index: -1 block-disassembler-large rotate: false - xy: 1199, 933 + xy: 764, 156 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-disassembler-medium rotate: false - xy: 1287, 584 + xy: 1993, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-disassembler-small rotate: false - xy: 1323, 456 + xy: 1165, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-disassembler-tiny rotate: false - xy: 1773, 494 + xy: 1511, 301 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13043,28 +15296,28 @@ block-disassembler-xlarge index: -1 block-distributor-large rotate: false - xy: 1241, 933 + xy: 764, 114 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-distributor-medium rotate: false - xy: 1321, 584 + xy: 1989, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-distributor-small rotate: false - xy: 1349, 456 + xy: 1191, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-distributor-tiny rotate: false - xy: 1791, 494 + xy: 1529, 301 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13078,35 +15331,35 @@ block-distributor-xlarge index: -1 block-door-large rotate: false - xy: 1283, 933 + xy: 819, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-large rotate: false - xy: 1325, 933 + xy: 869, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-medium rotate: false - xy: 1355, 584 + xy: 1985, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-large-small rotate: false - xy: 1375, 456 + xy: 1217, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-large-tiny rotate: false - xy: 1809, 494 + xy: 1547, 301 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13120,21 +15373,21 @@ block-door-large-xlarge index: -1 block-door-medium rotate: false - xy: 1389, 584 + xy: 1977, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-small rotate: false - xy: 1401, 456 + xy: 1005, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-tiny rotate: false - xy: 1827, 494 + xy: 1565, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13148,28 +15401,28 @@ block-door-xlarge index: -1 block-dune-wall-large rotate: false - xy: 1367, 933 + xy: 861, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dune-wall-medium rotate: false - xy: 1423, 584 + xy: 1969, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dune-wall-small rotate: false - xy: 1427, 456 + xy: 1005, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dune-wall-tiny rotate: false - xy: 1845, 498 + xy: 1583, 307 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13183,28 +15436,28 @@ block-dune-wall-xlarge index: -1 block-duo-large rotate: false - xy: 1409, 933 + xy: 806, 156 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-duo-medium rotate: false - xy: 1457, 584 + xy: 1961, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-small rotate: false - xy: 1453, 456 + xy: 1031, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-duo-tiny rotate: false - xy: 1863, 491 + xy: 1601, 298 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13218,28 +15471,28 @@ block-duo-xlarge index: -1 block-exponential-reconstructor-large rotate: false - xy: 1451, 933 + xy: 806, 114 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-exponential-reconstructor-medium rotate: false - xy: 1491, 584 + xy: 1775, 658 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-exponential-reconstructor-small rotate: false - xy: 1479, 456 + xy: 1031, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-exponential-reconstructor-tiny rotate: false - xy: 1881, 491 + xy: 1565, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13253,28 +15506,28 @@ block-exponential-reconstructor-xlarge index: -1 block-force-projector-large rotate: false - xy: 1493, 933 + xy: 903, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-force-projector-medium rotate: false - xy: 1525, 584 + xy: 1775, 624 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-force-projector-small rotate: false - xy: 1505, 456 + xy: 1057, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-force-projector-tiny rotate: false - xy: 1899, 491 + xy: 1583, 289 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13286,5469 +15539,5609 @@ block-force-projector-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-fuse-large +block-foreshadow-large rotate: false - xy: 1535, 933 + xy: 821, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-fuse-medium +block-foreshadow-medium rotate: false - xy: 1559, 584 + xy: 1775, 590 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-fuse-small +block-foreshadow-small rotate: false - xy: 1531, 456 + xy: 1057, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-fuse-tiny +block-foreshadow-tiny rotate: false - xy: 1917, 491 + xy: 1601, 280 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-fuse-xlarge +block-foreshadow-xlarge rotate: false xy: 695, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-graphite-press-large +block-fuse-large rotate: false - xy: 1577, 933 + xy: 863, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-graphite-press-medium +block-fuse-medium rotate: false - xy: 1593, 584 + xy: 1809, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-graphite-press-small +block-fuse-small rotate: false - xy: 1557, 436 + xy: 1083, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-graphite-press-tiny +block-fuse-tiny rotate: false - xy: 1935, 491 + xy: 1619, 293 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-graphite-press-xlarge +block-fuse-xlarge rotate: false xy: 101, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-grass-large +block-graphite-press-large rotate: false - xy: 1619, 933 + xy: 905, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-grass-medium +block-graphite-press-medium rotate: false - xy: 1627, 584 + xy: 1809, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-grass-small +block-graphite-press-small rotate: false - xy: 1583, 436 + xy: 1083, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-grass-tiny +block-graphite-press-tiny rotate: false - xy: 1953, 491 + xy: 1619, 275 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-grass-xlarge +block-graphite-press-xlarge rotate: false xy: 101, 428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ground-factory-large +block-grass-large rotate: false - xy: 1661, 933 + xy: 947, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ground-factory-medium +block-grass-medium rotate: false - xy: 1661, 584 + xy: 1809, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ground-factory-small +block-grass-small rotate: false - xy: 1609, 432 + xy: 1109, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ground-factory-tiny +block-grass-tiny rotate: false - xy: 1971, 491 + xy: 1361, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ground-factory-xlarge +block-grass-xlarge rotate: false xy: 101, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hail-large +block-ground-factory-large rotate: false - xy: 1703, 933 + xy: 989, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hail-medium +block-ground-factory-medium rotate: false - xy: 1695, 584 + xy: 1843, 641 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hail-small +block-ground-factory-small rotate: false - xy: 1635, 432 + xy: 1109, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hail-tiny +block-ground-factory-tiny rotate: false - xy: 1989, 491 + xy: 1361, 173 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hail-xlarge +block-ground-factory-xlarge rotate: false xy: 101, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hotrock-large +block-hail-large rotate: false - xy: 1745, 933 + xy: 1031, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hotrock-medium +block-hail-medium rotate: false - xy: 1729, 584 + xy: 1843, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hotrock-small +block-hail-small rotate: false - xy: 1661, 432 + xy: 1135, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hotrock-tiny +block-hail-tiny rotate: false - xy: 2007, 491 + xy: 1361, 155 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hotrock-xlarge +block-hail-xlarge rotate: false xy: 101, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hyper-processor-large +block-hotrock-large rotate: false - xy: 1787, 933 + xy: 1073, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hyper-processor-medium +block-hotrock-medium rotate: false - xy: 1763, 584 + xy: 1843, 573 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hyper-processor-small +block-hotrock-small rotate: false - xy: 1687, 430 + xy: 1135, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hyper-processor-tiny +block-hotrock-tiny rotate: false - xy: 1845, 480 + xy: 1361, 137 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hyper-processor-xlarge +block-hotrock-xlarge rotate: false xy: 101, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-large +block-hyper-processor-large rotate: false - xy: 1829, 933 + xy: 1115, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ice-medium +block-hyper-processor-medium rotate: false - xy: 1797, 584 + xy: 1877, 629 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ice-small +block-hyper-processor-small rotate: false - xy: 1713, 430 + xy: 1161, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ice-snow-large +block-hyper-processor-tiny rotate: false - xy: 1871, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 1831, 584 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 1739, 430 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 1863, 473 + xy: 1361, 119 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ice-snow-xlarge +block-hyper-processor-xlarge rotate: false xy: 101, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-tiny +block-ice-large rotate: false - xy: 1881, 473 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-large - rotate: false - xy: 1913, 933 + xy: 1157, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ice-wall-medium +block-ice-medium rotate: false - xy: 1219, 550 + xy: 1877, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ice-wall-small +block-ice-small rotate: false - xy: 1237, 430 + xy: 1161, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ice-wall-tiny +block-ice-snow-large rotate: false - xy: 1899, 473 + xy: 1199, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-snow-medium + rotate: false + xy: 1877, 561 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-small + rotate: false + xy: 1187, 195 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-tiny + rotate: false + xy: 1366, 101 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ice-wall-xlarge +block-ice-snow-xlarge rotate: false xy: 101, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-xlarge +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-ice-wall-medium + rotate: false + xy: 1911, 613 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-small + rotate: false + xy: 1187, 169 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-wall-tiny + rotate: false + xy: 1379, 181 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-wall-xlarge rotate: false xy: 101, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-illuminator-large - rotate: false - xy: 1955, 933 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-illuminator-medium - rotate: false - xy: 1253, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-illuminator-small - rotate: false - xy: 1263, 430 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-illuminator-tiny - rotate: false - xy: 1917, 473 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-illuminator-xlarge +block-ice-xlarge rotate: false xy: 101, 28 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-impact-reactor-large +block-illuminator-large rotate: false - xy: 845, 891 + xy: 1283, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-impact-reactor-medium +block-illuminator-medium rotate: false - xy: 1287, 550 + xy: 1911, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-impact-reactor-small +block-illuminator-small rotate: false - xy: 1289, 430 + xy: 1213, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-impact-reactor-tiny +block-illuminator-tiny rotate: false - xy: 1935, 473 + xy: 1379, 163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-impact-reactor-xlarge +block-illuminator-xlarge rotate: false xy: 231, 608 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-incinerator-large +block-impact-reactor-large rotate: false - xy: 887, 891 + xy: 1325, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-incinerator-medium +block-impact-reactor-medium rotate: false - xy: 1321, 550 + xy: 1945, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-incinerator-small +block-impact-reactor-small rotate: false - xy: 1315, 430 + xy: 1213, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-incinerator-tiny +block-impact-reactor-tiny rotate: false - xy: 1953, 473 + xy: 1379, 145 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-incinerator-xlarge +block-impact-reactor-xlarge rotate: false xy: 231, 558 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-inverted-sorter-large +block-incinerator-large rotate: false - xy: 929, 891 + xy: 1367, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-inverted-sorter-medium +block-incinerator-medium rotate: false - xy: 1355, 550 + xy: 1945, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-inverted-sorter-small +block-incinerator-small rotate: false - xy: 1341, 430 + xy: 1005, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-inverted-sorter-tiny +block-incinerator-tiny rotate: false - xy: 1971, 473 + xy: 1379, 127 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-inverted-sorter-xlarge +block-incinerator-xlarge rotate: false xy: 745, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-item-source-large +block-inverted-sorter-large rotate: false - xy: 971, 891 + xy: 1409, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-item-source-medium +block-inverted-sorter-medium rotate: false - xy: 1389, 550 + xy: 1911, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-item-source-small +block-inverted-sorter-small rotate: false - xy: 1367, 430 + xy: 1031, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-item-source-tiny +block-inverted-sorter-tiny rotate: false - xy: 1989, 473 + xy: 1384, 109 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-item-source-xlarge +block-inverted-sorter-xlarge rotate: false xy: 151, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-item-void-large +block-item-source-large rotate: false - xy: 1013, 891 + xy: 1451, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-item-void-medium +block-item-source-medium rotate: false - xy: 1423, 550 + xy: 1945, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-item-void-small +block-item-source-small rotate: false - xy: 1393, 430 + xy: 1057, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-item-void-tiny +block-item-source-tiny rotate: false - xy: 2007, 473 + xy: 1384, 91 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-item-void-xlarge +block-item-source-xlarge rotate: false xy: 151, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-junction-large +block-item-void-large rotate: false - xy: 1055, 891 + xy: 1493, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-junction-medium +block-item-void-medium rotate: false - xy: 1457, 550 + xy: 1979, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-junction-small +block-item-void-small rotate: false - xy: 1419, 430 + xy: 1083, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-junction-tiny +block-item-void-tiny rotate: false - xy: 1617, 271 + xy: 1373, 73 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-junction-xlarge +block-item-void-xlarge rotate: false xy: 201, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-kiln-large +block-junction-large rotate: false - xy: 1097, 891 + xy: 1535, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-kiln-medium +block-junction-medium rotate: false - xy: 1491, 550 + xy: 1979, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-kiln-small +block-junction-small rotate: false - xy: 1445, 430 + xy: 1109, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-kiln-tiny +block-junction-tiny rotate: false - xy: 1635, 271 + xy: 1391, 73 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-kiln-xlarge +block-junction-xlarge rotate: false xy: 151, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-lancer-large +block-kiln-large rotate: false - xy: 1139, 891 + xy: 1577, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-lancer-medium +block-kiln-medium rotate: false - xy: 1525, 550 + xy: 1979, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-lancer-small +block-kiln-small rotate: false - xy: 1471, 430 + xy: 1135, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-lancer-tiny +block-kiln-tiny rotate: false - xy: 1604, 245 + xy: 1383, 55 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-lancer-xlarge +block-kiln-xlarge rotate: false xy: 201, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-large-logic-display-large +block-lancer-large rotate: false - xy: 1181, 891 + xy: 1619, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-large-logic-display-medium +block-lancer-medium rotate: false - xy: 1559, 550 + xy: 1995, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-large-logic-display-small +block-lancer-small rotate: false - xy: 1497, 430 + xy: 1161, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-large-logic-display-tiny +block-lancer-tiny rotate: false - xy: 1622, 253 + xy: 1383, 37 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-large-logic-display-xlarge +block-lancer-xlarge rotate: false xy: 151, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-laser-drill-large +block-large-logic-display-large rotate: false - xy: 1223, 891 + xy: 1661, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-laser-drill-medium +block-large-logic-display-medium rotate: false - xy: 1593, 550 + xy: 2003, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-laser-drill-small +block-large-logic-display-small rotate: false - xy: 1523, 430 + xy: 1187, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-laser-drill-tiny +block-large-logic-display-tiny rotate: false - xy: 1640, 253 + xy: 1383, 19 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-laser-drill-xlarge +block-large-logic-display-xlarge rotate: false xy: 201, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-launch-pad-large +block-laser-drill-large rotate: false - xy: 1265, 891 + xy: 1703, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-launch-pad-large-large +block-laser-drill-medium rotate: false - xy: 1307, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 1627, 550 + xy: 2011, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-launch-pad-large-small +block-laser-drill-small rotate: false - xy: 1237, 404 + xy: 1213, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-launch-pad-large-tiny +block-laser-drill-tiny rotate: false - xy: 1622, 235 + xy: 1383, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-launch-pad-large-xlarge +block-laser-drill-xlarge rotate: false xy: 151, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-launch-pad-medium +block-launch-pad-large rotate: false - xy: 1661, 550 + xy: 1745, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-large + rotate: false + xy: 1787, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-medium + rotate: false + xy: 2013, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-launch-pad-small +block-launch-pad-large-small rotate: false - xy: 1263, 404 + xy: 979, 126 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-launch-pad-tiny +block-launch-pad-large-tiny rotate: false - xy: 1640, 235 + xy: 1401, 55 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-launch-pad-xlarge +block-launch-pad-large-xlarge rotate: false xy: 201, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-junction-large +block-launch-pad-medium rotate: false - xy: 1349, 891 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 1695, 550 + xy: 2013, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-junction-small +block-launch-pad-small rotate: false - xy: 1289, 404 + xy: 976, 100 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-junction-tiny +block-launch-pad-tiny rotate: false - xy: 1067, 6 + xy: 1401, 37 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-junction-xlarge +block-launch-pad-xlarge rotate: false xy: 151, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-router-large +block-liquid-junction-large rotate: false - xy: 1391, 891 + xy: 1829, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-router-medium +block-liquid-junction-medium rotate: false - xy: 1729, 550 + xy: 2013, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-router-small +block-liquid-junction-small rotate: false - xy: 1315, 404 + xy: 1005, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-router-tiny +block-liquid-junction-tiny rotate: false - xy: 391, 6 + xy: 1401, 19 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-router-xlarge +block-liquid-junction-xlarge rotate: false xy: 201, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-source-large +block-liquid-router-large rotate: false - xy: 1433, 891 + xy: 1871, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-source-medium +block-liquid-router-medium rotate: false - xy: 1763, 550 + xy: 1536, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-source-small +block-liquid-router-small rotate: false - xy: 1341, 404 + xy: 1031, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-source-tiny +block-liquid-router-tiny rotate: false - xy: 409, 6 + xy: 1401, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-source-xlarge +block-liquid-router-xlarge rotate: false xy: 151, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-tank-large +block-liquid-source-large rotate: false - xy: 1475, 891 + xy: 1913, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-tank-medium +block-liquid-source-medium rotate: false - xy: 1797, 550 + xy: 1571, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-tank-small +block-liquid-source-small rotate: false - xy: 1367, 404 + xy: 1057, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-tank-tiny +block-liquid-source-tiny rotate: false - xy: 427, 6 + xy: 1703, 561 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-tank-xlarge +block-liquid-source-xlarge rotate: false xy: 201, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-void-large +block-liquid-tank-large rotate: false - xy: 1517, 891 + xy: 1955, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-void-medium +block-liquid-tank-medium rotate: false - xy: 1831, 550 + xy: 1605, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-void-small +block-liquid-tank-small rotate: false - xy: 1393, 404 + xy: 1083, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-void-tiny +block-liquid-tank-tiny rotate: false - xy: 445, 6 + xy: 1721, 563 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-void-xlarge +block-liquid-tank-xlarge rotate: false xy: 151, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-logic-display-large +block-liquid-void-large rotate: false - xy: 1559, 891 + xy: 845, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-logic-display-medium +block-liquid-void-medium rotate: false - xy: 946, 359 + xy: 1639, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-logic-display-small +block-liquid-void-small rotate: false - xy: 1419, 404 + xy: 1109, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-logic-display-tiny +block-liquid-void-tiny rotate: false - xy: 463, 6 + xy: 1688, 306 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-logic-display-xlarge +block-liquid-void-xlarge rotate: false xy: 201, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-logic-processor-large +block-logic-display-large rotate: false - xy: 1601, 891 + xy: 887, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-logic-processor-medium +block-logic-display-medium rotate: false - xy: 946, 325 + xy: 1673, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-logic-processor-small +block-logic-display-small rotate: false - xy: 1445, 404 + xy: 1135, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-logic-processor-tiny +block-logic-display-tiny rotate: false - xy: 1664, 315 + xy: 1637, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-logic-processor-xlarge +block-logic-display-xlarge rotate: false xy: 151, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-magmarock-large +block-logic-processor-large rotate: false - xy: 1643, 891 + xy: 929, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-magmarock-medium +block-logic-processor-medium rotate: false - xy: 946, 291 + xy: 1707, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-magmarock-small +block-logic-processor-small rotate: false - xy: 1471, 404 + xy: 1161, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-magmarock-tiny +block-logic-processor-tiny rotate: false - xy: 1653, 297 + xy: 1655, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-magmarock-xlarge +block-logic-processor-xlarge rotate: false xy: 201, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mass-driver-large +block-magmarock-large rotate: false - xy: 1685, 891 + xy: 971, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mass-driver-medium +block-magmarock-medium rotate: false - xy: 946, 257 + xy: 1741, 556 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mass-driver-small +block-magmarock-small rotate: false - xy: 1497, 404 + xy: 1187, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mass-driver-tiny +block-magmarock-tiny rotate: false - xy: 1653, 279 + xy: 1673, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mass-driver-xlarge +block-magmarock-xlarge rotate: false xy: 151, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mechanical-drill-large +block-mass-driver-large rotate: false - xy: 1727, 891 + xy: 1013, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mechanical-drill-medium +block-mass-driver-medium rotate: false - xy: 588, 159 + xy: 1775, 556 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mechanical-drill-small +block-mass-driver-small rotate: false - xy: 1523, 404 + xy: 1213, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mechanical-drill-tiny +block-mass-driver-tiny rotate: false - xy: 1671, 297 + xy: 1691, 288 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mechanical-drill-xlarge +block-mass-driver-xlarge rotate: false xy: 201, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mechanical-pump-large +block-mechanical-drill-large rotate: false - xy: 1769, 891 + xy: 1055, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mechanical-pump-medium +block-mechanical-drill-medium rotate: false - xy: 588, 125 + xy: 1809, 553 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mechanical-pump-small +block-mechanical-drill-small rotate: false - xy: 1549, 410 + xy: 1002, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mechanical-pump-tiny +block-mechanical-drill-tiny rotate: false - xy: 1671, 279 + xy: 1637, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mechanical-pump-xlarge +block-mechanical-drill-xlarge rotate: false xy: 201, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-meltdown-large +block-mechanical-pump-large rotate: false - xy: 1811, 891 + xy: 1097, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-meltdown-medium +block-mechanical-pump-medium rotate: false - xy: 585, 91 + xy: 1843, 539 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-meltdown-small +block-mechanical-pump-small rotate: false - xy: 1575, 410 + xy: 1028, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-meltdown-tiny +block-mechanical-pump-tiny rotate: false - xy: 1658, 261 + xy: 1655, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-meltdown-xlarge +block-mechanical-pump-xlarge rotate: false xy: 251, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-melter-large +block-meltdown-large rotate: false - xy: 1853, 891 + xy: 1139, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-melter-medium +block-meltdown-medium rotate: false - xy: 585, 57 + xy: 1877, 527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-melter-small +block-meltdown-small rotate: false - xy: 1601, 406 + xy: 1054, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-melter-tiny +block-meltdown-tiny rotate: false - xy: 1658, 243 + xy: 1673, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-melter-xlarge +block-meltdown-xlarge rotate: false xy: 251, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-memory-cell-large +block-melter-large rotate: false - xy: 1895, 891 + xy: 1181, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-memory-cell-medium +block-melter-medium rotate: false - xy: 596, 251 + xy: 1911, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-memory-cell-small +block-melter-small rotate: false - xy: 1627, 406 + xy: 1080, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-memory-cell-tiny +block-melter-tiny rotate: false - xy: 1676, 261 + xy: 1691, 270 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-memory-cell-xlarge +block-melter-xlarge rotate: false xy: 251, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mend-projector-large +block-memory-bank-large rotate: false - xy: 1937, 891 + xy: 1223, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mend-projector-medium +block-memory-bank-medium rotate: false - xy: 630, 254 + xy: 1945, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mend-projector-small +block-memory-bank-small rotate: false - xy: 1653, 406 + xy: 1106, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mend-projector-tiny +block-memory-bank-tiny rotate: false - xy: 1676, 243 + xy: 1721, 545 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mend-projector-xlarge +block-memory-bank-xlarge rotate: false xy: 251, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mender-large +block-memory-cell-large rotate: false - xy: 859, 849 + xy: 1265, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mender-medium +block-memory-cell-medium rotate: false - xy: 664, 254 + xy: 1979, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mender-small +block-memory-cell-small rotate: false - xy: 1679, 404 + xy: 1132, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mender-tiny +block-memory-cell-tiny rotate: false - xy: 1658, 225 + xy: 1739, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mender-xlarge +block-memory-cell-xlarge rotate: false xy: 251, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-message-large +block-mend-projector-large rotate: false - xy: 859, 807 + xy: 1307, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-message-medium +block-mend-projector-medium rotate: false - xy: 698, 265 + xy: 2013, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-message-small +block-mend-projector-small rotate: false - xy: 1705, 404 + xy: 1158, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-message-tiny +block-mend-projector-tiny rotate: false - xy: 1676, 225 + xy: 1757, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-message-xlarge +block-mend-projector-xlarge rotate: false xy: 251, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-2-large +block-mender-large rotate: false - xy: 901, 849 + xy: 1349, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-2-medium +block-mender-medium rotate: false - xy: 596, 217 + xy: 1449, 576 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-2-small +block-mender-small rotate: false - xy: 1731, 404 + xy: 1184, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-2-tiny +block-mender-tiny rotate: false - xy: 1542, 235 + xy: 1775, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-2-xlarge +block-mender-xlarge rotate: false xy: 251, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-3-large +block-message-large rotate: false - xy: 859, 765 + xy: 1391, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-3-medium +block-message-medium rotate: false - xy: 630, 220 + xy: 1570, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-3-small +block-message-small rotate: false - xy: 1757, 404 + xy: 1210, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-3-tiny +block-message-tiny rotate: false - xy: 1780, 360 + xy: 1705, 527 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-3-xlarge +block-message-xlarge rotate: false xy: 251, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-5-large +block-metal-floor-2-large rotate: false - xy: 943, 849 + xy: 1433, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-5-medium +block-metal-floor-2-medium rotate: false - xy: 664, 220 + xy: 1604, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-5-small +block-metal-floor-2-small rotate: false - xy: 1549, 384 + xy: 1009, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-5-tiny +block-metal-floor-2-tiny rotate: false - xy: 1085, 235 + xy: 1705, 509 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-5-xlarge +block-metal-floor-2-xlarge rotate: false xy: 251, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-damaged-large +block-metal-floor-3-large rotate: false - xy: 901, 807 + xy: 1475, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-damaged-medium +block-metal-floor-3-medium rotate: false - xy: 698, 231 + xy: 1638, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-damaged-small +block-metal-floor-3-small rotate: false - xy: 1575, 384 + xy: 1035, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-damaged-tiny +block-metal-floor-3-tiny rotate: false - xy: 1085, 217 + xy: 1704, 491 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-damaged-xlarge +block-metal-floor-3-xlarge rotate: false xy: 251, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-large +block-metal-floor-5-large rotate: false - xy: 859, 723 + xy: 1517, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-medium +block-metal-floor-5-medium rotate: false - xy: 732, 250 + xy: 1672, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-small +block-metal-floor-5-small rotate: false - xy: 1601, 380 + xy: 1061, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-tiny +block-metal-floor-5-tiny rotate: false - xy: 1103, 235 + xy: 1704, 473 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-xlarge +block-metal-floor-5-xlarge rotate: false xy: 151, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-micro-processor-large +block-metal-floor-damaged-large rotate: false - xy: 985, 849 + xy: 1559, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-micro-processor-medium +block-metal-floor-damaged-medium rotate: false - xy: 766, 250 + xy: 636, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-micro-processor-small +block-metal-floor-damaged-small rotate: false - xy: 1627, 380 + xy: 1087, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-micro-processor-tiny +block-metal-floor-damaged-tiny rotate: false - xy: 1085, 199 + xy: 1704, 455 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-micro-processor-xlarge +block-metal-floor-damaged-xlarge rotate: false xy: 201, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-moss-large +block-metal-floor-large rotate: false - xy: 943, 807 + xy: 1601, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-moss-medium +block-metal-floor-medium rotate: false - xy: 800, 250 + xy: 670, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-moss-small +block-metal-floor-small rotate: false - xy: 1653, 380 + xy: 1113, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-moss-tiny +block-metal-floor-tiny rotate: false - xy: 1103, 217 + xy: 1704, 437 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-moss-xlarge +block-metal-floor-xlarge rotate: false xy: 251, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mud-large +block-micro-processor-large rotate: false - xy: 901, 765 + xy: 1643, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mud-medium +block-micro-processor-medium rotate: false - xy: 834, 250 + xy: 704, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mud-small +block-micro-processor-small rotate: false - xy: 1679, 378 + xy: 1139, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mud-tiny +block-micro-processor-tiny rotate: false - xy: 1121, 235 + xy: 1704, 419 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mud-xlarge +block-micro-processor-xlarge rotate: false xy: 281, 619 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multi-press-large +block-moss-large rotate: false - xy: 859, 681 + xy: 1685, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multi-press-medium +block-moss-medium rotate: false - xy: 868, 250 + xy: 738, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multi-press-small +block-moss-small rotate: false - xy: 1705, 378 + xy: 1165, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multi-press-tiny +block-moss-tiny rotate: false - xy: 1103, 199 + xy: 1715, 401 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multi-press-xlarge +block-moss-xlarge rotate: false xy: 281, 569 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-large +block-mud-large rotate: false - xy: 1027, 849 + xy: 1727, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-medium +block-mud-medium rotate: false - xy: 902, 250 + xy: 772, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-small +block-mud-small rotate: false - xy: 1731, 378 + xy: 1191, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-tiny +block-mud-tiny rotate: false - xy: 1121, 217 + xy: 1715, 383 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-xlarge +block-mud-xlarge rotate: false xy: 301, 519 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-naval-factory-large +block-multi-press-large rotate: false - xy: 985, 807 + xy: 1769, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-naval-factory-medium +block-multi-press-medium rotate: false - xy: 732, 216 + xy: 806, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-naval-factory-small +block-multi-press-small rotate: false - xy: 1757, 378 + xy: 1217, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-naval-factory-tiny +block-multi-press-tiny rotate: false - xy: 1139, 235 + xy: 1715, 365 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-naval-factory-xlarge +block-multi-press-xlarge rotate: false xy: 301, 469 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-oil-extractor-large +block-multiplicative-reconstructor-large rotate: false - xy: 943, 765 + xy: 1811, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-oil-extractor-medium +block-multiplicative-reconstructor-medium rotate: false - xy: 766, 216 + xy: 635, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-oil-extractor-small +block-multiplicative-reconstructor-small rotate: false - xy: 1951, 678 + xy: 1447, 341 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-oil-extractor-tiny +block-multiplicative-reconstructor-tiny rotate: false - xy: 1121, 199 + xy: 1723, 520 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-oil-extractor-xlarge +block-multiplicative-reconstructor-xlarge rotate: false xy: 301, 419 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-coal-large +block-naval-factory-large rotate: false - xy: 901, 723 + xy: 1853, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-coal-medium +block-naval-factory-medium rotate: false - xy: 800, 216 + xy: 669, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-coal-small +block-naval-factory-small rotate: false - xy: 1048, 389 + xy: 1236, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-coal-tiny +block-naval-factory-tiny rotate: false - xy: 1139, 217 + xy: 1741, 520 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-coal-xlarge +block-naval-factory-xlarge rotate: false xy: 301, 369 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-copper-large +block-oil-extractor-large rotate: false - xy: 1069, 849 + xy: 1895, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-copper-medium +block-oil-extractor-medium rotate: false - xy: 834, 216 + xy: 703, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-copper-small +block-oil-extractor-small rotate: false - xy: 1048, 363 + xy: 1243, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-copper-tiny +block-oil-extractor-tiny rotate: false - xy: 1157, 235 + xy: 1759, 520 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-copper-xlarge +block-oil-extractor-xlarge rotate: false xy: 301, 319 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-lead-large +block-ore-coal-large rotate: false - xy: 1027, 807 + xy: 1937, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-lead-medium +block-ore-coal-medium rotate: false - xy: 868, 216 + xy: 737, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-lead-small +block-ore-coal-small rotate: false - xy: 1048, 337 + xy: 1523, 545 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-lead-tiny +block-ore-coal-tiny rotate: false - xy: 1139, 199 + xy: 1777, 520 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-lead-xlarge +block-ore-coal-xlarge rotate: false xy: 301, 269 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-scrap-large +block-ore-copper-large rotate: false - xy: 985, 765 + xy: 859, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-scrap-medium +block-ore-copper-medium rotate: false - xy: 902, 216 + xy: 771, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-scrap-small +block-ore-copper-small rotate: false - xy: 1048, 311 + xy: 1523, 519 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-scrap-tiny +block-ore-copper-tiny rotate: false - xy: 1157, 217 + xy: 1723, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-scrap-xlarge +block-ore-copper-xlarge rotate: false xy: 301, 219 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-thorium-large +block-ore-lead-large rotate: false - xy: 943, 723 + xy: 859, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-thorium-medium +block-ore-lead-medium rotate: false - xy: 698, 197 + xy: 805, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-thorium-small +block-ore-lead-small rotate: false - xy: 1048, 285 + xy: 1522, 493 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-thorium-tiny +block-ore-lead-tiny rotate: false - xy: 1175, 235 + xy: 1741, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-thorium-xlarge +block-ore-lead-xlarge rotate: false xy: 301, 169 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-titanium-large +block-ore-scrap-large rotate: false - xy: 901, 681 + xy: 901, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-titanium-medium +block-ore-scrap-medium rotate: false - xy: 936, 223 + xy: 619, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-titanium-small +block-ore-scrap-small rotate: false - xy: 1048, 259 + xy: 1522, 467 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-titanium-tiny +block-ore-scrap-tiny rotate: false - xy: 1157, 199 + xy: 1759, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-titanium-xlarge +block-ore-scrap-xlarge rotate: false xy: 301, 119 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-dome-large +block-ore-thorium-large rotate: false - xy: 1111, 849 + xy: 859, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-dome-medium +block-ore-thorium-medium rotate: false - xy: 732, 182 + xy: 653, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-dome-small +block-ore-thorium-small rotate: false - xy: 1074, 388 + xy: 1522, 441 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-dome-tiny +block-ore-thorium-tiny rotate: false - xy: 1175, 217 + xy: 1777, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-dome-xlarge +block-ore-thorium-xlarge rotate: false xy: 301, 69 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-projector-large +block-ore-titanium-large rotate: false - xy: 1069, 807 + xy: 943, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-projector-medium +block-ore-titanium-medium rotate: false - xy: 766, 182 + xy: 687, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-projector-small +block-ore-titanium-small rotate: false - xy: 1074, 362 + xy: 1522, 415 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-projector-tiny +block-ore-titanium-tiny rotate: false - xy: 1193, 235 + xy: 1722, 484 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-projector-xlarge +block-ore-titanium-xlarge rotate: false xy: 301, 19 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overflow-gate-large +block-overdrive-dome-large rotate: false - xy: 1027, 765 + xy: 901, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overflow-gate-medium - rotate: false - xy: 800, 182 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overflow-gate-small - rotate: false - xy: 1074, 336 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overflow-gate-tiny - rotate: false - xy: 1175, 199 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overflow-gate-xlarge - rotate: false - xy: 795, 878 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-parallax-large - rotate: false - xy: 985, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-parallax-medium - rotate: false - xy: 834, 182 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-small - rotate: false - xy: 1074, 310 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-parallax-tiny - rotate: false - xy: 1193, 217 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-parallax-xlarge - rotate: false - xy: 309, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-conveyor-large - rotate: false - xy: 943, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-conveyor-medium - rotate: false - xy: 868, 182 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-conveyor-small - rotate: false - xy: 1074, 284 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-conveyor-tiny - rotate: false - xy: 1211, 235 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-conveyor-xlarge - rotate: false - xy: 309, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-payload-router-large - rotate: false - xy: 1153, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-payload-router-medium - rotate: false - xy: 902, 182 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-payload-router-small - rotate: false - xy: 1074, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-payload-router-tiny - rotate: false - xy: 1193, 199 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-payload-router-xlarge - rotate: false - xy: 359, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pebbles-large - rotate: false - xy: 1111, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pebbles-medium - rotate: false - xy: 936, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-small - rotate: false - xy: 1100, 383 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pebbles-tiny - rotate: false - xy: 1211, 217 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pebbles-xlarge - rotate: false - xy: 309, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conduit-large - rotate: false - xy: 1069, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conduit-medium - rotate: false - xy: 970, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conduit-small - rotate: false - xy: 1126, 383 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conduit-tiny - rotate: false - xy: 1211, 199 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conduit-xlarge - rotate: false - xy: 359, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conveyor-large - rotate: false - xy: 1027, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conveyor-medium - rotate: false - xy: 970, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conveyor-small - rotate: false - xy: 1100, 357 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conveyor-tiny - rotate: false - xy: 1229, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conveyor-xlarge - rotate: false - xy: 409, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-large - rotate: false - xy: 985, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-large - rotate: false - xy: 1195, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 936, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-large-small - rotate: false - xy: 1152, 383 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-large-tiny - rotate: false - xy: 1247, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-large-xlarge - rotate: false - xy: 359, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-medium - rotate: false - xy: 970, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 1100, 331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1229, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 409, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large - rotate: false - xy: 1153, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-weaver-medium - rotate: false - xy: 1965, 603 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-small - rotate: false - xy: 1126, 357 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-weaver-tiny - rotate: false - xy: 1265, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-weaver-xlarge - rotate: false - xy: 459, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pine-large - rotate: false - xy: 1111, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pine-medium - rotate: false - xy: 979, 529 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pine-small - rotate: false - xy: 1178, 383 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pine-tiny - rotate: false - xy: 1247, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pine-xlarge - rotate: false - xy: 409, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-compressor-large - rotate: false - xy: 1069, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-compressor-medium - rotate: false - xy: 979, 495 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-compressor-small - rotate: false - xy: 1100, 305 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-compressor-tiny - rotate: false - xy: 1283, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-compressor-xlarge - rotate: false - xy: 459, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-large - rotate: false - xy: 1027, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-medium - rotate: false - xy: 979, 461 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-small - rotate: false - xy: 1126, 331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-tiny - rotate: false - xy: 1265, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-conveyor-xlarge - rotate: false - xy: 509, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-large - rotate: false - xy: 1237, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-large - rotate: false - xy: 1195, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 979, 427 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-small - rotate: false - xy: 1152, 357 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-tiny - rotate: false - xy: 1301, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-xlarge - rotate: false - xy: 459, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-medium - rotate: false - xy: 979, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-small - rotate: false - xy: 1204, 383 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-tiny - rotate: false - xy: 1283, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-xlarge - rotate: false - xy: 509, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plated-conduit-large - rotate: false - xy: 1153, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plated-conduit-medium - rotate: false - xy: 980, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plated-conduit-small - rotate: false - xy: 1100, 279 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plated-conduit-tiny - rotate: false - xy: 1319, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plated-conduit-xlarge - rotate: false - xy: 559, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pneumatic-drill-large - rotate: false - xy: 1111, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 980, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-small - rotate: false - xy: 1126, 305 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pneumatic-drill-tiny - rotate: false - xy: 1301, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pneumatic-drill-xlarge - rotate: false - xy: 509, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-large - rotate: false - xy: 1069, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-large - rotate: false - xy: 1279, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 980, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-large-small - rotate: false - xy: 1152, 331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-large-tiny - rotate: false - xy: 1337, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-large-xlarge - rotate: false - xy: 559, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-medium - rotate: false - xy: 980, 257 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 1178, 357 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 1319, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 609, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large - rotate: false - xy: 1237, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-source-medium - rotate: false - xy: 1004, 223 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-source-small - rotate: false - xy: 1126, 279 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-source-tiny - rotate: false - xy: 1355, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-source-xlarge - rotate: false - xy: 559, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-void-large - rotate: false - xy: 1195, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 1004, 189 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-void-small - rotate: false - xy: 1152, 305 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-void-tiny - rotate: false - xy: 1337, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-void-xlarge - rotate: false - xy: 609, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulse-conduit-large - rotate: false - xy: 1153, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulse-conduit-medium - rotate: false - xy: 1004, 155 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-small - rotate: false - xy: 1178, 331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulse-conduit-tiny - rotate: false - xy: 1373, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulse-conduit-xlarge - rotate: false - xy: 659, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulverizer-large - rotate: false - xy: 1111, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulverizer-medium - rotate: false - xy: 619, 91 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-small - rotate: false - xy: 1204, 357 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulverizer-tiny - rotate: false - xy: 1355, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulverizer-xlarge - rotate: false - xy: 609, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pyratite-mixer-large - rotate: false - xy: 1321, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pyratite-mixer-medium - rotate: false - xy: 619, 57 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pyratite-mixer-small - rotate: false - xy: 1152, 279 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pyratite-mixer-tiny - rotate: false - xy: 1391, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pyratite-mixer-xlarge - rotate: false - xy: 659, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-repair-point-large - rotate: false - xy: 1279, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-repair-point-medium - rotate: false - xy: 630, 186 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-small - rotate: false - xy: 1178, 305 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-repair-point-tiny - rotate: false - xy: 1373, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-repair-point-xlarge - rotate: false - xy: 709, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-resupply-point-large - rotate: false - xy: 1237, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-resupply-point-medium - rotate: false - xy: 664, 186 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-resupply-point-small - rotate: false - xy: 1204, 331 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-resupply-point-tiny - rotate: false - xy: 1409, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-resupply-point-xlarge - rotate: false - xy: 659, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ripple-large - rotate: false - xy: 1195, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ripple-medium - rotate: false - xy: 622, 152 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-small - rotate: false - xy: 1178, 279 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ripple-tiny - rotate: false - xy: 1391, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ripple-xlarge - rotate: false - xy: 709, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rotary-pump-large - rotate: false - xy: 1153, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rotary-pump-medium - rotate: false - xy: 656, 152 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rotary-pump-small - rotate: false - xy: 1204, 305 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rotary-pump-tiny - rotate: false - xy: 1427, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rotary-pump-xlarge - rotate: false - xy: 709, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-router-large - rotate: false - xy: 1363, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-router-medium - rotate: false - xy: 698, 163 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-router-small - rotate: false - xy: 1204, 279 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-router-tiny - rotate: false - xy: 1409, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-router-xlarge - rotate: false - xy: 759, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rtg-generator-large - rotate: false - xy: 1321, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rtg-generator-medium - rotate: false - xy: 732, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rtg-generator-small - rotate: false - xy: 1100, 253 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rtg-generator-tiny - rotate: false - xy: 1445, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rtg-generator-xlarge - rotate: false - xy: 759, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-large - rotate: false - xy: 1279, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-medium - rotate: false - xy: 766, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-small - rotate: false - xy: 1126, 253 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-tiny - rotate: false - xy: 1427, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-large - rotate: false - xy: 1237, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-wall-medium - rotate: false - xy: 800, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-wall-small - rotate: false - xy: 1152, 253 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-wall-tiny - rotate: false - xy: 1463, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-xlarge - rotate: false - xy: 759, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-xlarge - rotate: false - xy: 809, 828 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salvo-large - rotate: false - xy: 1195, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salvo-medium - rotate: false - xy: 834, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-small - rotate: false - xy: 1178, 253 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salvo-tiny - rotate: false - xy: 1445, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salvo-xlarge - rotate: false - xy: 809, 778 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-boulder-large - rotate: false - xy: 1405, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-boulder-medium - rotate: false - xy: 868, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 1204, 253 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 1481, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge - rotate: false - xy: 809, 728 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-large - rotate: false - xy: 1363, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-medium - rotate: false - xy: 902, 148 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-small - rotate: false - xy: 1230, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-tiny - rotate: false - xy: 1463, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-large - rotate: false - xy: 1321, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-wall-medium - rotate: false - xy: 653, 118 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-small - rotate: false - xy: 1230, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-wall-tiny - rotate: false - xy: 1499, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-xlarge - rotate: false - xy: 809, 678 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-water-large - rotate: false - xy: 1279, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 653, 84 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 1256, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 1481, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge - rotate: false - xy: 331, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-xlarge - rotate: false - xy: 331, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scatter-large - rotate: false - xy: 1237, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 653, 50 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 1230, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 1517, 230 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge - rotate: false - xy: 381, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scorch-large - rotate: false - xy: 1447, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scorch-medium - rotate: false - xy: 936, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-small - rotate: false - xy: 1256, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scorch-tiny - rotate: false - xy: 1499, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scorch-xlarge - rotate: false - xy: 381, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-large - rotate: false - xy: 1405, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-medium - rotate: false - xy: 970, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-small - rotate: false - xy: 1282, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-tiny - rotate: false - xy: 1517, 212 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-xlarge - rotate: false - xy: 431, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-large - rotate: false - xy: 1363, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-medium - rotate: false - xy: 1004, 121 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-small - rotate: false - xy: 1230, 300 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-tiny - rotate: false - xy: 1085, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-xlarge - rotate: false - xy: 431, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-large - rotate: false - xy: 1321, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large - rotate: false - xy: 1279, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 690, 129 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 1256, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 1103, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge - rotate: false - xy: 481, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-medium - rotate: false - xy: 687, 95 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 1282, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 1121, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 481, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-segment-large - rotate: false - xy: 1489, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-segment-medium - rotate: false - xy: 687, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-segment-small - rotate: false - xy: 1308, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-segment-tiny - rotate: false - xy: 1139, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-segment-xlarge - rotate: false - xy: 531, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large - rotate: false - xy: 1447, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 724, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-separator-small - rotate: false - xy: 1230, 274 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-separator-tiny - rotate: false - xy: 1157, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-separator-xlarge - rotate: false - xy: 531, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-boulder-large - rotate: false - xy: 1405, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 758, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-small - rotate: false - xy: 1256, 300 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-boulder-tiny - rotate: false - xy: 1175, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-boulder-xlarge - rotate: false - xy: 581, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-large - rotate: false - xy: 1363, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-medium - rotate: false - xy: 792, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-small - rotate: false - xy: 1282, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-tiny - rotate: false - xy: 1193, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-large - rotate: false - xy: 1321, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-wall-medium - rotate: false - xy: 826, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-small - rotate: false - xy: 1308, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-wall-tiny - rotate: false - xy: 1211, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-xlarge - rotate: false - xy: 581, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-xlarge - rotate: false - xy: 631, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large - rotate: false - xy: 1531, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 860, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shock-mine-small - rotate: false - xy: 1334, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shock-mine-tiny - rotate: false - xy: 1229, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shock-mine-xlarge - rotate: false - xy: 631, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shrubs-large - rotate: false - xy: 1489, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 894, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 1256, 274 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 1247, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge - rotate: false - xy: 681, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-crucible-large - rotate: false - xy: 1447, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-crucible-medium - rotate: false - xy: 721, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-crucible-small - rotate: false - xy: 1282, 300 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-crucible-tiny - rotate: false - xy: 1265, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-crucible-xlarge - rotate: false - xy: 681, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-smelter-large - rotate: false - xy: 1405, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-smelter-medium - rotate: false - xy: 755, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-smelter-small - rotate: false - xy: 1308, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-smelter-tiny - rotate: false - xy: 1283, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-smelter-xlarge - rotate: false - xy: 731, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-slag-large - rotate: false - xy: 1363, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-slag-medium - rotate: false - xy: 789, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-slag-small - rotate: false - xy: 1334, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-slag-tiny - rotate: false - xy: 1301, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-slag-xlarge - rotate: false - xy: 731, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-boulder-large - rotate: false - xy: 1573, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-boulder-medium - rotate: false - xy: 823, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-boulder-small - rotate: false - xy: 1360, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-boulder-tiny - rotate: false - xy: 1319, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-boulder-xlarge - rotate: false - xy: 781, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-large - rotate: false - xy: 1531, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 857, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 1489, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 891, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 1282, 274 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 1337, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge - rotate: false - xy: 831, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-small - rotate: false - xy: 1308, 300 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 1355, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-large - rotate: false - xy: 1447, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-wall-medium - rotate: false - xy: 721, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-wall-small - rotate: false - xy: 1334, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-wall-tiny - rotate: false - xy: 1373, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-xlarge - rotate: false - xy: 781, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 831, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-large - rotate: false - xy: 1405, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 1615, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 755, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 1360, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 1391, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 351, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 789, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 1386, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 1409, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 351, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 1573, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 823, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 1308, 274 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 1427, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 401, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large - rotate: false - xy: 1531, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 857, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 1334, 300 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spawn-tiny - rotate: false - xy: 1445, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spawn-xlarge - rotate: false - xy: 351, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large - rotate: false - xy: 1489, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 891, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 1360, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 1463, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge - rotate: false - xy: 401, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-cluster-large - rotate: false - xy: 1447, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 687, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 1386, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 1481, 194 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge - rotate: false - xy: 451, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-moss-large - rotate: false - xy: 1657, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium +block-overdrive-dome-medium rotate: false xy: 721, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-moss-small +block-overdrive-dome-small rotate: false - xy: 1412, 378 + xy: 1515, 389 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-moss-tiny +block-overdrive-dome-tiny rotate: false - xy: 1499, 194 + xy: 1722, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-moss-xlarge +block-overdrive-dome-xlarge rotate: false - xy: 351, 416 + xy: 795, 878 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-pine-large +block-overdrive-projector-large rotate: false - xy: 1615, 807 + xy: 859, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-pine-medium +block-overdrive-projector-medium rotate: false xy: 755, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-pine-small +block-overdrive-projector-small rotate: false - xy: 1334, 274 + xy: 1489, 373 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-pine-tiny +block-overdrive-projector-tiny rotate: false - xy: 1517, 194 + xy: 1740, 484 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-pine-xlarge +block-overdrive-projector-xlarge rotate: false - xy: 401, 466 + xy: 309, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-press-large +block-overflow-gate-large rotate: false - xy: 1573, 765 + xy: 985, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-press-medium +block-overflow-gate-medium rotate: false xy: 789, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-press-small +block-overflow-gate-small rotate: false - xy: 1360, 300 + xy: 1515, 363 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-press-tiny +block-overflow-gate-tiny rotate: false - xy: 1082, 163 + xy: 1722, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-press-xlarge +block-overflow-gate-xlarge rotate: false - xy: 451, 516 + xy: 309, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-wall-large +block-parallax-large rotate: false - xy: 1531, 723 + xy: 943, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-wall-medium +block-parallax-medium rotate: false xy: 823, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-wall-small +block-parallax-small rotate: false - xy: 1386, 326 + xy: 1241, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-wall-tiny +block-parallax-tiny rotate: false - xy: 1082, 145 + xy: 1740, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-wall-xlarge +block-parallax-xlarge rotate: false - xy: 501, 566 + xy: 359, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-steam-generator-large +block-payload-conveyor-large rotate: false - xy: 1489, 681 + xy: 901, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-steam-generator-medium +block-payload-conveyor-medium + rotate: false + xy: 839, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +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-payload-router-medium + rotate: false + xy: 840, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-payload-router-small + rotate: false + xy: 1243, 273 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-payload-router-tiny + rotate: false + xy: 1722, 430 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-payload-router-xlarge + rotate: false + xy: 359, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pebbles-large + rotate: false + xy: 1027, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pebbles-medium rotate: false xy: 857, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-steam-generator-small +block-pebbles-small rotate: false - xy: 1412, 352 + xy: 1243, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-steam-generator-tiny +block-pebbles-tiny rotate: false - xy: 1100, 163 + xy: 1740, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-steam-generator-xlarge +block-pebbles-xlarge rotate: false - xy: 351, 366 + xy: 409, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-stone-large +block-phase-conduit-large rotate: false - xy: 1699, 849 + xy: 985, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-stone-medium +block-phase-conduit-medium + rotate: false + xy: 873, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conduit-small + rotate: false + xy: 1243, 221 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conduit-tiny + rotate: false + xy: 1758, 466 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conduit-xlarge + rotate: false + xy: 359, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-conveyor-large + rotate: false + xy: 943, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conveyor-medium rotate: false xy: 891, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-stone-small +block-phase-conveyor-small rotate: false - xy: 1438, 378 + xy: 1239, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-stone-tiny +block-phase-conveyor-tiny rotate: false - xy: 1082, 127 + xy: 1776, 484 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-stone-wall-large +block-phase-conveyor-xlarge rotate: false - xy: 1657, 807 + 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-stone-wall-medium +block-phase-wall-large-large rotate: false - xy: 925, 80 + xy: 1069, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-medium + rotate: false + xy: 814, 248 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-stone-wall-small +block-phase-wall-large-small rotate: false - xy: 1360, 274 + xy: 1239, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-stone-wall-tiny +block-phase-wall-large-tiny rotate: false - xy: 1100, 145 + xy: 1740, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-stone-wall-xlarge +block-phase-wall-large-xlarge rotate: false - xy: 401, 416 + xy: 459, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-stone-xlarge +block-phase-wall-medium rotate: false - xy: 451, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 1615, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 925, 46 + xy: 814, 214 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-tower-small +block-phase-wall-small rotate: false - xy: 1386, 300 + xy: 1239, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-tower-tiny +block-phase-wall-tiny rotate: false - xy: 1118, 163 + xy: 1758, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-tower-xlarge +block-phase-wall-xlarge rotate: false - xy: 501, 516 + xy: 409, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-large +block-phase-weaver-large rotate: false - xy: 1573, 723 + xy: 1027, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-large +block-phase-weaver-medium rotate: false - xy: 1531, 681 + xy: 848, 250 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-weaver-small + rotate: false + xy: 1239, 117 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-weaver-tiny + rotate: false + xy: 1776, 466 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-weaver-xlarge + rotate: false + xy: 459, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pine-large + rotate: false + xy: 985, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-medium +block-pine-medium + rotate: false + xy: 848, 216 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pine-small + rotate: false + xy: 1273, 325 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pine-tiny + rotate: false + xy: 1758, 430 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pine-xlarge + rotate: false + xy: 509, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-compressor-large + rotate: false + xy: 943, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-compressor-medium + rotate: false + xy: 882, 250 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-compressor-small + rotate: false + xy: 1267, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-compressor-tiny + rotate: false + xy: 1776, 448 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-compressor-xlarge + rotate: false + xy: 459, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-large + rotate: false + xy: 901, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-medium + rotate: false + xy: 882, 216 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-small + rotate: false + xy: 1269, 273 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-tiny + rotate: false + xy: 1776, 430 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-xlarge + rotate: false + xy: 509, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-wall-large + rotate: false + xy: 1111, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-large + rotate: false + xy: 1069, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-medium + rotate: false + xy: 916, 250 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-small + rotate: false + xy: 1269, 247 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-tiny + rotate: false + xy: 1733, 412 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-xlarge + rotate: false + xy: 559, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +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-plated-conduit-medium + rotate: false + xy: 848, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plated-conduit-small + rotate: false + xy: 1265, 195 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plated-conduit-tiny + rotate: false + xy: 1751, 412 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plated-conduit-xlarge + rotate: false + xy: 559, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pneumatic-drill-large + rotate: false + xy: 985, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pneumatic-drill-medium + rotate: false + xy: 848, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-small + rotate: false + xy: 1265, 169 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pneumatic-drill-tiny + rotate: false + xy: 1733, 376 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pneumatic-drill-xlarge + rotate: false + xy: 609, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-large + rotate: false + xy: 943, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-large + rotate: false + xy: 1153, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +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-power-source-medium + rotate: false + xy: 882, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-source-small + rotate: false + xy: 1262, 91 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-source-tiny + rotate: false + xy: 1751, 376 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-source-xlarge + rotate: false + xy: 659, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-void-large + rotate: false + xy: 1069, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-void-medium + rotate: false + xy: 916, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-void-small + rotate: false + xy: 1299, 325 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-void-tiny + rotate: false + xy: 1769, 394 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-void-xlarge + rotate: false + xy: 609, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulse-conduit-large + rotate: false + xy: 1027, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulse-conduit-medium + rotate: false + xy: 882, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulse-conduit-small + rotate: false + xy: 1293, 299 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulse-conduit-tiny + rotate: false + xy: 1769, 376 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulse-conduit-xlarge + rotate: false + xy: 659, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulverizer-large + rotate: false + xy: 985, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulverizer-medium + rotate: false + xy: 882, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-small + rotate: false + xy: 1295, 273 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulverizer-tiny + rotate: false + xy: 1733, 358 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulverizer-xlarge + rotate: false + xy: 709, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pyratite-mixer-large + rotate: false + xy: 1195, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pyratite-mixer-medium + rotate: false + xy: 916, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pyratite-mixer-small + rotate: false + xy: 1295, 247 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pyratite-mixer-tiny + rotate: false + xy: 1751, 358 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pyratite-mixer-xlarge + rotate: false + xy: 659, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-repair-point-large + rotate: false + xy: 1153, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-repair-point-medium + rotate: false + xy: 916, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-small + rotate: false + xy: 1295, 221 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-repair-point-tiny + rotate: false + xy: 1769, 358 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-repair-point-xlarge + rotate: false + xy: 709, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-resupply-point-large + rotate: false + xy: 1111, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-resupply-point-medium + rotate: false + xy: 908, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-resupply-point-small + rotate: false + xy: 1291, 195 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-resupply-point-tiny + rotate: false + xy: 1787, 412 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-resupply-point-xlarge + rotate: false + xy: 709, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ripple-large + rotate: false + xy: 1069, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ripple-medium + rotate: false + xy: 907, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ripple-small + rotate: false + xy: 1291, 169 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ripple-tiny + rotate: false + xy: 1787, 394 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ripple-xlarge + rotate: false + xy: 759, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rotary-pump-large + rotate: false + xy: 1027, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rotary-pump-medium rotate: false xy: 925, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-large-small +block-rotary-pump-small rotate: false - xy: 1412, 326 + xy: 1291, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-large-tiny +block-rotary-pump-tiny rotate: false - xy: 1100, 127 + xy: 1787, 376 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-large-xlarge +block-rotary-pump-xlarge + rotate: false + xy: 759, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-router-large + rotate: false + xy: 1237, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-router-medium + rotate: false + xy: 941, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-router-small + rotate: false + xy: 1291, 117 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-router-tiny + rotate: false + xy: 1787, 358 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-router-xlarge + rotate: false + xy: 759, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rtg-generator-large + rotate: false + xy: 1195, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +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-salt-medium + rotate: false + xy: 959, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-small + rotate: false + xy: 1269, 65 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-tiny + rotate: false + xy: 1794, 466 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-wall-large + rotate: false + xy: 1111, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-wall-medium + rotate: false + xy: 975, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-wall-small + rotate: false + xy: 1325, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-wall-tiny + rotate: false + xy: 1794, 448 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-wall-xlarge + rotate: false + xy: 809, 778 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +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-salvo-medium + rotate: false + xy: 993, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-small + rotate: false + xy: 1351, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salvo-tiny + rotate: false + xy: 1794, 430 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salvo-xlarge + rotate: false + xy: 809, 678 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-boulder-large + rotate: false + xy: 1279, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +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-sand-medium + rotate: false + xy: 1483, 563 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-small + rotate: false + xy: 1377, 325 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-tiny + rotate: false + xy: 1805, 394 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-wall-large + rotate: false + xy: 1195, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-wall-medium + rotate: false + xy: 1567, 545 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-small + rotate: false + xy: 1314, 91 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-wall-tiny + rotate: false + xy: 1805, 376 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-wall-xlarge + rotate: false + xy: 331, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-water-large + rotate: false + xy: 1153, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-water-medium + rotate: false + xy: 1601, 545 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-water-small + rotate: false + xy: 1321, 65 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-water-tiny + rotate: false + xy: 1805, 358 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-xlarge + rotate: false + xy: 381, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +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-scatter-medium + rotate: false + xy: 1635, 545 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-small + rotate: false + xy: 1549, 519 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scatter-tiny + rotate: false + xy: 1391, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scatter-xlarge + rotate: false + xy: 431, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scorch-large + rotate: false + xy: 1321, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scorch-medium + rotate: false + xy: 1669, 545 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scorch-small + rotate: false + xy: 1548, 493 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scorch-tiny + rotate: false + xy: 1391, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scorch-xlarge + rotate: false + xy: 431, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-large + rotate: false + xy: 1279, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-medium + rotate: false + xy: 979, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-small + rotate: false + xy: 1575, 519 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-tiny + rotate: false + xy: 1391, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-xlarge + rotate: false + xy: 481, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-large + rotate: false + xy: 1237, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-medium + rotate: false + xy: 979, 503 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-small + rotate: false + xy: 1548, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-tiny + rotate: false + xy: 1391, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-xlarge + rotate: false + xy: 481, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-large + rotate: false + xy: 1195, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-large + rotate: false + xy: 1153, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-medium + rotate: false + xy: 979, 469 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-large-small + rotate: false + xy: 1574, 493 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-large-tiny + rotate: false + xy: 1409, 292 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-large-xlarge + rotate: false + xy: 531, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +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-segment-medium + rotate: false + xy: 979, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-segment-small + rotate: false + xy: 1548, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-segment-tiny + rotate: false + xy: 1409, 256 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +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-surge-wall-medium - rotate: false - xy: 959, 87 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 1438, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 1118, 145 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge +block-stone-xlarge rotate: false xy: 351, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-swarmer-large +block-surge-tower-large rotate: false - xy: 1741, 849 + xy: 1447, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-swarmer-medium +block-surge-tower-medium rotate: false - xy: 959, 53 + xy: 1149, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-swarmer-small +block-surge-tower-small rotate: false - xy: 1464, 378 + xy: 1645, 363 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-swarmer-tiny +block-surge-tower-tiny rotate: false - xy: 1136, 163 + xy: 1517, 265 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-swarmer-xlarge +block-surge-tower-xlarge rotate: false xy: 401, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-switch-large +block-surge-wall-large rotate: false - xy: 1699, 807 + xy: 1405, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-switch-medium +block-surge-wall-large-large rotate: false - xy: 993, 87 + 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-switch-small +block-surge-wall-large-small rotate: false - xy: 1386, 274 + xy: 1679, 519 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-switch-tiny +block-surge-wall-large-tiny rotate: false - xy: 1118, 127 + xy: 1499, 229 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-switch-xlarge +block-surge-wall-large-xlarge rotate: false xy: 451, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tainted-water-large +block-surge-wall-medium rotate: false - xy: 1657, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 959, 19 + xy: 1217, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tainted-water-small +block-surge-wall-small rotate: false - xy: 1412, 300 + xy: 1678, 493 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tainted-water-tiny +block-surge-wall-tiny rotate: false - xy: 1136, 145 + xy: 1517, 247 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tainted-water-xlarge +block-surge-wall-xlarge rotate: false xy: 501, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tar-large +block-swarmer-large rotate: false - xy: 1615, 723 + xy: 1573, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tar-medium +block-swarmer-medium rotate: false - xy: 993, 53 + xy: 1285, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tar-small +block-swarmer-small rotate: false - xy: 1438, 326 + xy: 1678, 467 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tar-tiny +block-swarmer-tiny rotate: false - xy: 1154, 163 + xy: 1535, 265 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tar-xlarge +block-swarmer-xlarge rotate: false xy: 551, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tendrils-large +block-switch-large rotate: false - xy: 1573, 681 + xy: 1531, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tendrils-medium +block-switch-medium rotate: false - xy: 993, 19 + xy: 1149, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tendrils-small +block-switch-small rotate: false - xy: 1464, 352 + xy: 1678, 441 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tendrils-tiny +block-switch-tiny rotate: false - xy: 1136, 127 + xy: 1517, 229 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tendrils-xlarge +block-switch-xlarge rotate: false xy: 601, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tetrative-reconstructor-large +block-tainted-water-large rotate: false - xy: 1783, 849 + xy: 1489, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tetrative-reconstructor-medium +block-tainted-water-medium rotate: false - xy: 1027, 87 + xy: 1183, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tetrative-reconstructor-small +block-tainted-water-small rotate: false - xy: 1490, 378 + xy: 1678, 415 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tetrative-reconstructor-tiny +block-tainted-water-tiny rotate: false - xy: 1154, 145 + xy: 1535, 247 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tetrative-reconstructor-xlarge +block-tainted-water-xlarge rotate: false xy: 351, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-generator-large +block-tar-large rotate: false - xy: 1741, 807 + xy: 1447, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-generator-medium +block-tar-medium rotate: false - xy: 1027, 53 + xy: 1217, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-generator-small +block-tar-small rotate: false - xy: 1412, 274 + xy: 1671, 389 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-generator-tiny +block-tar-tiny rotate: false - xy: 1172, 163 + xy: 1535, 229 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-generator-xlarge +block-tar-xlarge rotate: false xy: 401, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-pump-large +block-tendrils-large rotate: false - xy: 1699, 765 + xy: 1657, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-pump-medium +block-tendrils-medium rotate: false - xy: 1027, 19 + xy: 1251, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-pump-small +block-tendrils-small rotate: false - xy: 1438, 300 + xy: 1671, 363 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-pump-tiny +block-tendrils-tiny rotate: false - xy: 1154, 127 + xy: 1499, 211 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-pump-xlarge +block-tendrils-xlarge rotate: false xy: 451, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-reactor-large +block-tetrative-reconstructor-large rotate: false - xy: 1657, 723 + xy: 1615, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-reactor-medium +block-tetrative-reconstructor-medium rotate: false - xy: 1865, 569 + xy: 1319, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-reactor-small +block-tetrative-reconstructor-small rotate: false - xy: 1464, 326 + xy: 1473, 341 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-reactor-tiny +block-tetrative-reconstructor-tiny rotate: false - xy: 1172, 145 + xy: 1517, 211 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-reactor-xlarge +block-tetrative-reconstructor-xlarge rotate: false xy: 501, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-large +block-thermal-generator-large rotate: false - xy: 1615, 681 + xy: 1573, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-large +block-thermal-generator-medium rotate: false - xy: 1825, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1899, 569 + xy: 1183, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-large-small +block-thermal-generator-small rotate: false - xy: 1490, 352 + xy: 1319, 299 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-large-tiny +block-thermal-generator-tiny rotate: false - xy: 1190, 163 + xy: 1535, 211 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-large-xlarge +block-thermal-generator-xlarge rotate: false xy: 551, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-medium +block-thermal-pump-large rotate: false - xy: 1933, 569 + 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-thorium-wall-small +block-thermal-pump-small rotate: false - xy: 1516, 378 + xy: 1321, 273 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-tiny +block-thermal-pump-tiny rotate: false - xy: 1172, 127 + xy: 1553, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-xlarge +block-thermal-pump-xlarge rotate: false xy: 601, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thruster-large +block-thorium-reactor-large rotate: false - xy: 1783, 807 + xy: 1489, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thruster-medium +block-thorium-reactor-medium rotate: false - xy: 1967, 569 + xy: 1251, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thruster-small +block-thorium-reactor-small rotate: false - xy: 1438, 274 + xy: 1321, 247 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thruster-tiny +block-thorium-reactor-tiny rotate: false - xy: 1190, 145 + xy: 1571, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thruster-xlarge +block-thorium-reactor-xlarge rotate: false xy: 651, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-conveyor-large +block-thorium-wall-large rotate: false - xy: 1741, 765 + xy: 1699, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-conveyor-medium +block-thorium-wall-large-large rotate: false - xy: 1865, 535 + 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-titanium-conveyor-small +block-thorium-wall-large-small rotate: false - xy: 1464, 300 + xy: 1321, 221 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-conveyor-tiny +block-thorium-wall-large-tiny rotate: false - xy: 1208, 163 + xy: 1553, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-conveyor-xlarge +block-thorium-wall-large-xlarge rotate: false xy: 351, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-large +block-thorium-wall-medium rotate: false - xy: 1699, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-large - rotate: false - xy: 1657, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1899, 535 + xy: 1353, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-large-small +block-thorium-wall-small rotate: false - xy: 1490, 326 + xy: 1317, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-large-tiny +block-thorium-wall-tiny rotate: false - xy: 1190, 127 + xy: 1553, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-large-xlarge +block-thorium-wall-xlarge rotate: false xy: 401, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-medium +block-thruster-large rotate: false - xy: 1933, 535 + 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-titanium-wall-small +block-thruster-small rotate: false - xy: 1516, 352 + xy: 1317, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-tiny +block-thruster-tiny rotate: false - xy: 1208, 145 + xy: 1571, 253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-xlarge +block-thruster-xlarge rotate: false xy: 451, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-underflow-gate-large +block-titanium-conveyor-large rotate: false - xy: 1867, 849 + xy: 1573, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-underflow-gate-medium +block-titanium-conveyor-medium rotate: false - xy: 1967, 535 + xy: 1251, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-underflow-gate-small +block-titanium-conveyor-small rotate: false - xy: 1464, 274 + xy: 1317, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-underflow-gate-tiny +block-titanium-conveyor-tiny rotate: false - xy: 1208, 127 + xy: 1553, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-underflow-gate-xlarge +block-titanium-conveyor-xlarge rotate: false xy: 501, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-unloader-large +block-titanium-wall-large rotate: false - xy: 1825, 807 + xy: 1531, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-unloader-medium +block-titanium-wall-large-large rotate: false - xy: 493, 48 + 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-unloader-small +block-titanium-wall-large-small rotate: false - xy: 1490, 300 + xy: 1317, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-unloader-tiny +block-titanium-wall-large-tiny rotate: false - xy: 1229, 176 + xy: 1571, 235 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-unloader-xlarge +block-titanium-wall-large-xlarge rotate: false xy: 551, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-vault-large +block-titanium-wall-medium rotate: false - xy: 1783, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-vault-medium - rotate: false - xy: 485, 14 + xy: 1319, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-vault-small +block-titanium-wall-small rotate: false - xy: 1516, 326 + xy: 1345, 305 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-vault-tiny +block-titanium-wall-tiny rotate: false - xy: 1247, 176 + xy: 1571, 217 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-vault-xlarge +block-titanium-wall-xlarge rotate: false xy: 601, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-extractor-large +block-tsunami-large rotate: false - xy: 1741, 723 + xy: 1699, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-extractor-medium +block-tsunami-medium rotate: false - xy: 519, 14 + xy: 1387, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-extractor-small +block-tsunami-small rotate: false - xy: 1490, 274 + xy: 1347, 279 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-extractor-tiny +block-tsunami-tiny rotate: false - xy: 1265, 176 + xy: 1589, 262 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-extractor-xlarge +block-tsunami-xlarge rotate: false xy: 651, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-large +block-underflow-gate-large rotate: false - xy: 1699, 681 + xy: 1657, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-medium +block-underflow-gate-medium rotate: false - xy: 1013, 529 + xy: 1251, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-small +block-underflow-gate-small rotate: false - xy: 1516, 300 + xy: 1347, 253 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-tiny +block-underflow-gate-tiny rotate: false - xy: 1283, 176 + xy: 1589, 244 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-xlarge +block-underflow-gate-xlarge rotate: false xy: 701, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wave-large +block-unloader-large rotate: false - xy: 1909, 849 + xy: 1615, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-wave-medium +block-unloader-medium rotate: false - xy: 1013, 495 + xy: 1285, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-wave-small +block-unloader-small rotate: false - xy: 1516, 274 + xy: 1347, 227 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-wave-tiny +block-unloader-tiny rotate: false - xy: 1301, 176 + xy: 1589, 226 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-wave-xlarge +block-unloader-xlarge rotate: false xy: 351, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-dead-large +block-vault-large rotate: false - xy: 1867, 807 + xy: 1573, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-dead-medium +block-vault-medium rotate: false - xy: 1013, 461 + xy: 1319, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-dead-small +block-vault-small rotate: false - xy: 1230, 248 + xy: 1340, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-dead-tiny +block-vault-tiny rotate: false - xy: 1319, 176 + xy: 1589, 208 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-dead-xlarge +block-vault-xlarge rotate: false xy: 401, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-large +block-water-extractor-large rotate: false - xy: 1825, 765 + xy: 1783, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-medium +block-water-extractor-medium rotate: false - xy: 1013, 427 + xy: 1353, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-small +block-water-extractor-small rotate: false - xy: 1256, 248 + xy: 1347, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-tiny +block-water-extractor-tiny rotate: false - xy: 1337, 176 + xy: 1607, 257 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-xlarge +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: 1825, 652 + xy: 1273, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18756,7 +21149,7 @@ button index: -1 button-disabled rotate: false - xy: 1217, 652 + xy: 1007, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18764,7 +21157,7 @@ button-disabled index: -1 button-down rotate: false - xy: 1255, 652 + xy: 1951, 812 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18772,7 +21165,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 1293, 652 + xy: 1007, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18780,7 +21173,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 1331, 652 + xy: 1045, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18788,7 +21181,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 1369, 652 + xy: 1951, 783 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18796,7 +21189,7 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 1407, 652 + xy: 1045, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18804,7 +21197,7 @@ button-edge-4 index: -1 button-right-disabled rotate: false - xy: 1407, 652 + xy: 1045, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18812,7 +21205,7 @@ button-right-disabled index: -1 button-edge-over-4 rotate: false - xy: 1445, 652 + xy: 1083, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18820,7 +21213,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 1483, 652 + xy: 1083, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18828,7 +21221,7 @@ button-over index: -1 button-red rotate: false - xy: 1521, 652 + xy: 1121, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18836,7 +21229,7 @@ button-red index: -1 button-right rotate: false - xy: 1635, 652 + xy: 1159, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18844,7 +21237,7 @@ button-right index: -1 button-right-down rotate: false - xy: 1559, 652 + xy: 1121, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18852,7 +21245,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 1597, 652 + xy: 1159, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18860,7 +21253,7 @@ button-right-over index: -1 button-select rotate: false - xy: 1282, 248 + xy: 1079, 39 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -18868,7 +21261,7 @@ button-select index: -1 button-square rotate: false - xy: 1749, 652 + xy: 1235, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18876,7 +21269,7 @@ button-square index: -1 button-square-down rotate: false - xy: 1673, 652 + xy: 1197, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18884,7 +21277,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 1711, 652 + xy: 1197, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18892,7 +21285,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 1787, 652 + xy: 1235, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18900,49 +21293,49 @@ button-trans index: -1 check-disabled rotate: false - xy: 1013, 393 + xy: 1319, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1014, 359 + xy: 1353, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1014, 325 + xy: 1387, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1014, 291 + xy: 1353, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1014, 257 + xy: 1387, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1047, 551 + 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 @@ -18956,7 +21349,7 @@ crater index: -1 cursor rotate: false - xy: 579, 61 + xy: 1319, 351 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -18970,7 +21363,7 @@ discord-banner index: -1 flat-down-base rotate: false - xy: 1863, 652 + xy: 1273, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18985,7 +21378,7 @@ info-banner index: -1 inventory rotate: false - xy: 1542, 342 + xy: 1105, 23 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -18993,147 +21386,147 @@ inventory index: -1 item-blast-compound-icon rotate: false - xy: 1047, 517 + xy: 1013, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-icon rotate: false - xy: 1047, 483 + xy: 1047, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-icon rotate: false - xy: 1047, 449 + xy: 1081, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-icon rotate: false - xy: 1047, 415 + xy: 1115, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-icon rotate: false - xy: 1081, 542 + xy: 1149, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-icon rotate: false - xy: 1081, 508 + xy: 1183, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-icon rotate: false - xy: 1081, 474 + xy: 1217, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-icon rotate: false - xy: 1081, 440 + xy: 1251, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-icon rotate: false - xy: 1115, 529 + xy: 1285, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-icon rotate: false - xy: 1149, 529 + xy: 1319, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-icon rotate: false - xy: 1115, 495 + xy: 1353, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-icon rotate: false - xy: 1183, 529 + xy: 1387, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-icon rotate: false - xy: 1115, 461 + xy: 1421, 542 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-icon rotate: false - xy: 1149, 495 + xy: 1421, 508 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-icon rotate: false - xy: 1149, 461 + xy: 1421, 474 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-icon rotate: false - xy: 1183, 495 + xy: 1421, 440 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-icon rotate: false - xy: 1183, 461 + xy: 1421, 406 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-icon rotate: false - xy: 1217, 516 + xy: 1421, 372 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-icon rotate: false - xy: 1251, 516 + xy: 1455, 529 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-icon rotate: false - xy: 1217, 482 + xy: 1455, 495 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-node rotate: false - xy: 1285, 516 + xy: 1455, 461 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19154,7 +21547,7 @@ nomap index: -1 pane rotate: false - xy: 1007, 589 + xy: 1311, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19162,7 +21555,7 @@ pane index: -1 pane-2 rotate: false - xy: 1091, 610 + xy: 1311, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19170,7 +21563,7 @@ pane-2 index: -1 scroll rotate: false - xy: 1542, 305 + xy: 1079, 2 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -19193,63 +21586,63 @@ scroll-knob-horizontal-black index: -1 scroll-knob-vertical-black rotate: false - xy: 1568, 342 + xy: 1131, 23 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 1535, 193 + xy: 1697, 228 size: 12, 40 orig: 12, 40 offset: 0, 0 index: -1 selection rotate: false - xy: 543, 163 + xy: 309, 866 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 585, 141 + xy: 1533, 621 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1625, 510 + xy: 945, 293 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1656, 510 + xy: 976, 293 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1687, 510 + xy: 2017, 901 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 309, 866 + xy: 1681, 342 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 underline rotate: false - xy: 1951, 775 + xy: 1425, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19257,7 +21650,7 @@ underline index: -1 underline-2 rotate: false - xy: 1045, 585 + xy: 1349, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19265,7 +21658,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 1951, 862 + xy: 1349, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19273,7 +21666,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 1951, 833 + xy: 1387, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19281,7 +21674,7 @@ underline-red index: -1 underline-white rotate: false - xy: 1951, 804 + xy: 1387, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19289,42 +21682,42 @@ underline-white index: -1 unit-alpha-large rotate: false - xy: 1783, 723 + xy: 1825, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-alpha-medium rotate: false - xy: 1251, 482 + xy: 1455, 427 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-alpha-small rotate: false - xy: 1308, 248 + xy: 1157, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-alpha-tiny rotate: false - xy: 1355, 176 + xy: 1571, 199 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-alpha-xlarge rotate: false - xy: 501, 316 + xy: 701, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-antumbra-large rotate: false - xy: 1951, 733 + xy: 1979, 891 size: 36, 40 orig: 36, 40 offset: 0, 0 @@ -19338,490 +21731,525 @@ unit-antumbra-medium index: -1 unit-antumbra-small rotate: false - xy: 1646, 333 + xy: 511, 6 size: 21, 24 orig: 21, 24 offset: 0, 0 index: -1 unit-antumbra-tiny rotate: false - xy: 671, 32 + xy: 619, 47 size: 14, 16 orig: 14, 16 offset: 0, 0 index: -1 unit-antumbra-xlarge rotate: false - xy: 501, 166 + xy: 551, 183 size: 43, 48 orig: 43, 48 offset: 0, 0 index: -1 unit-arkyid-large rotate: false - xy: 1741, 681 + xy: 1783, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-arkyid-medium rotate: false - xy: 1319, 516 + xy: 1455, 393 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-arkyid-small rotate: false - xy: 1542, 279 + xy: 1183, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-arkyid-tiny rotate: false - xy: 1373, 176 + xy: 1589, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-arkyid-xlarge rotate: false - xy: 551, 366 + xy: 351, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-atrax-large rotate: false - xy: 1909, 818 + xy: 1741, 776 size: 40, 29 orig: 40, 29 offset: 0, 0 index: -1 unit-atrax-medium rotate: false - xy: 911, 368 + xy: 80, 3 size: 32, 23 orig: 32, 23 offset: 0, 0 index: -1 unit-atrax-small rotate: false - xy: 527, 48 + xy: 976, 81 size: 24, 17 orig: 24, 17 offset: 0, 0 index: -1 unit-atrax-tiny rotate: false - xy: 481, 1 + xy: 1421, 576 size: 16, 11 orig: 16, 11 offset: 0, 0 index: -1 unit-atrax-xlarge rotate: false - xy: 601, 430 + xy: 401, 180 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 unit-beta-large rotate: false - xy: 1867, 765 - 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: 1285, 482 - 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: 1568, 316 - 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: 1391, 176 - 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: 651, 466 - 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: 1825, 723 + xy: 1657, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-bryde-medium rotate: false - xy: 1353, 516 + xy: 911, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-bryde-small rotate: false - xy: 1334, 248 + xy: 1235, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-bryde-tiny rotate: false - xy: 1409, 176 + xy: 1625, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-bryde-xlarge rotate: false - xy: 701, 516 + xy: 501, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-corvus-large + rotate: false + xy: 1867, 863 + size: 40, 26 + orig: 40, 26 + offset: 0, 0 + index: -1 +unit-corvus-medium + rotate: false + xy: 1489, 507 + size: 31, 20 + orig: 31, 20 + offset: 0, 0 + index: -1 +unit-corvus-small + rotate: false + xy: 1105, 6 + size: 24, 15 + orig: 24, 15 + offset: 0, 0 + index: -1 +unit-corvus-tiny + rotate: false + xy: 771, 916 + size: 15, 10 + orig: 15, 10 + offset: 0, 0 + index: -1 +unit-corvus-xlarge + rotate: false + xy: 551, 333 + size: 48, 31 + orig: 48, 31 + offset: 0, 0 + index: -1 unit-crawler-large rotate: false - xy: 1783, 681 + xy: 1825, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-crawler-medium rotate: false - xy: 1319, 482 + xy: 945, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-crawler-small rotate: false - xy: 1568, 290 + xy: 1261, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-crawler-tiny rotate: false - xy: 1427, 176 + xy: 1625, 234 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-crawler-xlarge rotate: false - xy: 351, 116 + xy: 601, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-large rotate: false - xy: 1909, 776 + xy: 1741, 734 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-dagger-medium rotate: false - xy: 1387, 516 + xy: 979, 367 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-dagger-small rotate: false - xy: 1360, 248 + xy: 1287, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-dagger-tiny rotate: false - xy: 1445, 176 + xy: 1643, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-dagger-xlarge rotate: false - xy: 401, 166 + xy: 651, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eclipse-large rotate: false - xy: 1867, 723 + xy: 1783, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-eclipse-medium rotate: false - xy: 1353, 482 + xy: 911, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-eclipse-small rotate: false - xy: 1386, 248 + xy: 1313, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-eclipse-tiny rotate: false - xy: 1463, 176 + xy: 1625, 216 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-eclipse-xlarge rotate: false - xy: 451, 216 + xy: 701, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-flare-large rotate: false - xy: 1825, 681 + xy: 1699, 683 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-flare-medium rotate: false - xy: 1421, 516 + xy: 945, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-flare-small rotate: false - xy: 1412, 248 + xy: 1339, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-flare-tiny rotate: false - xy: 1481, 176 + xy: 1643, 234 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-flare-xlarge rotate: false - xy: 501, 266 + xy: 351, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-fortress-large rotate: false - xy: 1909, 742 + xy: 443, 1 size: 40, 32 orig: 40, 32 offset: 0, 0 index: -1 unit-fortress-medium rotate: false - xy: 80, 1 + xy: 114, 1 size: 32, 25 orig: 32, 25 offset: 0, 0 index: -1 unit-fortress-small rotate: false - xy: 1038, 121 + xy: 1131, 2 size: 24, 19 orig: 24, 19 offset: 0, 0 index: -1 unit-fortress-tiny rotate: false - xy: 553, 27 + xy: 1703, 547 size: 16, 12 orig: 16, 12 offset: 0, 0 index: -1 unit-fortress-xlarge rotate: false - xy: 551, 326 + xy: 401, 140 size: 48, 38 orig: 48, 38 offset: 0, 0 index: -1 unit-gamma-large rotate: false - xy: 1867, 681 + xy: 1867, 821 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-gamma-medium rotate: false - xy: 1387, 482 + xy: 979, 333 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-gamma-small rotate: false - xy: 1438, 248 + xy: 1157, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-gamma-tiny rotate: false - xy: 1499, 176 + xy: 1661, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-gamma-xlarge rotate: false - xy: 601, 380 + xy: 451, 168 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-horizon-large rotate: false - xy: 1909, 700 + xy: 1909, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-horizon-medium rotate: false - xy: 1455, 516 + xy: 1013, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-horizon-small rotate: false - xy: 1464, 248 + xy: 1183, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-horizon-tiny rotate: false - xy: 1517, 176 + xy: 1625, 198 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-horizon-xlarge rotate: false - xy: 651, 416 + xy: 501, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mace-large rotate: false - xy: 881, 639 + xy: 1741, 692 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mace-medium rotate: false - xy: 1421, 482 + xy: 1047, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mace-small rotate: false - xy: 1490, 248 + xy: 1209, 14 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mace-tiny rotate: false - xy: 1226, 158 + xy: 1643, 216 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mace-xlarge rotate: false - xy: 701, 466 + xy: 551, 283 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mega-large rotate: false - xy: 881, 597 + xy: 1783, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mega-medium rotate: false - xy: 1489, 516 + xy: 1081, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mega-small rotate: false - xy: 1516, 248 + xy: 1235, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mega-tiny rotate: false - xy: 1226, 140 + xy: 1661, 234 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mega-xlarge rotate: false - xy: 351, 66 + xy: 601, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-minke-large rotate: false - xy: 1989, 849 + xy: 1463, 610 size: 34, 40 orig: 34, 40 offset: 0, 0 index: -1 unit-minke-medium rotate: false - xy: 1836, 516 + xy: 950, 141 size: 27, 32 orig: 27, 32 offset: 0, 0 @@ -19835,406 +22263,476 @@ unit-minke-small index: -1 unit-minke-tiny rotate: false - xy: 1385, 158 + xy: 1793, 538 size: 13, 16 orig: 13, 16 offset: 0, 0 index: -1 unit-minke-xlarge rotate: false - xy: 651, 333 + xy: 551, 133 size: 41, 48 orig: 41, 48 offset: 0, 0 index: -1 unit-mono-large rotate: false - xy: 923, 639 + xy: 1825, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mono-medium rotate: false - xy: 1455, 482 + xy: 1115, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mono-small rotate: false - xy: 1542, 253 + xy: 1261, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mono-tiny rotate: false - xy: 1244, 158 + xy: 1679, 252 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mono-xlarge rotate: false - xy: 401, 116 + xy: 651, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-nova-large rotate: false - xy: 965, 639 + xy: 1867, 779 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-nova-medium rotate: false - xy: 1523, 516 + xy: 1149, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-nova-small rotate: false - xy: 1568, 264 + xy: 1287, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-nova-tiny rotate: false - xy: 1244, 140 + xy: 1643, 198 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-nova-xlarge rotate: false - xy: 451, 166 + 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: 1718, 508 + xy: 950, 251 size: 28, 40 orig: 28, 40 offset: 0, 0 index: -1 unit-omura-medium rotate: false - xy: 2025, 859 + xy: 983, 572 size: 22, 32 orig: 22, 32 offset: 0, 0 index: -1 unit-omura-small rotate: false - xy: 1262, 150 + xy: 1679, 226 size: 16, 24 orig: 16, 24 offset: 0, 0 index: -1 unit-omura-tiny rotate: false - xy: 1415, 158 + xy: 1389, 307 size: 11, 16 orig: 11, 16 offset: 0, 0 index: -1 unit-omura-xlarge rotate: false - xy: 1989, 799 + xy: 1501, 631 size: 33, 48 orig: 33, 48 offset: 0, 0 index: -1 unit-poly-large rotate: false - xy: 923, 597 + xy: 1825, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-poly-medium rotate: false - xy: 1489, 482 + xy: 1217, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-poly-small rotate: false - xy: 1594, 354 + xy: 1339, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-poly-tiny rotate: false - xy: 1280, 158 + xy: 1661, 198 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-poly-xlarge rotate: false - xy: 501, 216 + xy: 451, 118 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-pulsar-large rotate: false - xy: 1007, 646 - size: 40, 33 - orig: 40, 33 + xy: 1867, 743 + size: 40, 34 + orig: 40, 34 offset: 0, 0 index: -1 unit-pulsar-medium rotate: false - xy: 1557, 522 - size: 32, 26 - orig: 32, 26 + xy: 1251, 356 + size: 32, 27 + orig: 32, 27 offset: 0, 0 index: -1 unit-pulsar-small rotate: false - xy: 1620, 359 - size: 24, 19 - orig: 24, 19 + xy: 1499, 341 + size: 24, 20 + orig: 24, 20 offset: 0, 0 index: -1 unit-pulsar-tiny rotate: false - xy: 1865, 603 + xy: 1697, 364 size: 16, 13 orig: 16, 13 offset: 0, 0 index: -1 unit-pulsar-xlarge rotate: false - xy: 551, 285 - size: 48, 39 - orig: 48, 39 + 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: 965, 597 + xy: 881, 639 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-quasar-medium rotate: false - xy: 1523, 482 + xy: 1285, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-quasar-small rotate: false - xy: 1594, 328 + xy: 1551, 337 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-quasar-tiny rotate: false - xy: 1298, 158 + xy: 1679, 208 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-quasar-xlarge rotate: false - xy: 601, 330 + xy: 551, 233 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-reign-large rotate: false - xy: 1007, 618 + xy: 1783, 695 size: 40, 26 orig: 40, 26 offset: 0, 0 index: -1 unit-reign-medium rotate: false - xy: 2016, 919 + xy: 1489, 452 size: 31, 20 orig: 31, 20 offset: 0, 0 index: -1 unit-reign-small rotate: false - xy: 877, 410 + xy: 1577, 346 size: 24, 15 orig: 24, 15 offset: 0, 0 index: -1 unit-reign-tiny rotate: false - xy: 771, 916 + xy: 1157, 1 size: 15, 10 orig: 15, 10 offset: 0, 0 index: -1 unit-reign-xlarge rotate: false - xy: 651, 383 + xy: 601, 283 size: 48, 31 orig: 48, 31 offset: 0, 0 index: -1 unit-risso-large rotate: false - xy: 1979, 891 + xy: 1993, 849 size: 35, 40 orig: 35, 40 offset: 0, 0 index: -1 unit-risso-medium rotate: false - xy: 1748, 516 + xy: 2019, 747 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 unit-risso-small rotate: false - xy: 1594, 281 + xy: 1629, 311 size: 21, 24 orig: 21, 24 offset: 0, 0 index: -1 unit-risso-tiny rotate: false - xy: 1369, 158 + xy: 1517, 579 size: 14, 16 orig: 14, 16 offset: 0, 0 index: -1 unit-risso-xlarge rotate: false - xy: 551, 235 + xy: 601, 233 size: 43, 48 orig: 43, 48 offset: 0, 0 index: -1 unit-scepter-large rotate: false - xy: 1049, 647 + xy: 881, 605 size: 40, 32 orig: 40, 32 offset: 0, 0 index: -1 unit-scepter-medium rotate: false - xy: 1591, 522 + xy: 1319, 357 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 unit-scepter-small rotate: false - xy: 1646, 359 + xy: 1603, 342 size: 24, 19 orig: 24, 19 offset: 0, 0 index: -1 unit-scepter-tiny rotate: false - xy: 1755, 483 + xy: 1391, 218 size: 16, 13 orig: 16, 13 offset: 0, 0 index: -1 unit-scepter-xlarge rotate: false - xy: 701, 425 + xy: 651, 325 size: 48, 39 orig: 48, 39 offset: 0, 0 index: -1 unit-sei-large rotate: false - xy: 1091, 639 + xy: 923, 639 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-sei-medium rotate: false - xy: 1557, 488 + xy: 1489, 529 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-sei-small rotate: false - xy: 1620, 333 + xy: 1629, 337 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-sei-tiny rotate: false - xy: 1316, 158 + xy: 1699, 346 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-sei-xlarge rotate: false - xy: 401, 66 + xy: 701, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-spiroct-large rotate: false - xy: 1049, 614 + xy: 965, 648 size: 40, 31 orig: 40, 31 offset: 0, 0 index: -1 unit-spiroct-medium rotate: false - xy: 114, 1 + xy: 1489, 425 size: 31, 25 orig: 31, 25 offset: 0, 0 index: -1 unit-spiroct-small rotate: false - xy: 1594, 307 + xy: 1655, 342 size: 24, 19 orig: 24, 19 offset: 0, 0 index: -1 unit-spiroct-tiny rotate: false - xy: 1352, 162 + xy: 2029, 647 size: 15, 12 orig: 15, 12 offset: 0, 0 index: -1 unit-spiroct-xlarge rotate: false - xy: 351, 26 + xy: 401, 50 size: 48, 38 orig: 48, 38 offset: 0, 0 index: -1 unit-toxopid-large rotate: false - xy: 1989, 757 + xy: 1536, 639 size: 33, 40 orig: 33, 40 offset: 0, 0 @@ -20248,63 +22746,98 @@ unit-toxopid-medium index: -1 unit-toxopid-small rotate: false - xy: 631, 31 + xy: 2027, 823 size: 20, 24 orig: 20, 24 offset: 0, 0 index: -1 unit-toxopid-tiny rotate: false - xy: 1400, 158 + xy: 1717, 347 size: 13, 16 orig: 13, 16 offset: 0, 0 index: -1 unit-toxopid-xlarge rotate: false - xy: 1133, 631 + 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: 1175, 639 + xy: 965, 606 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-zenith-medium rotate: false - xy: 1591, 488 + xy: 1387, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-zenith-small rotate: false - xy: 1620, 307 + xy: 1603, 316 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-zenith-tiny rotate: false - xy: 1334, 158 + xy: 1625, 180 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-zenith-xlarge rotate: false - xy: 451, 116 + xy: 501, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 wavepane rotate: false - xy: 1951, 704 + xy: 1425, 623 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -20312,7 +22845,7 @@ wavepane index: -1 white-pane rotate: false - xy: 1909, 671 + xy: 1463, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -20320,14 +22853,14 @@ white-pane index: -1 whiteui rotate: false - xy: 546, 211 + xy: 821, 928 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 1038, 194 + 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 6508130c22..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 38e9ca8235..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 cbc9ef549b..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 cea5ab31a9..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 43330a0028..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 3e03d0223a..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 f9610bc02f..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 830ecef064..75be83066e 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -4,6540 +4,6806 @@ size: 4096,4096 format: rgba8888 filter: nearest,nearest repeat: none -core-silo - rotate: false - xy: 951, 1344 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 launch-pad rotate: false - xy: 2623, 2955 + xy: 1951, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large rotate: false - xy: 3177, 2975 + xy: 1703, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 launch-pad-light rotate: false - xy: 2721, 2955 + xy: 2245, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launchpod rotate: false - xy: 3437, 3103 + xy: 2013, 1618 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 force-projector rotate: false - xy: 2041, 2251 + xy: 2918, 2757 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector-top rotate: false - xy: 2139, 2251 + xy: 1657, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 3635, 3193 + xy: 2029, 760 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 3569, 3127 + xy: 2091, 1156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender rotate: false - xy: 2937, 2509 + xy: 3323, 2187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-top rotate: false - xy: 2971, 2509 + xy: 2439, 812 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-dome rotate: false - xy: 3407, 2877 + xy: 2245, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-top rotate: false - xy: 3113, 2779 + xy: 2343, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 3503, 3061 + xy: 2095, 1090 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 3701, 3193 + xy: 2095, 1024 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 1765, 2043 + xy: 3585, 2319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-loader rotate: false - xy: 1203, 794 + xy: 1899, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader rotate: false - xy: 1937, 2947 + xy: 1644, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 3231, 2745 + xy: 2361, 1746 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 3401, 2745 + xy: 2361, 1576 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 3435, 2745 + xy: 2361, 1542 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 3469, 2745 + xy: 2279, 718 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 3095, 2711 + xy: 2279, 684 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-0 rotate: false - xy: 461, 1 + xy: 1981, 1518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-full rotate: false - xy: 461, 1 + xy: 1981, 1518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-1 rotate: false - xy: 3903, 2675 + xy: 1053, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-2 rotate: false - xy: 1251, 2723 + xy: 2319, 1160 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-3 rotate: false - xy: 2361, 3197 + xy: 2277, 1076 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-0 rotate: false - xy: 2087, 2151 + xy: 1113, 2285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-1 rotate: false - xy: 1285, 2723 + xy: 4005, 3587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-2 rotate: false - xy: 2361, 3163 + xy: 1087, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-3 rotate: false - xy: 2361, 3129 + xy: 2319, 1126 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-0 rotate: false - xy: 2121, 2151 + xy: 2277, 1042 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-1 rotate: false - xy: 1319, 2723 + xy: 1113, 2251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-2 rotate: false - xy: 2155, 2151 + xy: 4039, 3587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-3 rotate: false - xy: 2189, 2151 + xy: 1121, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-0 rotate: false - xy: 2223, 2151 + xy: 2277, 1008 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-1 rotate: false - xy: 1605, 2129 + xy: 1155, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-2 rotate: false - xy: 1473, 776 + xy: 2277, 974 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-3 rotate: false - xy: 1481, 742 + xy: 1189, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-0 rotate: false - xy: 1481, 708 + xy: 2277, 940 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-1 rotate: false - xy: 1481, 674 + xy: 2277, 906 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-2 rotate: false - xy: 1481, 640 + xy: 1654, 3015 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-3 rotate: false - xy: 1481, 606 + xy: 3559, 2622 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 3537, 2697 + xy: 2347, 642 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 3571, 2697 + xy: 2313, 608 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 3605, 2697 + xy: 2347, 608 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 3639, 2697 + xy: 2313, 574 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 2749, 2581 + xy: 2347, 574 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 2699, 2547 + xy: 2313, 540 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 2733, 2547 + xy: 2347, 540 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 2767, 2547 + xy: 2313, 506 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 2841, 2655 + xy: 2347, 506 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1751, 2111 + xy: 2313, 472 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 1785, 2111 + xy: 2347, 472 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 1819, 2111 + xy: 2313, 438 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1853, 2111 + xy: 2347, 438 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1887, 2111 + xy: 2317, 404 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1921, 2111 + xy: 2351, 404 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1955, 2111 + xy: 2381, 710 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1989, 2111 + xy: 2381, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 2023, 2113 + xy: 2381, 642 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 2057, 2113 + xy: 2381, 608 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor rotate: false - xy: 2552, 2311 + xy: 3347, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-0 rotate: false - xy: 2552, 2277 + xy: 3347, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-1 rotate: false - xy: 2549, 2243 + xy: 3381, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-2 rotate: false - xy: 2549, 2209 + xy: 3381, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-edge rotate: false - xy: 2549, 2175 + xy: 3415, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-stack rotate: false - xy: 2549, 2141 + xy: 3415, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 2105, 2049 + xy: 2511, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 2173, 2083 + xy: 2395, 2075 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 2139, 2049 + xy: 2395, 2041 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 2207, 2083 + xy: 2429, 2075 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 2173, 2049 + xy: 2395, 2007 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 2207, 2049 + xy: 2463, 2075 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 2241, 2083 + xy: 2429, 2041 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 2241, 2049 + xy: 2395, 1973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1731, 2009 + xy: 2497, 2075 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1765, 2009 + xy: 2463, 2041 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1799, 2009 + xy: 2429, 2007 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1833, 2009 + xy: 2395, 1939 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1867, 2009 + xy: 2497, 2041 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1901, 2009 + xy: 2463, 2007 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1935, 2009 + xy: 2429, 1973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1969, 2009 + xy: 2395, 1905 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 2003, 2009 + xy: 2497, 2007 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 2037, 2011 + xy: 2463, 1973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 2071, 2011 + xy: 2429, 1939 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cross rotate: false - xy: 3027, 2679 + xy: 3085, 2227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor rotate: false - xy: 1255, 54 + xy: 2845, 2331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 inverted-sorter rotate: false - xy: 3367, 2677 + xy: 3245, 2357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 2937, 2543 + xy: 3211, 2283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 2721, 2857 + xy: 2343, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 3073, 2509 + xy: 2449, 710 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 payload-conveyor rotate: false - xy: 3211, 2779 + xy: 2441, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-edge rotate: false - xy: 3309, 2779 + xy: 2539, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-top rotate: false - xy: 3407, 2779 + xy: 2637, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-top rotate: false - xy: 3407, 2779 + xy: 2637, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router rotate: false - xy: 1187, 694 + xy: 2637, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-edge rotate: false - xy: 1187, 596 + xy: 2637, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-over rotate: false - xy: 1187, 498 + xy: 2735, 2647 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 1509, 62 + xy: 2449, 540 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 1505, 28 + xy: 2449, 506 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 2552, 2413 + xy: 2449, 472 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 2552, 2379 + xy: 2449, 438 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 1663, 2121 + xy: 3493, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 1799, 2043 + xy: 3527, 2253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 underflow-gate rotate: false - xy: 2173, 2015 + xy: 2463, 1939 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 1381, 2741 + xy: 1805, 1148 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 1511, 2741 + xy: 3263, 3099 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 1641, 2741 + xy: 3393, 3099 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 1391, 2611 + xy: 1899, 1018 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 drill-top rotate: false - xy: 3591, 3457 + xy: 2911, 2265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 steam-generator-liquid rotate: false - xy: 3591, 3457 + xy: 2911, 2265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 2237, 2253 + xy: 1657, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 2427, 3031 + xy: 1951, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 2427, 2933 + xy: 2049, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 2525, 2955 + xy: 2147, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 3569, 3193 + xy: 2029, 1024 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 3503, 3127 + xy: 2029, 958 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 3701, 3259 + xy: 2029, 892 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 3015, 2857 + xy: 2539, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 3113, 2877 + xy: 1951, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 3211, 2877 + xy: 2049, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 3309, 2877 + xy: 2147, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 3701, 2995 + xy: 2147, 430 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 3505, 2929 + xy: 2647, 2245 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 3505, 2863 + xy: 2713, 2249 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 3835, 2909 + xy: 2145, 1958 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 3835, 2843 + xy: 2145, 1892 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 3835, 2777 + xy: 2145, 1826 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 3505, 2731 + xy: 2145, 1760 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 1479, 402 + xy: 2353, 1152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 1629, 2061 + xy: 2379, 914 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 3027, 2747 + xy: 1524, 2635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 3333, 2711 + xy: 2279, 446 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 1187, 400 + xy: 2735, 2549 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 3265, 2745 + xy: 2361, 1712 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 3299, 2745 + xy: 2361, 1678 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 3299, 2745 + xy: 2361, 1678 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 3333, 2745 + xy: 2361, 1644 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 3367, 2745 + xy: 2361, 1610 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 3197, 2711 + xy: 2279, 582 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 3231, 2711 + xy: 2279, 548 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 3265, 2711 + xy: 2279, 514 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 3299, 2711 + xy: 2279, 480 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 3299, 2711 + xy: 2279, 480 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 3299, 2711 + xy: 2279, 480 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 3367, 2711 + xy: 2313, 710 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 3401, 2711 + xy: 2347, 710 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 3435, 2711 + xy: 2313, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 3469, 2711 + xy: 2347, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 3469, 2711 + xy: 2347, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 3503, 2697 + xy: 2313, 642 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 3039, 2543 + xy: 3313, 2289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate rotate: false - xy: 679, 6 + xy: 3153, 2199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate-top rotate: false - xy: 1475, 164 + xy: 3187, 2249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 1475, 130 + xy: 3187, 2215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1475, 96 + xy: 3221, 2249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1475, 62 + xy: 3221, 2215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 2819, 2955 + xy: 2049, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 2917, 2955 + xy: 2147, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 3015, 2955 + xy: 2343, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 2801, 2519 + xy: 3187, 2181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-liquid rotate: false - xy: 2835, 2519 + xy: 3221, 2181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-liquid rotate: false - xy: 2835, 2519 + xy: 3221, 2181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-liquid rotate: false - xy: 2835, 2519 + xy: 3221, 2181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 1508, 198 + xy: 2449, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 1509, 164 + xy: 2449, 642 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1509, 130 + xy: 2449, 608 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1509, 96 + xy: 2449, 574 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-cap rotate: false - xy: 2549, 2073 + xy: 3449, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-0 rotate: false - xy: 3789, 3337 + xy: 3483, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-1 rotate: false - xy: 1627, 1566 + xy: 3483, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-2 rotate: false - xy: 1627, 1532 + xy: 3357, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-3 rotate: false - xy: 1625, 1498 + xy: 3357, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-4 rotate: false - xy: 1681, 1148 + xy: 3391, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1681, 1012 + xy: 3391, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1681, 978 + xy: 3425, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1681, 944 + xy: 3459, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1681, 910 + xy: 3425, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 3637, 2863 + xy: 2079, 1882 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 1285, 578 + xy: 3127, 2671 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hyper-processor rotate: false - xy: 2237, 2545 + xy: 1853, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 large-logic-display rotate: false - xy: 1581, 2871 + xy: 1307, 1646 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 logic-display rotate: false - xy: 2525, 2857 + xy: 2245, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor rotate: false - xy: 3437, 3037 + 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: 2903, 2519 + xy: 3289, 2187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 3005, 2509 + xy: 2439, 778 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor rotate: false - xy: 3039, 2509 + xy: 2439, 744 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch rotate: false - xy: 2071, 2045 + xy: 2409, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch-on rotate: false - xy: 2105, 2083 + xy: 2443, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery rotate: false - xy: 1481, 572 + xy: 3593, 2622 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large rotate: false - xy: 1333, 1950 + xy: 1935, 1224 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-large-top rotate: false - xy: 1319, 1852 + xy: 3231, 2989 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-top rotate: false - xy: 1481, 538 + xy: 2291, 80 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 3129, 2711 + xy: 2279, 650 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 3163, 2711 + xy: 2279, 616 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator rotate: false - xy: 2041, 2643 + xy: 2330, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 2139, 2741 + xy: 2526, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 2041, 2545 + xy: 2428, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode rotate: false - xy: 3061, 2679 + xy: 3085, 2193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode-arrow rotate: false - xy: 3095, 2677 + xy: 3119, 2267 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator rotate: false - xy: 3265, 2677 + xy: 3279, 2391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-top rotate: false - xy: 3299, 2677 + xy: 3313, 2391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor rotate: false - xy: 2527, 3053 + xy: 3913, 3079 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-bottom rotate: false - xy: 2657, 3053 + xy: 1817, 1908 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-light rotate: false - xy: 2787, 3053 + xy: 1817, 1778 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-0 rotate: false - xy: 2917, 3053 + xy: 1817, 1648 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-1 rotate: false - xy: 3047, 3053 + xy: 1817, 1518 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-2 rotate: false - xy: 3177, 3235 + xy: 2143, 238 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-3 rotate: false - xy: 3177, 3105 + xy: 2143, 108 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 power-node rotate: false - xy: 1681, 1114 + xy: 3357, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 3571, 2929 + xy: 2779, 2249 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source rotate: false - xy: 1681, 1080 + xy: 3391, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 1681, 1046 + xy: 3425, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 3637, 2797 + xy: 2079, 1816 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 1663, 2087 + xy: 3357, 2167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 1833, 2077 + xy: 3527, 2287 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 1285, 676 + xy: 3029, 2671 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 steam-generator rotate: false - xy: 3899, 3041 + xy: 2213, 562 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 steam-generator-cap rotate: false - xy: 3965, 3297 + xy: 2213, 496 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 steam-generator-top rotate: false - xy: 4031, 3297 + xy: 2213, 430 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 steam-generator-turbine0 rotate: false - xy: 3965, 3231 + xy: 2037, 2222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 steam-generator-turbine1 rotate: false - xy: 4031, 3231 + xy: 2103, 2222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-tower rotate: false - xy: 3965, 3165 + xy: 2027, 2156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 4031, 3099 + xy: 2159, 2156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 1285, 480 + xy: 3029, 2573 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 1285, 382 + xy: 3029, 2475 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-top rotate: false - xy: 1285, 284 + xy: 3127, 2573 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter rotate: false - xy: 1215, 1284 + xy: 1919, 1420 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 1333, 2048 + xy: 1935, 1322 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 1827, 2187 + xy: 1825, 2043 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-forge rotate: false - xy: 1313, 1264 + xy: 3281, 2695 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 coal-centrifuge rotate: false - xy: 1499, 1864 + xy: 3874, 2651 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cryofluidmixer-bottom +cryofluid-mixer-bottom rotate: false - xy: 1123, 90 + xy: 3029, 2409 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cryofluidmixer-liquid +cryofluid-mixer-liquid rotate: false - xy: 1123, 24 + xy: 3095, 2409 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cryofluidmixer-top +cryofluid-mixer-top rotate: false - xy: 1189, 138 + xy: 3373, 2371 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 1189, 72 + xy: 3439, 2371 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 1189, 6 + xy: 2833, 2397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 1255, 120 + xy: 2899, 2397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 disassembler rotate: false - xy: 2139, 2643 + xy: 2526, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-liquid rotate: false - xy: 2041, 2447 + xy: 2624, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-spinner rotate: false - xy: 2139, 2545 + xy: 2624, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 3591, 3391 + xy: 2013, 1948 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 incinerator rotate: false - xy: 3333, 2677 + xy: 3211, 2351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 3037, 2645 + xy: 2415, 472 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 3039, 2577 + xy: 3313, 2323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln rotate: false - xy: 3459, 3367 + xy: 2013, 1882 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 3437, 3301 + xy: 2013, 1816 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 3437, 3301 + xy: 2013, 1816 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 747, 2 + xy: 3289, 2255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-void rotate: false - xy: 781, 2 + xy: 3289, 2221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 2869, 2519 + xy: 3255, 2187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press rotate: false - xy: 2819, 2857 + xy: 2539, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 3701, 3127 + xy: 2095, 826 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 3635, 3061 + xy: 2095, 760 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 3701, 3061 + xy: 2147, 694 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 3503, 2995 + xy: 2147, 628 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 3569, 2995 + xy: 2147, 562 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 1681, 876 + xy: 3459, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 1681, 842 + xy: 3459, 2201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 3571, 2863 + xy: 2911, 2199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 3769, 2797 + xy: 2099, 1222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 3833, 3305 + xy: 2157, 1156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-spinner rotate: false - xy: 3833, 3239 + xy: 2161, 1090 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-crucible rotate: false - xy: 1309, 872 + xy: 2931, 2561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-crucible-top rotate: false - xy: 1301, 774 + xy: 2931, 2463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 3899, 3305 + xy: 2161, 1024 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 3833, 3173 + xy: 2161, 958 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 3899, 3239 + xy: 2161, 892 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 3833, 3107 + xy: 2161, 826 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 3899, 3173 + xy: 2161, 760 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 3833, 3041 + xy: 2213, 694 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 3899, 3107 + xy: 2213, 628 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 boulder1 rotate: false - xy: 3987, 2693 + xy: 1604, 2999 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 boulder2 rotate: false - xy: 4037, 2693 + xy: 3796, 2610 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dacite-boulder1 rotate: false - xy: 1535, 1318 + xy: 2221, 2086 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dacite-boulder2 rotate: false - xy: 1535, 1268 + xy: 2211, 2036 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-boulder1 rotate: false - xy: 1663, 2053 + xy: 3391, 2167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-boulder2 rotate: false - xy: 1663, 2019 + xy: 3425, 2167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder1 rotate: false - xy: 1731, 2043 + xy: 3551, 2321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder2 rotate: false - xy: 1799, 2077 + xy: 3585, 2353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-boulder1 rotate: false - xy: 2715, 2807 + xy: 2315, 1286 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-boulder2 rotate: false - xy: 2565, 2607 + xy: 2357, 1486 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-cluster1 rotate: false - xy: 1885, 2145 + xy: 1641, 6 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster2 rotate: false - xy: 1927, 2145 + xy: 2277, 1152 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster3 rotate: false - xy: 1969, 2145 + xy: 2277, 1110 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 white-tree rotate: false - xy: 1322, 3775 + xy: 1, 1523 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead rotate: false - xy: 1, 2137 + 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: 1499, 1732 + xy: 4022, 2709 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 container-team rotate: false - xy: 1499, 1666 + xy: 4006, 2643 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation rotate: false - xy: 1651, 2481 + xy: 2017, 628 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation-team rotate: false - xy: 1651, 2351 + xy: 2017, 498 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus rotate: false - xy: 1775, 2773 + xy: 1401, 460 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus-team rotate: false - xy: 953, 1830 + xy: 1397, 298 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard rotate: false - xy: 2067, 3133 + xy: 1840, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team rotate: false - xy: 2165, 3133 + xy: 1742, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 unloader rotate: false - xy: 2207, 2015 + xy: 2429, 1905 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 2241, 2015 + xy: 2395, 1837 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault rotate: false - xy: 1280, 186 + xy: 3323, 2511 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 vault-team rotate: false - xy: 1383, 676 + xy: 3421, 2511 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 427, 1 + xy: 2820, 2855 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 1481, 504 + xy: 2291, 46 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 1893, 2187 + xy: 1895, 2212 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-3 rotate: false - xy: 1319, 1754 + xy: 3329, 3001 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-4 rotate: false - xy: 1391, 2481 + 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: 3167, 3365 + xy: 781, 1 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 3437, 3169 + xy: 2013, 1684 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 3307, 3105 + xy: 1963, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 1182, 204 + xy: 2833, 2659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 3703, 2863 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-left - rotate: false - xy: 3703, 2797 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-right - rotate: false - xy: 3767, 3259 + xy: 2079, 1684 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-heat rotate: false - xy: 1697, 2061 + 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: 3637, 2731 + 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: 1217, 1578 + xy: 2873, 3103 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 additive-reconstructor-top rotate: false - xy: 1215, 1480 + xy: 1559, 2571 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory rotate: false - xy: 1215, 1382 + xy: 1559, 2473 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 command-center rotate: false - xy: 1499, 1798 + 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: 1645, 3097 + xy: 1127, 3211 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 exponential-reconstructor-top rotate: false - xy: 291, 1911 + xy: 2531, 3307 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-in-3 rotate: false - xy: 2041, 2349 + xy: 2722, 2843 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-in-5 rotate: false - xy: 3657, 3391 + xy: 1563, 608 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-in-7 rotate: false - xy: 291, 1685 + xy: 831, 899 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-in-9 rotate: false - xy: 1, 687 + xy: 3655, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 factory-out-3 rotate: false - xy: 2139, 2447 + xy: 2722, 2745 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-out-5 rotate: false - xy: 3819, 3371 + xy: 1563, 446 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-out-7 rotate: false - xy: 291, 1459 + xy: 831, 673 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-out-9 rotate: false - xy: 3094, 3807 + xy: 403, 2331 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 factory-top-3 rotate: false - xy: 2139, 2349 + xy: 2820, 2757 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ground-factory rotate: false - xy: 2237, 2643 + xy: 1755, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor rotate: false - xy: 1057, 2276 + xy: 1559, 284 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 multiplicative-reconstructor-top rotate: false - xy: 1041, 2114 + xy: 1559, 122 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory rotate: false - xy: 2917, 2857 + xy: 2441, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rally-point rotate: false - xy: 3637, 2929 + xy: 2079, 2014 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 1681, 774 + xy: 3493, 2235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point rotate: false - xy: 3571, 2797 + xy: 2079, 1948 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tetrative-reconstructor rotate: false - xy: 1, 397 + xy: 323, 2041 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor-top rotate: false - xy: 3384, 3807 + xy: 323, 1751 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 2091, 2117 + xy: 2381, 574 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 1565, 1798 + xy: 2317, 2301 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door rotate: false - xy: 3129, 2677 + xy: 3119, 2233 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large rotate: false - xy: 3459, 3433 + xy: 2911, 2331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 3525, 3457 + xy: 2845, 2265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 3163, 2677 + xy: 3119, 2199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 2552, 2345 + xy: 2453, 404 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 3569, 3061 + xy: 2095, 892 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-wall rotate: false - xy: 2549, 2107 + xy: 3449, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large rotate: false - xy: 3635, 2995 + xy: 2147, 496 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-gigantic rotate: false - xy: 1911, 2253 + xy: 2613, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge2 rotate: false - xy: 1309, 1068 + xy: 2833, 2463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 1309, 970 + xy: 2931, 2659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 3767, 3127 + xy: 2079, 1552 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 3767, 3061 + xy: 2083, 1486 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 3767, 2995 + xy: 2083, 1420 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 3769, 2929 + xy: 2099, 1354 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 1697, 2027 + xy: 3517, 2355 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 1731, 2077 + xy: 3517, 2321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1765, 2077 + xy: 3551, 2355 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1765, 2077 + xy: 3551, 2355 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 2071, 2079 + xy: 2375, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 4031, 3165 + xy: 2093, 2156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 2139, 2083 + xy: 2477, 2109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 3965, 3033 + xy: 2155, 2090 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster rotate: false - xy: 1081, 922 + xy: 2743, 2941 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 2105, 2015 + xy: 2395, 1871 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 4031, 3033 + xy: 2169, 2222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bullet rotate: false - xy: 1321, 132 + xy: 4043, 3285 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 1321, 78 + xy: 4043, 3231 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 3819, 3535 + xy: 3517, 2303 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-end rotate: false - xy: 1115, 1799 + xy: 1440, 2754 size: 100, 199 orig: 100, 199 offset: 0, 0 index: -1 circle-mid rotate: false - xy: 1629, 3090 + xy: 605, 1550 size: 1, 199 orig: 1, 199 offset: 0, 0 index: -1 circle-shadow rotate: false - xy: 733, 1258 + xy: 1356, 2422 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 error rotate: false - xy: 1481, 1168 + 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: 1381, 2967 + xy: 567, 93 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 laser-end rotate: false - xy: 1407, 940 + xy: 3299, 2425 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser rotate: false - xy: 1381, 2917 + xy: 2973, 3293 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 1407, 866 + xy: 3373, 2437 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 missile rotate: false - xy: 3075, 2819 + xy: 1683, 10 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 3075, 2781 + xy: 1113, 2319 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 parallax-laser rotate: false - xy: 3497, 2987 + xy: 2751, 3257 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 parallax-laser-end rotate: false - xy: 1399, 792 + xy: 3447, 2437 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 particle rotate: false - xy: 1843, 2145 + xy: 1109, 2601 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 2329, 2852 + xy: 1501, 1088 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 shell rotate: false - xy: 2011, 2147 + xy: 3967, 3583 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 2049, 2147 + xy: 2683, 2941 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 transfer rotate: false - xy: 1176, 172 + xy: 397, 2439 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 2139, 2015 + xy: 2497, 1973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white rotate: false - xy: 712, 628 + xy: 3652, 2791 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 alpha-outline rotate: false - xy: 1425, 122 + xy: 3225, 2719 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck0 rotate: false - xy: 1375, 72 + xy: 3323, 2645 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck1 rotate: false - xy: 1425, 72 + xy: 2590, 2251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck2 rotate: false - xy: 686, 44 + xy: 3035, 2245 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 antumbra-outline rotate: false - xy: 291, 733 + xy: 935, 2357 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck0 rotate: false - xy: 291, 491 + xy: 895, 2115 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck1 rotate: false - xy: 517, 1745 + xy: 895, 1873 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck2 rotate: false - xy: 517, 1503 + xy: 895, 1631 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 arc rotate: false - xy: 393, 1 + xy: 1947, 1518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 arkyid-foot rotate: false - xy: 2527, 3317 + xy: 3652, 2605 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-joint-base rotate: false - xy: 259, 185 + xy: 3601, 2533 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-leg rotate: false - xy: 3901, 2883 + xy: 1063, 3315 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 arkyid-leg-base rotate: false - xy: 3991, 3641 + xy: 1479, 3709 size: 104, 64 orig: 104, 64 offset: 0, 0 index: -1 arkyid-outline rotate: false - xy: 3956, 3707 + xy: 3263, 3229 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-wreck0 rotate: false - xy: 1251, 2887 + xy: 3393, 3229 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-wreck1 rotate: false - xy: 1251, 2757 + xy: 1397, 6 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-wreck2 rotate: false - xy: 2397, 3259 + xy: 1805, 1278 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 artillery-mount-outline rotate: false - xy: 333, 277 + xy: 3724, 2605 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 artillery-outline rotate: false - xy: 786, 36 + xy: 4043, 3115 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 atrax-foot rotate: false - xy: 1431, 2140 + xy: 1585, 3733 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 atrax-joint rotate: false - xy: 394, 3747 + 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: 3113, 2975 + xy: 1817, 1408 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 atrax-outline rotate: false - xy: 1487, 2285 + xy: 1935, 1158 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck0 rotate: false - xy: 91, 7 + xy: 3907, 3013 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck1 rotate: false - xy: 1577, 2285 + xy: 691, 27 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck2 rotate: false - xy: 1667, 2285 + xy: 91, 7 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 beam-weapon-outline rotate: false - xy: 2425, 2465 + xy: 3477, 2611 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 beta-outline rotate: false - xy: 1371, 22 - size: 48, 48 - orig: 48, 48 + xy: 2683, 2979 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 beta-wreck0 rotate: false - xy: 1421, 22 - size: 48, 48 - orig: 48, 48 + xy: 3016, 2799 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 beta-wreck1 rotate: false - xy: 3703, 2697 - size: 48, 48 - orig: 48, 48 + xy: 3161, 2419 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 beta-wreck2 rotate: false - xy: 3753, 2689 - size: 48, 48 - orig: 48, 48 + xy: 2965, 2407 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 block-additive-reconstructor-full rotate: false - xy: 1319, 1656 + xy: 3281, 2891 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-air-factory-full rotate: false - xy: 1315, 1558 + xy: 3281, 2793 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-arc-full rotate: false - xy: 1481, 470 + xy: 2291, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-basalt-full rotate: false - xy: 1479, 436 + xy: 2357, 1186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-full rotate: false - xy: 1521, 2611 + xy: 1899, 758 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-boulder-full rotate: false - xy: 511, 2 + xy: 1001, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-char-full rotate: false - xy: 1479, 368 + xy: 2353, 1118 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-command-center-full + rotate: false + xy: 1961, 2212 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 block-conduit-full rotate: false - xy: 1479, 334 + xy: 2391, 1186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-full rotate: false - xy: 1959, 2187 + xy: 1895, 2146 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-conveyor-full rotate: false - xy: 1479, 300 + xy: 2387, 1152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 1479, 300 + xy: 2387, 1152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-full rotate: false - xy: 1391, 2351 + xy: 1887, 628 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-core-nucleus-full rotate: false - xy: 3829, 3533 + xy: 1423, 784 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 block-core-shard-full rotate: false - xy: 1313, 1460 + xy: 3379, 2903 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-craters-full rotate: false - xy: 1479, 266 + xy: 2387, 1118 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cryofluidmixer-full +block-cryofluid-mixer-full rotate: false - xy: 2025, 2185 + xy: 1961, 2146 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cultivator-full rotate: false - xy: 2091, 2185 + xy: 1891, 2080 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cyclone-full rotate: false - xy: 1313, 1362 + xy: 3379, 2805 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-dacite-boulder-full rotate: false - xy: 561, 2 + xy: 3035, 2195 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dacite-full rotate: false - xy: 3937, 2659 + xy: 2319, 1092 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dacite-wall-full rotate: false - xy: 3971, 2659 + xy: 2311, 1058 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-metal-full rotate: false - xy: 4005, 2659 + xy: 2311, 1024 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-full rotate: false - xy: 4039, 2659 + xy: 2311, 990 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dirt-full rotate: false - xy: 3903, 2641 + xy: 2311, 956 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dirt-wall-full rotate: false - xy: 3937, 2625 + xy: 2311, 922 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dune-wall-full rotate: false - xy: 3971, 2625 + xy: 2353, 1084 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-full rotate: false - xy: 4005, 2625 + xy: 2387, 1084 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-exponential-reconstructor-full rotate: false - xy: 2129, 3581 + 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: 1200, 1186 + xy: 3379, 2707 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-grass-full rotate: false - xy: 4039, 2625 + xy: 2345, 1050 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ground-factory-full rotate: false - xy: 1211, 1088 + xy: 3379, 2609 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-hail-full rotate: false - xy: 611, 6 + xy: 2345, 1016 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-full rotate: false - xy: 645, 6 + xy: 2379, 1050 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-full rotate: false - xy: 1479, 232 + xy: 2345, 982 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-full rotate: false - xy: 1474, 198 + xy: 2379, 1016 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-wall-full rotate: false - xy: 2715, 2581 + xy: 2345, 948 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-impact-reactor-full rotate: false - xy: 1521, 2481 + xy: 1887, 368 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-lancer-full rotate: false - xy: 2157, 2185 + xy: 1957, 2080 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-laser-drill-full rotate: false - xy: 1211, 990 + xy: 1703, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-liquid-router-full rotate: false - xy: 2815, 2689 + xy: 2379, 982 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-full rotate: false - xy: 1211, 892 + xy: 1801, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-magmarock-full rotate: false - xy: 2807, 2655 + xy: 2379, 948 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-driver-full rotate: false - xy: 3991, 3461 + xy: 1997, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-mechanical-drill-full rotate: false - xy: 2223, 2185 + xy: 1947, 2014 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-meltdown-full rotate: false - xy: 1521, 2351 + xy: 1883, 238 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-metal-floor-damaged-full rotate: false - xy: 1629, 2095 + xy: 2345, 914 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-full rotate: false - xy: 1629, 2027 + xy: 2311, 888 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mud-full rotate: false - xy: 836, 10 + xy: 2277, 872 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multiplicative-reconstructor-full rotate: false - xy: 1775, 2935 + xy: 1401, 622 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 block-naval-factory-full rotate: false - xy: 3981, 3363 + xy: 2095, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-oil-extractor-full rotate: false - xy: 1887, 3241 + xy: 2193, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-ore-coal-full rotate: false - xy: 870, 10 + xy: 2345, 880 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-full rotate: false - xy: 904, 14 + xy: 2379, 880 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-full rotate: false - xy: 938, 14 + xy: 2269, 838 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-full rotate: false - xy: 972, 14 + xy: 2269, 804 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-full rotate: false - xy: 1006, 14 + xy: 2269, 770 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-full rotate: false - xy: 1717, 2129 + xy: 2311, 854 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-parallax-full rotate: false - xy: 1068, 156 + xy: 1947, 1948 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-payload-conveyor-full rotate: false - xy: 1985, 3241 + xy: 2291, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-icon rotate: false - xy: 1985, 3241 + xy: 2291, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-payload-router-full rotate: false - xy: 1871, 3143 + xy: 2389, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon rotate: false - xy: 1871, 3143 + xy: 2389, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-pebbles-full rotate: false - xy: 2857, 2773 + xy: 2345, 846 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-weaver-full rotate: false - xy: 1057, 90 + xy: 1947, 1882 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-plated-conduit-full rotate: false - xy: 2857, 2739 + xy: 2379, 846 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pneumatic-drill-full rotate: false - xy: 1057, 24 + xy: 1947, 1816 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-pulse-conduit-full rotate: false - xy: 2891, 2781 + xy: 2303, 820 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-full rotate: false - xy: 2891, 2747 + xy: 2303, 786 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-repair-point-full rotate: false - xy: 2925, 2781 + xy: 2337, 812 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ripple-full rotate: false - xy: 1969, 3143 + xy: 2487, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-salt-wall-full rotate: false - xy: 2925, 2747 + xy: 2371, 812 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salvo-full rotate: false - xy: 1473, 2128 + xy: 1947, 1750 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-sand-boulder-full rotate: false - xy: 2959, 2781 + xy: 2337, 778 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-full rotate: false - xy: 2959, 2747 + xy: 2371, 778 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-wall-full rotate: false - xy: 2993, 2781 + xy: 2303, 752 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scatter-full rotate: false - xy: 1431, 2062 + xy: 1947, 1684 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-scorch-full rotate: false - xy: 2993, 2747 + xy: 2337, 744 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-full rotate: false - xy: 3027, 2781 + xy: 2371, 744 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall1 rotate: false - xy: 3027, 2781 + xy: 2371, 744 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-huge-full rotate: false - xy: 1937, 3045 + xy: 2585, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge1 rotate: false - xy: 1937, 3045 + xy: 2585, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-scrap-wall-large-full rotate: false - xy: 1431, 1996 + xy: 1947, 1618 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-segment-full rotate: false - xy: 1497, 2062 + xy: 1947, 1552 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-shale-boulder-full rotate: false - xy: 3061, 2747 + xy: 1638, 2965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-full rotate: false - xy: 2857, 2705 + xy: 2575, 2159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-wall-full rotate: false - xy: 2891, 2713 + xy: 2575, 2125 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-full rotate: false - xy: 2925, 2713 + xy: 2361, 2052 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-boulder-full rotate: false - xy: 3937, 2693 + xy: 1554, 2999 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snow-full rotate: false - xy: 2959, 2713 + xy: 2361, 2018 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-wall-full rotate: false - xy: 2993, 2713 + xy: 2361, 1984 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spectre-full rotate: false - xy: 1651, 2611 + xy: 1883, 108 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-spore-cluster-full rotate: false - xy: 3417, 3375 + xy: 1891, 2038 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-moss-full rotate: false - xy: 3027, 2713 + xy: 2361, 1950 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-press-full rotate: false - xy: 1497, 1996 + xy: 3829, 2792 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-spore-wall-full rotate: false - xy: 3061, 2713 + xy: 2361, 1916 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-steam-generator-full rotate: false - xy: 1539, 2128 + xy: 3895, 2783 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-stone-full rotate: false - xy: 3095, 2745 + xy: 2361, 1882 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-stone-wall-full rotate: false - xy: 3129, 2745 + xy: 2361, 1848 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-swarmer-full rotate: false - xy: 1563, 2062 + xy: 3824, 2726 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-tendrils-full rotate: false - xy: 3163, 2745 + xy: 2361, 1814 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tetrative-reconstructor-full rotate: false - xy: 1644, 3807 + xy: 1, 1233 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 block-titanium-conveyor-full rotate: false - xy: 3197, 2745 + xy: 2361, 1780 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 3197, 2745 + 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: 1937, 2849 + xy: 1742, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-water-extractor-full rotate: false - xy: 1563, 1996 + xy: 3890, 2717 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-wave-full rotate: false - xy: 1499, 1930 + xy: 3808, 2660 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bryde-outline rotate: false - xy: 2883, 3313 + xy: 1663, 1124 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-wreck0 rotate: false - xy: 3025, 3313 + xy: 1757, 982 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-wreck1 rotate: false - xy: 3215, 3365 + xy: 1757, 840 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-wreck2 rotate: false - xy: 2113, 3231 + 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: 1565, 1930 + xy: 2185, 2301 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 container-team-sharded rotate: false - xy: 1565, 1864 + xy: 2251, 2301 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-team-crux rotate: false - xy: 1781, 2643 + xy: 2017, 368 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation-team-sharded rotate: false - xy: 1781, 2513 + xy: 2013, 238 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-team-crux rotate: false - xy: 953, 1668 + xy: 1397, 136 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus-team-sharded rotate: false - xy: 951, 1506 + xy: 1501, 2066 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-team-crux rotate: false - xy: 2263, 3133 + xy: 1938, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team-sharded rotate: false - xy: 2035, 3035 + 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 +corvus-wreck0 + rotate: false + xy: 1016, 2927 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-wreck1 + rotate: false + 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: 2125, 2117 + xy: 2381, 540 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 2159, 2117 + xy: 2381, 506 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 2193, 2117 + xy: 2381, 472 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 2227, 2117 + xy: 2381, 438 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 2891, 2679 + xy: 2385, 404 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 2925, 2679 + xy: 3587, 2421 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 2959, 2679 + xy: 3587, 2387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 2993, 2679 + xy: 3085, 2261 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-2-0 rotate: false - xy: 1565, 1732 + xy: 2383, 2301 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-1 rotate: false - xy: 1565, 1666 + xy: 2449, 2301 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-2 rotate: false - xy: 1499, 1600 + xy: 2515, 2301 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-3 rotate: false - xy: 1565, 1600 + xy: 2581, 2301 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-4 rotate: false - xy: 1495, 1534 + xy: 2647, 2311 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-5 rotate: false - xy: 1561, 1534 + xy: 3521, 2389 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-6 rotate: false - xy: 1493, 1468 + xy: 2713, 2315 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-7 rotate: false - xy: 1559, 1468 + xy: 2779, 2315 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-3-0 rotate: false - xy: 2035, 2937 + xy: 2036, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-1 rotate: false - xy: 2133, 3035 + xy: 1938, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-2 rotate: false - xy: 2133, 2937 + xy: 2134, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-3 rotate: false - xy: 2231, 3035 + xy: 2036, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-4 rotate: false - xy: 2231, 2937 + xy: 2232, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-5 rotate: false - xy: 2035, 2839 + xy: 2134, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-6 rotate: false - xy: 2133, 2839 + xy: 2330, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-7 rotate: false - xy: 2231, 2839 + xy: 2232, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-4-0 rotate: false - xy: 1781, 2383 + xy: 2013, 108 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-1 rotate: false - xy: 1781, 2253 + xy: 2973, 3087 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-2 rotate: false - xy: 2397, 3129 + xy: 3103, 3087 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-3 rotate: false - xy: 2527, 3183 + xy: 3523, 3209 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-4 rotate: false - xy: 2657, 3183 + xy: 3653, 3209 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-5 rotate: false - xy: 2787, 3183 + xy: 3783, 3209 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-6 rotate: false - xy: 2917, 3183 + xy: 3913, 3209 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-7 rotate: false - xy: 3047, 3183 + xy: 3523, 3079 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-5-0 rotate: false - xy: 936, 1182 + xy: 1501, 1904 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-1 rotate: false - xy: 919, 1020 + xy: 1501, 1742 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-2 rotate: false - xy: 911, 858 + xy: 1501, 1580 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-3 rotate: false - xy: 911, 696 + xy: 1501, 1418 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-4 rotate: false - xy: 911, 534 + xy: 1501, 1256 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-5 rotate: false - xy: 911, 372 + xy: 1501, 1094 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-6 rotate: false - xy: 906, 210 + xy: 1595, 932 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-7 rotate: false - xy: 895, 48 + xy: 1585, 770 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-6-0 rotate: false - xy: 725, 1064 + xy: 1153, 2228 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-1 rotate: false - xy: 717, 870 + xy: 1347, 2228 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-2 rotate: false - xy: 717, 676 + xy: 1113, 2034 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-3 rotate: false - xy: 507, 236 + xy: 1113, 1840 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-4 rotate: false - xy: 717, 482 + xy: 1307, 2034 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-5 rotate: false - xy: 712, 288 + xy: 1113, 1646 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-6 rotate: false - xy: 701, 94 + xy: 1307, 1840 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-7 rotate: false - xy: 1387, 2871 + xy: 1113, 1452 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-7-0 rotate: false - xy: 1887, 3339 + xy: 3063, 3581 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-1 rotate: false - xy: 2355, 3581 + xy: 3289, 3581 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-2 rotate: false - xy: 2581, 3581 + xy: 3515, 3581 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-3 rotate: false - xy: 2807, 3581 + xy: 3741, 3581 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-4 rotate: false - xy: 3033, 3581 + xy: 1627, 3307 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-5 rotate: false - xy: 3259, 3581 + xy: 1853, 3307 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-6 rotate: false - xy: 605, 1987 + xy: 2079, 3307 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-7 rotate: false - xy: 1403, 3065 + xy: 2305, 3307 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-8-0 rotate: false - xy: 887, 3517 + xy: 573, 867 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-1 rotate: false - xy: 605, 2713 + xy: 573, 609 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-2 rotate: false - xy: 1, 73 + xy: 573, 351 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-3 rotate: false - xy: 887, 3259 + xy: 573, 93 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-4 rotate: false - xy: 1145, 3517 + xy: 1127, 3437 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-5 rotate: false - xy: 605, 2455 + xy: 805, 3115 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-6 rotate: false - xy: 887, 3001 + xy: 758, 2857 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-7 rotate: false - xy: 1145, 3259 + xy: 725, 2599 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-9-0 rotate: false - xy: 1, 1847 + xy: 2495, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-1 rotate: false - xy: 1934, 3807 + xy: 1, 943 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-2 rotate: false - xy: 1, 1557 + xy: 2785, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-3 rotate: false - xy: 2224, 3807 + xy: 1, 653 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-4 rotate: false - xy: 1, 1267 + xy: 3075, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-5 rotate: false - xy: 2514, 3807 + xy: 1, 363 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-6 rotate: false - xy: 1, 977 + xy: 3365, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-7 rotate: false - xy: 2804, 3807 + xy: 1, 73 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 crawler-leg rotate: false - xy: 1543, 1418 + xy: 2165, 1346 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-outline rotate: false - xy: 1485, 1368 + xy: 2165, 1296 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-wreck0 rotate: false - xy: 1485, 1318 + xy: 2165, 1246 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-wreck1 rotate: false - xy: 1535, 1368 + xy: 2235, 2186 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-wreck2 rotate: false - xy: 1485, 1268 + xy: 2225, 2136 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 cyclone rotate: false - xy: 2041, 2741 + xy: 2428, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 1585, 1318 + xy: 2211, 1886 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-outline rotate: false - xy: 1585, 1268 + xy: 2211, 1836 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-wreck0 rotate: false - xy: 1485, 1218 + xy: 2211, 1786 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-wreck1 rotate: false - xy: 1535, 1218 + xy: 2211, 1736 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-wreck2 rotate: false - xy: 1585, 1218 + xy: 2211, 1686 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 duo rotate: false - xy: 3197, 2677 + xy: 3211, 2385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 eclipse-outline rotate: false - xy: 1, 3103 + xy: 1, 2167 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck0 rotate: false - xy: 678, 3775 + xy: 403, 2621 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck1 rotate: false - xy: 1, 2781 + xy: 1529, 3775 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck2 rotate: false - xy: 1000, 3775 + xy: 1, 1845 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eruption-outline rotate: false - xy: 1531, 1160 + xy: 2267, 372 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flamethrower-outline rotate: false - xy: 1581, 1160 + xy: 2273, 206 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flare-outline rotate: false - xy: 1531, 1052 + xy: 2211, 1528 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flare-wreck0 rotate: false - xy: 1581, 1110 + xy: 2207, 1478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flare-wreck1 rotate: false - xy: 1481, 960 + xy: 2285, 2186 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flare-wreck2 rotate: false - xy: 1531, 1002 + 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: 181, 11 + xy: 3829, 2940 size: 80, 60 orig: 80, 60 offset: 0, 0 index: -1 fortress-outline rotate: false - xy: 3367, 3499 + xy: 2649, 3225 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck0 rotate: false - xy: 3357, 3417 + xy: 1440, 2672 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck1 rotate: false - xy: 1231, 2064 + xy: 1985, 26 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck2 rotate: false - xy: 1231, 1982 + xy: 2087, 26 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fuse rotate: false - xy: 2237, 2741 + xy: 1657, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 gamma-outline rotate: false - xy: 4019, 2975 - size: 56, 56 - orig: 56, 56 + xy: 1817, 770 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 gamma-wreck0 rotate: false - xy: 3763, 2739 - size: 56, 56 - orig: 56, 56 + xy: 2617, 2377 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 gamma-wreck1 rotate: false - xy: 335, 5 - size: 56, 56 - orig: 56, 56 + xy: 1897, 2278 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 gamma-wreck2 rotate: false - xy: 3901, 2767 - size: 56, 56 - orig: 56, 56 + xy: 1967, 2278 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 hail rotate: false - xy: 3231, 2677 + xy: 3245, 2391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 heal-shotgun-weapon-outline rotate: false - xy: 1481, 910 - size: 48, 48 - orig: 48, 48 + xy: 2820, 2889 + size: 50, 50 + orig: 50, 50 offset: 0, 0 index: -1 heal-weapon-mount-outline rotate: false - xy: 1581, 960 + xy: 2261, 1986 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 heal-weapon-outline rotate: false - xy: 1481, 860 + xy: 2261, 1936 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 horizon-outline rotate: false - xy: 1411, 1236 + xy: 323, 2341 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck0 rotate: false - xy: 1407, 1162 + xy: 3993, 2841 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck1 rotate: false - xy: 1407, 1088 + xy: 3734, 2682 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck2 rotate: false - xy: 1407, 1014 + xy: 3225, 2425 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 item-blast-compound-large rotate: false - xy: 1871, 3101 + xy: 2273, 1236 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-blast-compound-medium rotate: false - xy: 3435, 2677 + xy: 3313, 2357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 1473, 1970 + xy: 693, 2331 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-tiny rotate: false - xy: 273, 379 + xy: 3187, 2283 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-blast-compound-xlarge rotate: false - xy: 1531, 902 + xy: 2261, 1886 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-coal-large rotate: false - xy: 1431, 1954 + xy: 758, 3251 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-coal-medium rotate: false - xy: 3503, 2663 + xy: 2325, 88 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 3151, 2977 + xy: 1601, 3441 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-tiny rotate: false - xy: 1255, 186 + xy: 1569, 3307 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-coal-xlarge rotate: false - xy: 1581, 910 + xy: 2261, 1836 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-copper-large rotate: false - xy: 1134, 180 + xy: 1016, 3073 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-copper-medium rotate: false - xy: 3571, 2663 + xy: 2325, 20 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 887, 2975 + xy: 691, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-tiny rotate: false - xy: 3803, 2721 + xy: 1151, 2625 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-copper-xlarge rotate: false - xy: 1473, 810 + xy: 2261, 1786 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-graphite-large rotate: false - xy: 1717, 2163 + xy: 983, 2601 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-graphite-medium rotate: false - xy: 3639, 2663 + xy: 2413, 1050 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 2083, 3313 + xy: 3347, 2399 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-tiny rotate: false - xy: 1399, 774 + xy: 1169, 2625 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-graphite-xlarge rotate: false - xy: 1531, 852 + xy: 2261, 1736 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-lead-large rotate: false - xy: 2615, 2557 + xy: 1440, 2630 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-lead-medium rotate: false - xy: 2799, 2621 + xy: 2413, 982 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 477, 323 + xy: 719, 2331 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-tiny rotate: false - xy: 2901, 2627 + xy: 4079, 3061 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-lead-xlarge rotate: false - xy: 1581, 860 + xy: 2261, 1686 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-metaglass-large rotate: false - xy: 2815, 2765 + xy: 1063, 3215 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-metaglass-medium rotate: false - xy: 2783, 2587 + xy: 2413, 914 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 1353, 2731 + xy: 1601, 3415 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-tiny rotate: false - xy: 2919, 2593 + xy: 4079, 3043 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-metaglass-xlarge rotate: false - xy: 1523, 802 + xy: 2261, 1636 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-phase-fabric-large rotate: false - xy: 2865, 2815 + xy: 1554, 2957 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-phase-fabric-medium rotate: false - xy: 2801, 2553 + xy: 2413, 846 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 3673, 2705 + xy: 717, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-tiny rotate: false - xy: 2399, 2161 + xy: 4079, 3025 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-phase-fabric-xlarge rotate: false - xy: 2507, 2497 + xy: 2261, 1586 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-plastanium-large rotate: false - xy: 2715, 2615 + xy: 2273, 114 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-plastanium-medium rotate: false - xy: 2835, 2553 + xy: 2405, 778 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 2257, 2159 + xy: 3347, 2373 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-tiny rotate: false - xy: 1731, 2111 + xy: 4079, 3007 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-plastanium-xlarge rotate: false - xy: 2507, 2447 + xy: 2261, 1536 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-pyratite-large rotate: false - xy: 2765, 2665 + xy: 2273, 1194 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-pyratite-medium rotate: false - xy: 2869, 2553 + xy: 2415, 710 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 1625, 1472 + xy: 745, 2331 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-tiny rotate: false - xy: 273, 361 + xy: 1187, 2625 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-pyratite-xlarge rotate: false - xy: 2502, 2397 + xy: 2335, 2193 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-sand-large rotate: false - xy: 2657, 2557 + xy: 2227, 850 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-sand-medium rotate: false - xy: 2903, 2553 + xy: 2415, 642 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 1629, 2001 + xy: 1601, 3389 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-tiny rotate: false - xy: 1417, 774 + xy: 4079, 2989 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-sand-xlarge rotate: false - xy: 2502, 2347 + xy: 2385, 2193 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-scrap-large rotate: false - xy: 2815, 2723 + xy: 758, 3209 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-scrap-medium rotate: false - xy: 2935, 2645 + xy: 2415, 574 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 422, 3749 + xy: 743, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-tiny rotate: false - xy: 1435, 774 + xy: 2279, 752 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-scrap-xlarge rotate: false - xy: 2502, 2297 + xy: 2435, 2193 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-silicon-large rotate: false - xy: 2907, 2815 + xy: 1025, 2601 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-silicon-medium rotate: false - xy: 3003, 2645 + xy: 2415, 506 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 913, 2975 + xy: 771, 2331 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-tiny rotate: false - xy: 1453, 774 + xy: 3151, 2351 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-silicon-xlarge rotate: false - xy: 2499, 2247 + xy: 2485, 2193 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-spore-pod-large rotate: false - xy: 2949, 2815 + xy: 1482, 2630 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-spore-pod-medium rotate: false - xy: 2953, 2611 + xy: 2419, 404 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 2083, 3287 + xy: 1601, 3363 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-tiny rotate: false - xy: 2399, 2143 + xy: 693, 2603 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-spore-pod-xlarge rotate: false - xy: 2499, 2197 + xy: 2535, 2193 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-surge-alloy-large rotate: false - xy: 2991, 2815 + xy: 1596, 2957 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-surge-alloy-medium rotate: false - xy: 3021, 2611 + xy: 3177, 2335 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 477, 297 + xy: 797, 2331 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-tiny rotate: false - xy: 273, 343 + xy: 2595, 3547 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-surge-alloy-xlarge rotate: false - xy: 2499, 2147 + xy: 3161, 2369 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-thorium-large rotate: false - xy: 3033, 2815 + xy: 2315, 1194 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-thorium-medium rotate: false - xy: 2937, 2577 + xy: 3211, 2317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 3673, 2679 + xy: 1601, 3337 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-tiny rotate: false - xy: 4079, 3443 + xy: 983, 2839 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-thorium-xlarge rotate: false - xy: 2499, 2097 + xy: 2215, 1428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-titanium-large rotate: false - xy: 2289, 2211 + xy: 2227, 808 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-titanium-medium rotate: false - xy: 3005, 2577 + xy: 3279, 2323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 448, 3749 + xy: 823, 2331 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-tiny rotate: false - xy: 4079, 3425 + xy: 1353, 3419 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-titanium-xlarge rotate: false - xy: 1617, 2163 + xy: 2215, 1378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lancer rotate: false - xy: 3437, 3235 + xy: 2013, 1750 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 large-artillery-outline rotate: false - xy: 1635, 1282 + xy: 2215, 1242 size: 48, 66 orig: 48, 66 offset: 0, 0 index: -1 large-bullet-mount-outline rotate: false - xy: 263, 14 + xy: 1969, 2348 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount-outline rotate: false - xy: 2329, 2935 + xy: 1853, 2449 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 large-purple-mount-outline rotate: false - xy: 405, 151 + xy: 2113, 2348 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-weapon-outline rotate: false - xy: 1667, 2155 + xy: 2257, 1478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-cryofluid-large rotate: false - xy: 1148, 1185 + xy: 758, 3167 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-cryofluid-medium rotate: false - xy: 3005, 2543 + xy: 3279, 2289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-small rotate: false - xy: 939, 2975 + xy: 849, 2331 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-cryofluid-tiny rotate: false - xy: 4079, 3407 + xy: 1229, 876 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-cryofluid-xlarge rotate: false - xy: 1635, 1182 + xy: 2265, 1428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-oil-large rotate: false - xy: 2289, 2169 + xy: 1067, 2601 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-oil-medium rotate: false - xy: 3073, 2543 + xy: 3153, 2233 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-small rotate: false - xy: 2083, 3261 + xy: 1601, 3311 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-oil-tiny rotate: false - xy: 4079, 3389 + xy: 1401, 786 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-oil-xlarge rotate: false - xy: 1631, 1132 + xy: 2265, 1378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-slag-large rotate: false - xy: 1759, 2145 + xy: 2227, 766 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-slag-medium rotate: false - xy: 713, 2 + xy: 3255, 2221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-small rotate: false - xy: 477, 271 + xy: 725, 2917 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-slag-tiny rotate: false - xy: 4079, 3371 + xy: 1663, 1106 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-slag-xlarge rotate: false - xy: 1631, 1082 + xy: 2265, 1328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-water-large rotate: false - xy: 1801, 2145 + xy: 758, 3125 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-water-medium rotate: false - xy: 2365, 2145 + xy: 3323, 2221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-small rotate: false - xy: 474, 3749 + xy: 2495, 3781 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-water-tiny rotate: false - xy: 291, 331 + xy: 3945, 3863 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-water-xlarge rotate: false - xy: 1631, 1032 + xy: 2265, 1278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mace-leg rotate: false - xy: 3723, 3325 + xy: 2033, 1354 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-outline rotate: false - xy: 3503, 3259 + xy: 2033, 1288 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-wreck0 rotate: false - xy: 3569, 3259 + xy: 2033, 1222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-wreck1 rotate: false - xy: 3503, 3193 + xy: 2025, 1156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-wreck2 rotate: false - xy: 3635, 3259 + xy: 2029, 1090 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver rotate: false - xy: 2623, 2857 + xy: 2441, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mega-outline rotate: false - xy: 1217, 1676 + xy: 3179, 2871 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck0 rotate: false - xy: 1115, 1615 + xy: 3077, 2769 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck1 rotate: false - xy: 1113, 1513 + xy: 3179, 2769 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck2 rotate: false - xy: 1113, 1411 + xy: 1542, 2853 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 meltdown rotate: false - xy: 3307, 3235 + xy: 1833, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 minke-outline rotate: false - xy: 2335, 2652 + xy: 3477, 2796 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 minke-wreck0 rotate: false - xy: 2425, 2753 + xy: 3567, 2899 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 minke-wreck1 rotate: false - xy: 2335, 2549 + xy: 3477, 2693 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 minke-wreck2 rotate: false - xy: 2425, 2650 + xy: 3567, 2796 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 missiles-mount-outline rotate: false - xy: 1631, 882 + xy: 2311, 2036 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mono-outline rotate: false - xy: 1631, 782 + xy: 2311, 1886 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mono-wreck0 rotate: false - xy: 2515, 2806 + xy: 2311, 1836 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mono-wreck1 rotate: false - xy: 2515, 2756 + xy: 2311, 1786 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mono-wreck2 rotate: false - xy: 2515, 2706 + xy: 2311, 1736 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-purple-weapon-outline rotate: false - xy: 2515, 2606 + xy: 2311, 1636 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-weapon-outline rotate: false - xy: 2565, 2807 + xy: 2311, 1536 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 nova-leg rotate: false - xy: 2615, 2807 + xy: 2425, 2143 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 nova-outline rotate: false - xy: 3959, 2859 + xy: 1063, 3257 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 nova-wreck0 rotate: false - xy: 3959, 2801 + xy: 2358, 2243 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 nova-wreck1 rotate: false - xy: 4017, 2859 + xy: 2416, 2243 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 nova-wreck2 rotate: false - xy: 4017, 2801 + 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, 2722 + xy: 1057, 894 size: 192, 277 orig: 192, 277 offset: 0, 0 index: -1 omura-outline rotate: false - xy: 323, 2943 + xy: 291, 545 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 omura-wreck0 rotate: false - xy: 323, 2541 + xy: 291, 143 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 omura-wreck1 rotate: false - xy: 323, 2139 + xy: 613, 1929 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 omura-wreck2 rotate: false - xy: 605, 3373 + xy: 613, 1527 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 parallax rotate: false - xy: 3635, 3127 + xy: 2095, 958 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 poly-outline rotate: false - xy: 396, 93 + xy: 1623, 3107 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 poly-wreck0 rotate: false - xy: 395, 35 + xy: 2149, 1504 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 poly-wreck1 rotate: false - xy: 3821, 2719 + xy: 2149, 1446 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 poly-wreck2 rotate: false - xy: 3879, 2709 + xy: 1565, 3049 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 pulsar-leg rotate: false - xy: 3505, 2797 + xy: 2845, 2199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulsar-outline rotate: false - xy: 3437, 2987 - size: 58, 48 - orig: 58, 48 + xy: 2037, 2288 + size: 68, 58 + orig: 68, 58 offset: 0, 0 index: -1 pulsar-wreck0 rotate: false - xy: 3901, 2991 - size: 58, 48 - orig: 58, 48 + xy: 2107, 2288 + size: 68, 58 + orig: 68, 58 offset: 0, 0 index: -1 pulsar-wreck1 rotate: false - xy: 3703, 2747 - size: 58, 48 - orig: 58, 48 + xy: 1801, 2235 + size: 68, 58 + orig: 68, 58 offset: 0, 0 index: -1 pulsar-wreck2 rotate: false - xy: 335, 63 - size: 58, 48 - orig: 58, 48 + 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: 2335, 2179 + xy: 1307, 12 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-outline rotate: false - xy: 2417, 2137 + xy: 3519, 2529 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck0 rotate: false - xy: 1417, 1868 + xy: 3997, 2997 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck1 rotate: false - xy: 1417, 1786 + xy: 3993, 2915 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck2 rotate: false - xy: 1417, 1704 + xy: 3829, 2858 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 reign-leg rotate: false - xy: 2907, 3455 + xy: 1663, 1534 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 reign-outline rotate: false - xy: 735, 1461 + xy: 1353, 3183 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 reign-weapon-outline rotate: false - xy: 517, 1999 + xy: 3657, 2759 size: 83, 138 orig: 83, 138 offset: 0, 0 index: -1 reign-wreck0 rotate: false - xy: 291, 349 + xy: 1569, 3165 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 reign-wreck1 rotate: false - xy: 517, 1361 + xy: 1785, 3165 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 reign-wreck2 rotate: false - xy: 509, 1219 + xy: 2001, 3165 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 repair-point rotate: false - xy: 1681, 808 + xy: 3493, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple rotate: false - xy: 1187, 302 + xy: 2735, 2451 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 risso-outline rotate: false - xy: 549, 156 + xy: 2257, 2367 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 risso-wreck0 rotate: false - xy: 621, 156 + xy: 2329, 2367 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 risso-wreck1 rotate: false - xy: 1473, 2194 + xy: 2401, 2367 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 risso-wreck2 rotate: false - xy: 1545, 2205 + xy: 2473, 2367 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 salvo rotate: false - xy: 3703, 2929 + xy: 2079, 1750 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scatter rotate: false - xy: 3767, 3193 + xy: 2079, 1618 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scepter-leg rotate: false - xy: 1911, 2383 + xy: 2483, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +vela-leg + rotate: false + xy: 2483, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scepter-outline rotate: false - xy: 1057, 2580 + xy: 1251, 946 size: 170, 140 orig: 170, 140 offset: 0, 0 index: -1 scepter-weapon-outline rotate: false - xy: 570, 52 + xy: 2977, 2199 size: 56, 102 orig: 56, 102 offset: 0, 0 index: -1 scepter-wreck0 rotate: false - xy: 1057, 2438 + xy: 1057, 610 size: 170, 140 orig: 170, 140 offset: 0, 0 index: -1 scepter-wreck1 rotate: false - xy: 831, 1992 + xy: 1053, 468 size: 170, 140 orig: 170, 140 offset: 0, 0 index: -1 scepter-wreck2 rotate: false - xy: 3485, 3523 + xy: 1053, 326 size: 170, 140 orig: 170, 140 offset: 0, 0 index: -1 scorch rotate: false - xy: 1697, 2095 + xy: 3459, 2167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 segment rotate: false - xy: 3769, 2863 + xy: 2099, 1288 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sei-launcher-outline rotate: false - xy: 1413, 1540 + xy: 3747, 2838 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 sei-outline rotate: false - xy: 1403, 3533 + xy: 1627, 3533 size: 240, 240 orig: 240, 240 offset: 0, 0 index: -1 sei-wreck0 rotate: false - xy: 1403, 3291 + xy: 1869, 3533 size: 240, 240 orig: 240, 240 offset: 0, 0 index: -1 sei-wreck1 rotate: false - xy: 1645, 3565 + xy: 2111, 3533 size: 240, 240 orig: 240, 240 offset: 0, 0 index: -1 sei-wreck2 rotate: false - xy: 1887, 3565 + xy: 2353, 3533 size: 240, 240 orig: 240, 240 offset: 0, 0 index: -1 small-basic-weapon-outline rotate: false - xy: 2665, 2807 + xy: 2307, 1486 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-mount-weapon-outline rotate: false - xy: 2615, 2707 + xy: 2315, 1386 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spectre rotate: false - xy: 1081, 1052 + xy: 2743, 3071 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spiroct-foot rotate: false - xy: 3167, 3407 + xy: 1609, 2425 size: 46, 46 orig: 46, 46 offset: 0, 0 index: -1 spiroct-joint rotate: false - xy: 1867, 2077 + xy: 3527, 2219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spiroct-leg rotate: false - xy: 1381, 2146 + xy: 3323, 2609 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 spiroct-leg-base rotate: false - xy: 1098, 1191 + xy: 4043, 3079 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 spiroct-outline rotate: false - xy: 1383, 326 + xy: 1801, 2295 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-weapon-outline rotate: false - xy: 2665, 2699 + xy: 2365, 1370 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 spiroct-wreck0 rotate: false - xy: 2425, 2856 + xy: 3523, 3002 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-wreck1 rotate: false - xy: 1383, 249 + xy: 3619, 3002 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-wreck2 rotate: false - xy: 1378, 172 + xy: 3715, 3002 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 splash-0 rotate: false - xy: 1833, 2043 + xy: 3527, 2185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-1 rotate: false - xy: 1901, 2077 + xy: 3527, 2151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-10 rotate: false - xy: 2037, 2079 + xy: 3595, 2183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-11 rotate: false - xy: 2037, 2045 + xy: 3595, 2149 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-2 rotate: false - xy: 1867, 2043 + xy: 3561, 2285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-3 rotate: false - xy: 1935, 2077 + xy: 3561, 2251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-4 rotate: false - xy: 1901, 2043 + xy: 3561, 2217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-5 rotate: false - xy: 1969, 2077 + xy: 3561, 2183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-6 rotate: false - xy: 1935, 2043 + xy: 3561, 2149 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-7 rotate: false - xy: 1969, 2043 + xy: 3595, 2285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-8 rotate: false - xy: 2003, 2077 + xy: 3595, 2251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-9 rotate: false - xy: 2003, 2043 + xy: 3595, 2217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer rotate: false - xy: 3965, 3099 + xy: 2089, 2090 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 toxopid-cannon-outline rotate: false - xy: 509, 633 + xy: 1232, 2625 size: 206, 220 orig: 206, 220 offset: 0, 0 index: -1 toxopid-foot rotate: false - xy: 1381, 2182 + xy: 599, 1 size: 90, 90 orig: 90, 90 offset: 0, 0 index: -1 -toxopid-joint-base - rotate: false - xy: 1617, 2213 - size: 70, 70 - orig: 70, 70 - offset: 0, 0 - index: -1 toxopid-leg rotate: false - xy: 3215, 3507 + xy: 3945, 4023 size: 150, 72 orig: 150, 72 offset: 0, 0 index: -1 toxopid-leg-base rotate: false - xy: 1, 331 + xy: 1207, 3709 size: 270, 64 orig: 270, 64 offset: 0, 0 index: -1 toxopid-outline rotate: false - xy: 1229, 2338 + xy: 1725, 386 size: 160, 190 orig: 160, 190 offset: 0, 0 index: -1 toxopid-wreck0 rotate: false - xy: 1219, 2146 + xy: 1721, 194 size: 160, 190 orig: 160, 190 offset: 0, 0 index: -1 toxopid-wreck1 rotate: false - xy: 2113, 3373 + xy: 1721, 2 size: 160, 190 orig: 160, 190 offset: 0, 0 index: -1 toxopid-wreck2 rotate: false - xy: 2275, 3389 + 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: 2715, 2757 + xy: 2365, 1320 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-antumbra-full rotate: false - xy: 735, 1745 + xy: 895, 1389 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 unit-arkyid-full rotate: false - xy: 1073, 792 + xy: 2873, 2957 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 unit-atrax-full rotate: false - xy: 2335, 2483 + xy: 181, 7 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 unit-beta-full rotate: false - xy: 2765, 2807 - size: 48, 48 - orig: 48, 48 + xy: 3035, 2353 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 unit-bryde-full rotate: false - xy: 2255, 3231 + 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: 2565, 2557 + xy: 2365, 1270 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-full rotate: false - xy: 2615, 2599 + xy: 2315, 1236 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eclipse-full rotate: false - xy: 1, 2459 + xy: 1851, 3775 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 unit-flare-full rotate: false - xy: 2665, 2649 + xy: 2365, 1220 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-fortress-full rotate: false - xy: 1113, 1329 + xy: 1542, 2771 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 unit-gamma-full rotate: false - xy: 453, 35 - size: 56, 56 - orig: 56, 56 + xy: 2757, 2381 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 unit-horizon-full rotate: false - xy: 259, 257 + xy: 3521, 2455 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 unit-mace-full rotate: false - xy: 3835, 2975 + xy: 2145, 2024 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-mega-full rotate: false - xy: 1098, 1227 + xy: 1542, 2669 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 unit-minke-full rotate: false - xy: 2425, 2547 + xy: 3657, 2899 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 unit-mono-full rotate: false - xy: 2715, 2707 + xy: 2227, 1142 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-nova-full rotate: false - xy: 628, 98 + 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, 2971 + xy: 605, 1125 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 unit-poly-full rotate: false - xy: 628, 40 + xy: 3093, 2351 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 unit-pulsar-full rotate: false - xy: 3901, 2941 - size: 58, 48 - orig: 58, 48 + 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: 1411, 1458 + xy: 3742, 2756 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 unit-reign-full rotate: false - xy: 509, 1077 + xy: 2433, 3165 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 unit-risso-full rotate: false - xy: 1689, 2205 + xy: 2545, 2367 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 unit-scepter-full rotate: false - xy: 3657, 3553 + xy: 1053, 184 size: 170, 140 orig: 170, 140 offset: 0, 0 index: -1 unit-sei-full rotate: false - xy: 1645, 3323 + xy: 2595, 3565 size: 240, 240 orig: 240, 240 offset: 0, 0 index: -1 unit-spiroct-full rotate: false - xy: 1391, 2274 + xy: 3811, 3002 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 unit-toxopid-full rotate: false - xy: 2437, 3389 + 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: 1073, 678 + xy: 1279, 3069 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 vault-team-crux rotate: false - xy: 1383, 578 + xy: 1703, 2349 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 vault-team-sharded rotate: false - xy: 1383, 480 + 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: 3571, 2731 + xy: 2145, 1694 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 zenith-missiles-outline rotate: false - xy: 2765, 2707 + xy: 2227, 892 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith-outline rotate: false - xy: 1073, 336 + xy: 3003, 2973 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck0 rotate: false - xy: 1068, 222 + xy: 3117, 2973 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck1 rotate: false - xy: 1003, 2000 + xy: 1527, 8 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck2 rotate: false - xy: 1117, 2000 + xy: 1440, 2955 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 3401, 2677 + xy: 3279, 2357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 3469, 2677 + xy: 2315, 122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 3537, 2663 + xy: 2325, 54 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 3605, 2663 + xy: 2590, 2217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 2765, 2631 + xy: 2413, 1016 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 2833, 2621 + xy: 2413, 948 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 2817, 2587 + xy: 2413, 880 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 2851, 2587 + xy: 2405, 812 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 2867, 2621 + xy: 2405, 744 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 2885, 2587 + xy: 2415, 676 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 2901, 2645 + xy: 2415, 608 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 2969, 2645 + xy: 2415, 540 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 2919, 2611 + xy: 2415, 438 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 2987, 2611 + xy: 3143, 2317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 3055, 2611 + xy: 3177, 2301 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 2971, 2577 + xy: 3245, 2323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 2971, 2543 + xy: 3245, 2289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 3073, 2577 + xy: 3153, 2267 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 1471, 28 + xy: 3255, 2255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 2331, 2145 + xy: 3323, 2255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blank rotate: false - xy: 602, 2136 + xy: 3734, 2756 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 circle rotate: false - xy: 509, 430 + xy: 1153, 2422 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 shape-3 rotate: false - xy: 331, 113 + xy: 2235, 2236 size: 63, 63 orig: 63, 63 offset: 0, 0 index: -1 alpha rotate: false - xy: 1255, 4 + xy: 781, 43 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-cell rotate: false - xy: 1375, 122 + xy: 1559, 2423 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 antumbra rotate: false - xy: 291, 1217 + xy: 3645, 3339 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-cell rotate: false - xy: 291, 975 + xy: 3863, 3339 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 arkyid rotate: false - xy: 3956, 3967 + xy: 3967, 3751 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-cell rotate: false - xy: 3956, 3837 + xy: 3967, 3621 size: 128, 128 orig: 128, 128 offset: 0, 0 @@ -6551,651 +6817,735 @@ atrax index: -1 atrax-base rotate: false - xy: 1761, 2187 + xy: 1825, 2109 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 atrax-cell rotate: false - xy: 1937, 2783 + xy: 1001, 1181 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 beta rotate: false - xy: 836, 44 - size: 48, 48 - orig: 48, 48 + xy: 1507, 3127 + size: 56, 54 + orig: 56, 54 offset: 0, 0 index: -1 beta-cell rotate: false - xy: 1321, 28 + xy: 3093, 2301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bryde rotate: false - xy: 2599, 3313 + xy: 1663, 1266 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-cell rotate: false - xy: 2741, 3313 + 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: 3803, 2669 + xy: 3817, 2560 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-base rotate: false - xy: 3853, 2659 + xy: 3817, 2510 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-cell rotate: false - xy: 1493, 1418 + xy: 2165, 1396 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger rotate: false - xy: 1593, 1418 + xy: 2211, 1986 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 1585, 1368 + xy: 2211, 1936 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 eclipse rotate: false - xy: 1, 3425 + xy: 805, 3373 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-cell rotate: false - xy: 356, 3775 + xy: 1207, 3775 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 flare rotate: false - xy: 1481, 1010 + xy: 2273, 156 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 fortress rotate: false - xy: 3991, 3559 + xy: 1883, 26 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 3525, 3391 + xy: 2013, 2014 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-cell rotate: false - xy: 1115, 1717 + xy: 1817, 1436 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 gamma rotate: false - xy: 3901, 2825 - size: 56, 56 - orig: 56, 56 + xy: 1747, 770 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 gamma-cell rotate: false - xy: 3961, 2975 + xy: 1507, 3069 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 horizon rotate: false - xy: 1411, 1384 + xy: 323, 2415 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-cell rotate: false - xy: 1411, 1310 + xy: 1641, 48 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 mace rotate: false - xy: 3525, 3325 + xy: 2023, 2080 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-base rotate: false - xy: 3591, 3325 + xy: 2017, 1486 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-cell rotate: false - xy: 3657, 3325 + xy: 2017, 1420 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mega rotate: false - xy: 1217, 1880 + xy: 2975, 2855 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-cell rotate: false - xy: 1217, 1778 + xy: 3077, 2871 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 minke rotate: false - xy: 2335, 2755 + xy: 3477, 2899 size: 88, 101 orig: 88, 101 offset: 0, 0 index: -1 minke-cell rotate: false - xy: 3307, 2975 + xy: 2093, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 mono rotate: false - xy: 1631, 832 + xy: 2311, 1986 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mono-cell rotate: false - xy: 1581, 810 + xy: 2311, 1936 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 nova rotate: false - xy: 3961, 2917 + xy: 2300, 2243 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 nova-base rotate: false - xy: 2565, 2757 + xy: 2375, 2143 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 nova-cell rotate: false - xy: 4019, 2917 + 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: 3674, 3695 + xy: 323, 1349 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 omura-cannon-heat rotate: false - xy: 863, 2413 + xy: 1113, 1173 size: 192, 277 orig: 192, 277 offset: 0, 0 index: -1 omura-cell rotate: false - xy: 323, 3345 + xy: 291, 947 size: 280, 400 orig: 280, 400 offset: 0, 0 index: -1 poly rotate: false - xy: 3959, 2743 + xy: 2532, 2243 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 poly-cell rotate: false - xy: 4017, 2743 + xy: 1565, 3107 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 power-cell rotate: false - xy: 454, 93 + xy: 1623, 3049 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 pulsar rotate: false - xy: 3113, 3003 - size: 58, 48 - orig: 58, 48 + xy: 2649, 3165 + size: 68, 58 + orig: 68, 58 offset: 0, 0 index: -1 pulsar-base rotate: false - xy: 2565, 2707 + xy: 2475, 2143 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pulsar-cell rotate: false - xy: 3357, 3367 + 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: 2420, 2383 + xy: 3652, 2677 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-base rotate: false - xy: 2420, 2301 + xy: 3911, 2931 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-cell rotate: false - xy: 2417, 2219 + xy: 1225, 12 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 reign rotate: false - xy: 735, 1603 + xy: 1385, 3325 size: 214, 140 orig: 214, 140 offset: 0, 0 index: -1 reign-base rotate: false - xy: 2599, 3455 + xy: 1663, 1786 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 reign-cell rotate: false - xy: 2753, 3455 + xy: 1663, 1660 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 risso rotate: false - xy: 477, 156 + xy: 2185, 2367 size: 70, 78 orig: 70, 78 offset: 0, 0 index: -1 risso-cell rotate: false - xy: 1309, 1166 + xy: 2833, 2561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scepter rotate: false - xy: 3485, 3665 + xy: 1057, 752 size: 170, 140 orig: 170, 140 offset: 0, 0 index: -1 scepter-base rotate: false - xy: 1911, 2643 + 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: 1911, 2513 + xy: 2353, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 sei rotate: false - xy: 605, 2213 + xy: 693, 2357 size: 240, 240 orig: 240, 240 offset: 0, 0 index: -1 sei-cell rotate: false - xy: 1145, 3017 + xy: 1385, 3467 size: 240, 240 orig: 240, 240 offset: 0, 0 index: -1 spiroct rotate: false - xy: 2329, 2858 + xy: 3427, 3022 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-cell rotate: false - xy: 1383, 403 + xy: 1801, 2372 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 toxopid rotate: false - xy: 1229, 2530 + xy: 1725, 578 size: 160, 190 orig: 160, 190 offset: 0, 0 index: -1 toxopid-cannon rotate: false - xy: 509, 855 + xy: 1232, 2847 size: 206, 220 orig: 206, 220 offset: 0, 0 index: -1 toxopid-cell rotate: false - xy: 3061, 3455 + xy: 1663, 1408 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 vanguard rotate: false - xy: 2765, 2757 + xy: 2227, 1092 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vanguard-cell rotate: false - xy: 2815, 2807 + 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: 736, 36 + xy: 4043, 3173 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 artillery-mount rotate: false - xy: 259, 113 + xy: 3673, 2533 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 beam-weapon rotate: false - xy: 2335, 2261 + xy: 3747, 2920 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 eruption rotate: false - xy: 1481, 1110 + xy: 2211, 1578 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun rotate: false - xy: 1481, 1060 + xy: 2273, 322 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower rotate: false - xy: 1531, 1102 + xy: 2273, 264 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-shotgun-weapon rotate: false - xy: 1581, 1060 - 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: 1531, 952 + xy: 2271, 2086 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 heal-weapon-mount rotate: false - xy: 1581, 1010 + xy: 2261, 2036 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 large-artillery rotate: false - xy: 1635, 1350 + xy: 2215, 1310 size: 48, 66 orig: 48, 66 offset: 0, 0 index: -1 large-bullet-mount rotate: false - xy: 405, 250 + xy: 1897, 2348 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount rotate: false - xy: 2237, 2351 + xy: 1755, 2449 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 large-purple-mount rotate: false - xy: 333, 178 + xy: 2041, 2348 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-weapon rotate: false - xy: 1635, 1232 + xy: 2223, 1192 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles rotate: false - xy: 1631, 982 + xy: 2325, 2136 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-mount rotate: false - xy: 1631, 932 + xy: 2321, 2086 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-purple-weapon rotate: false - xy: 2515, 2656 + xy: 2311, 1686 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-weapon rotate: false - xy: 2515, 2556 + xy: 2311, 1586 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 omura-cannon rotate: false - xy: 863, 2692 + xy: 1307, 1367 size: 192, 277 orig: 192, 277 offset: 0, 0 index: -1 omura-cannon-heat rotate: false - xy: 847, 2134 + xy: 1307, 1088 size: 192, 277 orig: 192, 277 offset: 0, 0 index: -1 reign-weapon rotate: false - xy: 2335, 2343 + xy: 3567, 2656 size: 83, 138 orig: 83, 138 offset: 0, 0 index: -1 scepter-weapon rotate: false - xy: 512, 52 + xy: 2977, 2303 size: 56, 102 orig: 56, 102 offset: 0, 0 index: -1 sei-launcher rotate: false - xy: 1417, 1622 + xy: 3911, 2849 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 small-basic-weapon rotate: false - xy: 2615, 2757 + xy: 2525, 2143 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-mount-weapon rotate: false - xy: 2565, 2657 + xy: 2315, 1436 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-weapon rotate: false - xy: 2665, 2757 + xy: 2315, 1336 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spiroct-weapon rotate: false - xy: 2615, 2649 + xy: 2365, 1428 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 weapon rotate: false - xy: 2665, 2599 + xy: 2227, 992 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith-missiles rotate: false - xy: 2715, 2657 + xy: 2227, 942 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith rotate: false - xy: 1073, 564 + xy: 1393, 3069 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-cell rotate: false - xy: 1073, 450 + xy: 887, 1133 size: 112, 112 orig: 112, 112 offset: 0, 0 @@ -7494,1456 +7844,3318 @@ filter: nearest,nearest repeat: none basalt-edge rotate: false - xy: 1, 149 + xy: 1, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 basalt1 rotate: false - xy: 2541, 213 + xy: 2739, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 basalt2 rotate: false - xy: 101, 17 + xy: 101, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 basalt3 rotate: false - xy: 2575, 213 + xy: 2773, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char1 rotate: false - xy: 135, 17 + xy: 135, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char2 rotate: false - xy: 2609, 213 + xy: 2807, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char3 rotate: false - xy: 169, 17 + xy: 169, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliff rotate: false - xy: 2643, 213 + xy: 2841, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +cliff0 + rotate: false + 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: 203, 17 + xy: 203, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal2 rotate: false - xy: 2677, 213 + xy: 2875, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal3 rotate: false - xy: 237, 17 + xy: 237, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper1 rotate: false - xy: 2711, 213 + xy: 2909, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper2 rotate: false - xy: 271, 17 + xy: 271, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper3 rotate: false - xy: 2745, 213 + xy: 2943, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters1 rotate: false - xy: 305, 17 + xy: 305, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters2 rotate: false - xy: 2779, 213 + xy: 2977, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters3 rotate: false - xy: 339, 17 + xy: 339, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters4 rotate: false - xy: 2813, 213 + xy: 3011, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters5 rotate: false - xy: 373, 17 + xy: 373, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters6 rotate: false - xy: 2847, 213 + xy: 3045, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite-edge rotate: false - xy: 1, 51 + xy: 1, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dacite-wall-large rotate: false - xy: 1667, 83 + xy: 1897, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dacite-wall1 rotate: false - xy: 2915, 213 + xy: 3113, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite-wall2 rotate: false - xy: 475, 17 + xy: 475, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite1 rotate: false - xy: 407, 17 + xy: 407, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite2 rotate: false - xy: 2881, 213 + xy: 3079, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite3 rotate: false - xy: 441, 17 + xy: 441, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal-large rotate: false - xy: 1765, 181 + xy: 1963, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dark-metal1 rotate: false - xy: 2949, 213 + xy: 3147, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal2 rotate: false - xy: 509, 17 + xy: 509, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1 rotate: false - xy: 2983, 213 + xy: 3181, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-edge rotate: false - xy: 99, 149 + xy: 99, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-2 rotate: false - xy: 543, 17 + xy: 543, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-edge rotate: false - xy: 99, 51 + xy: 99, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-3 rotate: false - xy: 3017, 213 + xy: 3215, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-edge rotate: false - xy: 197, 149 + xy: 197, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-4 rotate: false - xy: 577, 17 + xy: 577, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-edge rotate: false - xy: 197, 51 + xy: 197, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-5 rotate: false - xy: 3051, 213 + xy: 3249, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-edge rotate: false - xy: 295, 149 + xy: 295, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-6 rotate: false - xy: 611, 17 + xy: 611, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-edge rotate: false - xy: 295, 51 + xy: 295, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-edge rotate: false - xy: 393, 149 + xy: 393, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water rotate: false - xy: 679, 17 + xy: 679, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-edge rotate: false - xy: 393, 51 + xy: 393, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water1 rotate: false - xy: 3153, 213 + xy: 3351, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water2 rotate: false - xy: 713, 17 + xy: 713, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water3 rotate: false - xy: 3187, 213 + xy: 3385, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water rotate: false - xy: 747, 17 + xy: 747, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-edge rotate: false - xy: 491, 149 + xy: 491, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-water1 rotate: false - xy: 3221, 213 + xy: 3419, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water2 rotate: false - xy: 781, 17 + xy: 781, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water3 rotate: false - xy: 3255, 213 + xy: 3453, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand1 rotate: false - xy: 3085, 213 + xy: 3283, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand2 rotate: false - xy: 645, 17 + xy: 645, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand3 rotate: false - xy: 3119, 213 + xy: 3317, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater rotate: false - xy: 815, 17 + xy: 815, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-edge rotate: false - xy: 491, 51 + xy: 491, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dirt-edge rotate: false - xy: 589, 149 + xy: 589, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dirt-wall-large rotate: false - xy: 1831, 181 + xy: 2029, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dirt-wall1 rotate: false - xy: 883, 17 + xy: 883, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-wall2 rotate: false - xy: 3357, 213 + xy: 3555, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt1 rotate: false - xy: 3289, 213 + xy: 3487, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt2 rotate: false - xy: 849, 17 + xy: 849, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt3 rotate: false - xy: 3323, 213 + xy: 3521, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dune-wall-large rotate: false - xy: 1897, 181 + xy: 2095, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dune-wall1 rotate: false - xy: 917, 17 + xy: 917, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dune-wall2 rotate: false - xy: 3391, 213 + xy: 3589, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge rotate: false - xy: 951, 17 + xy: 951, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge-stencil rotate: false - xy: 589, 51 + xy: 589, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 edgier rotate: false - xy: 3425, 213 + xy: 3623, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-edge rotate: false - xy: 687, 149 + xy: 687, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 grass1 rotate: false - xy: 985, 17 + xy: 985, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass2 rotate: false - xy: 3459, 213 + xy: 3657, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass3 rotate: false - xy: 1019, 17 + xy: 1019, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock1 rotate: false - xy: 3493, 213 + xy: 3691, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock2 rotate: false - xy: 1053, 17 + xy: 1053, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock3 rotate: false - xy: 3527, 213 + xy: 3725, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-edge rotate: false - xy: 687, 51 + xy: 687, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow-edge rotate: false - xy: 785, 149 + xy: 785, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow1 rotate: false - xy: 3595, 213 + xy: 3793, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow2 rotate: false - xy: 1155, 17 + xy: 1155, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow3 rotate: false - xy: 3629, 213 + xy: 3827, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-wall-large rotate: false - xy: 1963, 181 + xy: 2161, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ice-wall1 rotate: false - xy: 1189, 17 + xy: 1189, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-wall2 rotate: false - xy: 3663, 213 + xy: 3861, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice1 rotate: false - xy: 1087, 17 + xy: 1087, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice2 rotate: false - xy: 3561, 213 + xy: 3759, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice3 rotate: false - xy: 1121, 17 + xy: 1121, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead1 rotate: false - xy: 1223, 17 + xy: 1223, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead2 rotate: false - xy: 3697, 213 + xy: 3895, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead3 rotate: false - xy: 1257, 17 + xy: 1257, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock1 rotate: false - xy: 3731, 213 + xy: 3929, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock2 rotate: false - xy: 1291, 17 + xy: 1291, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock3 rotate: false - xy: 3765, 213 + xy: 3963, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor rotate: false - xy: 1325, 17 + xy: 1325, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2 rotate: false - xy: 3799, 213 + xy: 3997, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-edge rotate: false - xy: 785, 51 + xy: 785, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-3 rotate: false - xy: 1359, 17 + xy: 1359, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-edge rotate: false - xy: 883, 149 + xy: 883, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-5 rotate: false - xy: 3833, 213 + xy: 4031, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-edge rotate: false - xy: 883, 51 + xy: 883, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged-edge rotate: false - xy: 981, 149 + xy: 981, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged1 rotate: false - xy: 1393, 17 + xy: 1393, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged2 rotate: false - xy: 3867, 213 + xy: 1427, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged3 rotate: false - xy: 1427, 17 + xy: 1461, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-edge rotate: false - xy: 981, 51 + xy: 981, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss-edge rotate: false - xy: 1079, 149 + xy: 1079, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss1 rotate: false - xy: 3901, 213 + xy: 1495, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss2 rotate: false - xy: 1461, 17 + xy: 1529, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss3 rotate: false - xy: 3935, 213 + xy: 1563, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mud-edge rotate: false - xy: 1079, 51 + xy: 1079, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mud1 rotate: false - xy: 1495, 17 + xy: 1597, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mud2 rotate: false - xy: 3969, 213 + xy: 1631, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mud3 rotate: false - xy: 1529, 17 + xy: 1665, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal1 rotate: false - xy: 4003, 213 + xy: 1699, 21 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal2 rotate: false - xy: 1563, 17 + xy: 2689, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal3 rotate: false - xy: 4037, 213 + xy: 2739, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper1 rotate: false - xy: 1597, 17 + xy: 2773, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper2 rotate: false - xy: 1631, 17 + xy: 2807, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper3 rotate: false - xy: 1667, 49 + xy: 2841, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead1 rotate: false - xy: 1733, 115 + xy: 2875, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead2 rotate: false - xy: 1701, 49 + xy: 2909, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead3 rotate: false - xy: 1665, 15 + xy: 2943, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap1 rotate: false - xy: 1699, 15 + xy: 2977, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap2 rotate: false - xy: 2491, 163 + xy: 3011, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap3 rotate: false - xy: 2541, 179 + xy: 3045, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium1 rotate: false - xy: 2575, 179 + xy: 3079, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium2 rotate: false - xy: 2609, 179 + xy: 3113, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium3 rotate: false - xy: 2643, 179 + xy: 3147, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium1 rotate: false - xy: 2677, 179 + xy: 3181, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium2 rotate: false - xy: 2711, 179 + xy: 3215, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium3 rotate: false - xy: 2745, 179 + xy: 3249, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles1 rotate: false - xy: 2779, 179 + xy: 3283, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles2 rotate: false - xy: 2813, 179 + xy: 3317, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles3 rotate: false - xy: 2847, 179 + 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 salt rotate: false - xy: 2881, 179 + xy: 3385, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-edge rotate: false - xy: 1177, 149 + xy: 1177, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salt-wall-large rotate: false - xy: 2029, 181 + xy: 2227, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salt-wall1 rotate: false - xy: 2915, 179 + xy: 3419, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-wall2 rotate: false - xy: 2949, 179 + xy: 3453, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-edge rotate: false - xy: 1177, 51 + xy: 1177, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-wall-large rotate: false - xy: 2095, 181 + xy: 2293, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-wall1 rotate: false - xy: 3085, 179 + xy: 3589, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-wall2 rotate: false - xy: 3119, 179 + xy: 3623, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water rotate: false - xy: 3153, 179 + xy: 3657, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-edge rotate: false - xy: 1275, 149 + xy: 1275, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-water1 rotate: false - xy: 3187, 179 + xy: 3691, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water2 rotate: false - xy: 3221, 179 + xy: 3725, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water3 rotate: false - xy: 3255, 179 + xy: 3759, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand1 rotate: false - xy: 2983, 179 + xy: 3487, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 3017, 179 + xy: 3521, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand3 rotate: false - xy: 3051, 179 + xy: 3555, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap1 rotate: false - xy: 3289, 179 + xy: 3793, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap2 rotate: false - xy: 3323, 179 + xy: 3827, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap3 rotate: false - xy: 3357, 179 + xy: 3861, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-edge rotate: false - xy: 1275, 51 + xy: 1275, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 shale-wall-large rotate: false - xy: 2161, 181 + xy: 2359, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-wall1 rotate: false - xy: 3493, 179 + xy: 3997, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-wall2 rotate: false - xy: 3527, 179 + xy: 4031, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale1 rotate: false - xy: 3391, 179 + xy: 3895, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale2 rotate: false - xy: 3425, 179 + xy: 3929, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale3 rotate: false - xy: 3459, 179 + xy: 3963, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-large rotate: false - xy: 2227, 181 + xy: 2425, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shrubs1 rotate: false - xy: 3561, 179 + xy: 1733, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs2 rotate: false - xy: 3595, 179 + xy: 1767, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag rotate: false - xy: 3629, 179 + xy: 1801, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-edge rotate: false - xy: 1373, 149 + xy: 1373, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-edge rotate: false - xy: 1373, 51 + xy: 1373, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-pine rotate: false - xy: 2491, 197 + xy: 2689, 69 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-wall-large rotate: false - xy: 2293, 181 + xy: 2491, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snow-wall1 rotate: false - xy: 3765, 179 + xy: 1937, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-wall2 rotate: false - xy: 3799, 179 + xy: 1971, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow1 rotate: false - xy: 3663, 179 + xy: 1835, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow2 rotate: false - xy: 3697, 179 + xy: 1869, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow3 rotate: false - xy: 3731, 179 + xy: 1903, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +space + rotate: false + xy: 2005, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +space-edge + rotate: false + xy: 1471, 153 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 spawn rotate: false - xy: 3833, 179 + xy: 2039, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-edge rotate: false - xy: 1471, 149 + xy: 1471, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 spore-moss1 rotate: false - xy: 3867, 179 + xy: 2073, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss2 rotate: false - xy: 3901, 179 + xy: 2107, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss3 rotate: false - xy: 3935, 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 spore-wall-large rotate: false - xy: 2359, 181 + xy: 2557, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-wall1 rotate: false - xy: 3969, 179 + xy: 2175, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-wall2 rotate: false - xy: 4003, 179 + xy: 2209, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-edge rotate: false - xy: 1471, 51 + xy: 1569, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 stone-wall-large rotate: false - xy: 2425, 181 + xy: 2623, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stone-wall1 rotate: false - xy: 1801, 147 + xy: 2345, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-wall2 rotate: false - xy: 1835, 147 + xy: 2379, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone1 rotate: false - xy: 4037, 179 + xy: 2243, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 1733, 15 + xy: 2277, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone3 rotate: false - xy: 1767, 147 + xy: 2311, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water rotate: false - xy: 1869, 147 + xy: 2413, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-edge rotate: false - xy: 1569, 149 + xy: 1569, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tar rotate: false - xy: 1903, 147 + xy: 2447, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-edge rotate: false - xy: 1569, 51 + xy: 1667, 153 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tendrils1 rotate: false - xy: 1937, 147 + xy: 2481, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils2 rotate: false - xy: 1971, 147 + xy: 2515, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils3 rotate: false - xy: 2005, 147 + xy: 2549, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 2039, 147 + xy: 2583, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 2073, 147 + xy: 2617, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 2107, 147 + xy: 2651, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 2141, 147 + xy: 2685, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 2175, 147 + xy: 2719, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 2209, 147 + xy: 2753, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 2243, 147 + xy: 2787, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-edge rotate: false - xy: 1667, 149 + xy: 1667, 55 size: 96, 96 orig: 96, 96 offset: 0, 0 @@ -8956,2226 +11168,2261 @@ filter: nearest,nearest repeat: none additive-reconstructor-icon-editor rotate: false - xy: 2167, 405 + xy: 2297, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory-icon-editor rotate: false - xy: 2265, 405 + xy: 2395, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-icon-editor rotate: false - xy: 2363, 405 + xy: 2493, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 255, 17 + xy: 4061, 461 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 289, 17 + xy: 205, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 basalt-icon-editor rotate: false - xy: 323, 17 + xy: 4061, 427 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-basalt1 rotate: false - xy: 323, 17 + xy: 4061, 427 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 357, 17 + xy: 239, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 2461, 405 + xy: 2591, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 163, 51 + xy: 163, 43 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 4029, 437 + xy: 1749, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 391, 17 + xy: 273, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-forge-icon-editor rotate: false - xy: 2559, 405 + xy: 2689, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-loader-icon-editor rotate: false - xy: 2657, 405 + xy: 2787, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader-icon-editor rotate: false - xy: 2755, 405 + xy: 2885, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 boulder-icon-editor rotate: false - xy: 3751, 355 + xy: 1423, 185 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bridge-conduit-icon-editor rotate: false - xy: 425, 17 + xy: 307, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 459, 17 + xy: 341, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 493, 17 + xy: 375, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 493, 17 + xy: 375, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 645, 210 + xy: 645, 202 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliff-icon-editor rotate: false - xy: 553, 49 + xy: 409, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 1553, 307 + xy: 1815, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 587, 49 + xy: 443, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-center-icon-editor rotate: false - xy: 1619, 307 + xy: 1881, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conduit-icon-editor rotate: false - xy: 651, 81 + xy: 477, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 1685, 307 + xy: 1947, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 685, 81 + xy: 511, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 719, 81 + xy: 1423, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 1751, 307 + xy: 2013, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 1517, 373 + xy: 1517, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 1, 19 + xy: 1, 11 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 2853, 405 + xy: 2983, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 753, 81 + xy: 1457, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 753, 81 + xy: 1457, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cryofluidmixer-icon-editor +cryofluid-mixer-icon-editor rotate: false - xy: 1817, 307 + xy: 2079, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 1883, 307 + xy: 2145, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 2951, 405 + xy: 3081, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dacite-boulder-icon-editor rotate: false - xy: 3801, 355 + xy: 1473, 185 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dacite-icon-editor rotate: false - xy: 787, 81 + xy: 1491, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dacite1 rotate: false - xy: 787, 81 + xy: 1491, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dacite-wall-icon-editor rotate: false - xy: 821, 81 + xy: 1337, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal-icon-editor rotate: false - xy: 855, 81 + xy: 1371, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 889, 81 + xy: 2277, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 889, 81 + xy: 2277, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 1141, 79 + xy: 2311, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 1141, 79 + xy: 2311, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 1175, 79 + xy: 2345, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 1175, 79 + xy: 2345, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 1209, 79 + xy: 2379, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 1209, 79 + xy: 2379, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 1243, 79 + xy: 2413, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 1243, 79 + xy: 2413, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 1277, 79 + xy: 2447, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 1277, 79 + xy: 2447, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 4029, 403 + xy: 2481, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 4029, 403 + xy: 2481, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 4063, 403 + xy: 2515, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 1357, 209 + xy: 2549, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 1391, 209 + xy: 2583, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 1391, 209 + xy: 2583, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 3049, 405 + xy: 3179, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode-icon-editor rotate: false - xy: 1425, 209 + xy: 2617, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-icon-editor rotate: false - xy: 1459, 209 + xy: 2651, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dirt1 rotate: false - xy: 1459, 209 + xy: 2651, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dirt-wall-icon-editor rotate: false - xy: 1493, 209 + xy: 2685, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 disassembler-icon-editor rotate: false - xy: 3147, 405 + xy: 3277, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 1949, 307 + xy: 2211, 299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 1311, 79 + xy: 2719, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 2015, 307 + xy: 2297, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dune-wall-icon-editor rotate: false - xy: 3751, 321 + xy: 2753, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 3785, 321 + xy: 2787, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-basalt2 rotate: false - xy: 3819, 321 + xy: 2821, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-basalt3 rotate: false - xy: 3853, 321 + xy: 2855, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 3887, 321 + xy: 2889, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 3921, 321 + xy: 2923, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters2 rotate: false - xy: 3955, 321 + xy: 2957, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 1337, 175 + xy: 2991, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dacite2 rotate: false - xy: 1337, 141 + xy: 3025, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dacite3 rotate: false - xy: 1371, 175 + xy: 3059, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water1 rotate: false - xy: 1405, 141 + xy: 3161, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water2 rotate: false - xy: 1439, 175 + xy: 3195, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water3 rotate: false - xy: 1439, 141 + xy: 3229, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water1 rotate: false - xy: 1473, 175 + xy: 3263, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water2 rotate: false - xy: 1473, 141 + xy: 3297, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water3 rotate: false - xy: 1507, 175 + xy: 3331, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 1371, 141 + xy: 3093, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 1405, 175 + xy: 3127, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dirt2 rotate: false - xy: 1507, 141 + xy: 3365, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dirt3 rotate: false - xy: 2147, 305 + xy: 3399, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 2147, 271 + xy: 3433, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 2147, 271 + xy: 3433, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 2181, 305 + xy: 3467, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 2181, 271 + xy: 3501, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 2215, 305 + xy: 3535, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 2215, 305 + xy: 3535, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 2215, 271 + xy: 3569, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 2249, 305 + xy: 3603, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 2317, 305 + xy: 3739, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 2317, 305 + xy: 3739, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 2317, 271 + xy: 3773, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 2351, 305 + xy: 3807, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 2249, 271 + xy: 3637, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 2249, 271 + xy: 3637, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 2283, 305 + xy: 3671, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 2283, 271 + xy: 3705, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 2351, 271 + xy: 3841, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 2351, 271 + xy: 3841, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 2385, 305 + xy: 3875, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 2385, 271 + xy: 3909, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 2419, 305 + xy: 3943, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 2419, 305 + xy: 3943, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 2419, 271 + xy: 3977, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 2419, 271 + xy: 3977, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 2453, 305 + xy: 4011, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 2453, 305 + xy: 4011, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 2453, 271 + xy: 4045, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 2453, 271 + xy: 4045, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 2487, 305 + xy: 1339, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 2487, 305 + xy: 1339, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 2487, 271 + xy: 1339, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 2521, 305 + xy: 1373, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 2521, 271 + xy: 1373, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 2521, 271 + xy: 1373, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 2555, 305 + xy: 1339, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 2555, 271 + xy: 1373, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-mud1 rotate: false - xy: 2589, 305 + xy: 915, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mud-icon-editor rotate: false - xy: 2589, 305 + xy: 915, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-mud2 rotate: false - xy: 2589, 271 + xy: 949, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-mud3 rotate: false - xy: 2623, 305 + xy: 983, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 2623, 271 + xy: 1017, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 2657, 305 + xy: 1051, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 2657, 271 + xy: 1085, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 2691, 305 + xy: 1753, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 2691, 271 + xy: 1753, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 2725, 305 + xy: 1787, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 2725, 271 + xy: 1787, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 2759, 305 + xy: 1821, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 2759, 271 + xy: 1821, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 2793, 305 + xy: 1855, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 2793, 271 + xy: 1855, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 2827, 305 + xy: 1889, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 2827, 271 + xy: 1889, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 2861, 305 + xy: 1923, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 2861, 271 + xy: 1923, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 2895, 305 + xy: 1957, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 2895, 271 + xy: 1957, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 2929, 305 + xy: 1991, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 2929, 271 + xy: 1991, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 2963, 305 + xy: 2025, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 2963, 271 + xy: 2025, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 2997, 305 + xy: 2059, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 2997, 305 + xy: 2059, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water1 rotate: false - xy: 3065, 305 + xy: 2127, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water2 rotate: false - xy: 3065, 271 + xy: 2127, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water3 rotate: false - xy: 3099, 305 + xy: 2161, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 2997, 271 + xy: 2059, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 2997, 271 + xy: 2059, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 3031, 305 + xy: 2093, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 3031, 271 + xy: 2093, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 3099, 271 + xy: 2161, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 3099, 271 + xy: 2161, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 3133, 305 + xy: 2195, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 3133, 271 + xy: 2195, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-slag rotate: false - xy: 3167, 305 + xy: 2229, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-icon-editor rotate: false - xy: 3167, 305 + xy: 2229, 265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 3167, 271 + xy: 2229, 231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 3201, 305 + xy: 2263, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 3201, 271 + 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: 3235, 305 + xy: 2365, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 3235, 271 + xy: 2399, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 3235, 271 + xy: 2399, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 3269, 305 + xy: 2433, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 3269, 271 + xy: 2467, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 3303, 305 + xy: 2501, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 3303, 305 + xy: 2501, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 3303, 271 + xy: 2535, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 3337, 305 + xy: 2569, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 3337, 271 + xy: 2603, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 3337, 271 + xy: 2603, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 3371, 305 + xy: 2637, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 3371, 305 + xy: 2637, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 3371, 271 + xy: 2671, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 3405, 305 + xy: 2705, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 3405, 271 + xy: 2739, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 3439, 305 + xy: 2773, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 3439, 305 + xy: 2773, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 exponential-reconstructor-icon-editor rotate: false - xy: 935, 277 + xy: 935, 269 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 force-projector-icon-editor rotate: false - xy: 3245, 405 + 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: 3343, 405 + xy: 3473, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 2081, 307 + xy: 2363, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ground-factory-icon-editor rotate: false - xy: 3441, 405 + xy: 3571, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hail-icon-editor rotate: false - xy: 3439, 271 + xy: 2807, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hyper-processor-icon-editor rotate: false - xy: 3539, 405 + xy: 3669, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-wall-icon-editor rotate: false - xy: 3473, 305 + xy: 2841, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-icon-editor rotate: false - xy: 3473, 271 + xy: 2875, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 293, 51 + xy: 1647, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 3507, 305 + xy: 2909, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 3507, 271 + xy: 2943, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 3541, 305 + xy: 2977, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 3541, 271 + xy: 3011, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 3575, 305 + xy: 3045, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 1553, 241 + xy: 2429, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 1619, 241 + xy: 2495, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 large-logic-display-icon-editor rotate: false - xy: 1161, 309 + xy: 1161, 301 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 laser-drill-icon-editor rotate: false - xy: 3637, 405 + xy: 3767, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 3735, 405 + xy: 3865, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large-icon-editor rotate: false - xy: 1647, 373 + xy: 423, 43 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 3575, 271 + xy: 3079, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 3609, 305 + xy: 3113, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 3609, 271 + xy: 3147, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 3833, 405 + xy: 3963, 397 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-void-icon-editor rotate: false - xy: 3643, 305 + xy: 3181, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-display-icon-editor rotate: false - xy: 3931, 405 + xy: 553, 75 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor-icon-editor rotate: false - xy: 1685, 241 + xy: 2561, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 553, 83 + xy: 651, 107 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 1751, 241 + xy: 2627, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 3643, 271 + xy: 3215, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 423, 51 + xy: 1777, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 3677, 305 + 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: 3677, 271 + xy: 3283, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 1817, 241 + xy: 2759, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 3711, 305 + xy: 3317, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 3711, 271 + xy: 3351, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor-icon-editor rotate: false - xy: 2147, 237 + xy: 3385, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 651, 115 + xy: 749, 107 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor-icon-editor rotate: false - xy: 1355, 341 + xy: 1355, 333 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory-icon-editor rotate: false - xy: 749, 115 + xy: 847, 107 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 847, 115 + xy: 945, 171 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-icon-editor rotate: false - xy: 945, 179 + xy: 1043, 171 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 1883, 241 + xy: 2825, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 2181, 237 + xy: 3419, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 parallax-icon-editor rotate: false - xy: 1949, 241 + xy: 2891, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 payload-conveyor-icon-editor rotate: false - xy: 1043, 179 + xy: 945, 73 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon-editor rotate: false - xy: 945, 81 + xy: 1043, 73 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 2215, 237 + xy: 3453, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 2249, 237 + xy: 3487, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 2283, 237 + xy: 3521, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 2317, 237 + xy: 3555, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 2015, 241 + xy: 2957, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 2081, 241 + xy: 3023, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 3851, 355 + xy: 1553, 217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 2167, 339 + xy: 3089, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-conveyor-icon-editor rotate: false - xy: 2351, 237 + xy: 3589, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-icon-editor rotate: false - xy: 2385, 237 + xy: 3623, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large-icon-editor rotate: false - xy: 2233, 339 + xy: 3155, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plated-conduit-icon-editor rotate: false - xy: 2419, 237 + xy: 3657, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 2299, 339 + xy: 3221, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 2453, 237 + xy: 3691, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 2365, 339 + xy: 3287, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 2487, 237 + xy: 3725, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 2521, 237 + xy: 3759, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 2555, 237 + xy: 3793, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 2589, 237 + xy: 3827, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 2431, 339 + xy: 3353, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 2623, 237 + xy: 3861, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point-icon-editor rotate: false - xy: 2497, 339 + xy: 3419, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 1043, 81 + xy: 1161, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rotary-pump-icon-editor rotate: false - xy: 2563, 339 + xy: 3485, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 2657, 237 + xy: 3895, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 2629, 339 + xy: 3551, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salt-wall-icon-editor rotate: false - xy: 2691, 237 + xy: 3929, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 2695, 339 + xy: 3617, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 2725, 237 + xy: 3963, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-wall-icon-editor rotate: false - xy: 2759, 237 + xy: 3997, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 2793, 237 + xy: 4031, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 2761, 339 + xy: 3683, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 2827, 237 + xy: 2263, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 1777, 373 + xy: 1907, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 1161, 211 + xy: 1259, 203 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 2861, 237 + xy: 2297, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 2827, 339 + xy: 3749, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 segment-icon-editor rotate: false - xy: 2893, 339 + xy: 3815, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 2959, 339 + xy: 3881, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 2895, 237 + xy: 2331, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-wall-icon-editor rotate: false - xy: 2929, 237 + xy: 2365, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 2963, 237 + xy: 2399, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 2997, 237 + xy: 2433, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-crucible-icon-editor rotate: false - xy: 1259, 211 + xy: 1141, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 3025, 339 + xy: 3947, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snow-boulder-icon-editor rotate: false - xy: 3901, 355 + xy: 1603, 217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-icon-editor rotate: false - xy: 3031, 237 + xy: 2467, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 3951, 355 + xy: 1653, 217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-wall-icon-editor rotate: false - xy: 3065, 237 + xy: 2501, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 3099, 237 + xy: 2535, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 1141, 113 + xy: 1239, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 3133, 237 + xy: 2569, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 3167, 237 + xy: 2603, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 1907, 373 + xy: 2037, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 213, 9 + xy: 163, 1 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 163, 1 + xy: 1703, 217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 3091, 339 + xy: 4013, 331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-wall-icon-editor rotate: false - xy: 3201, 237 + xy: 2637, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 steam-generator-icon-editor rotate: false - xy: 3157, 339 + xy: 553, 9 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 stone-wall-icon-editor rotate: false - xy: 3235, 237 + xy: 2671, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 3223, 339 + xy: 651, 41 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 3269, 237 + xy: 2705, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 3289, 339 + xy: 717, 41 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 3355, 339 + xy: 783, 41 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 switch-icon-editor rotate: false - xy: 3303, 237 + xy: 2739, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 3337, 237 + xy: 2773, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tetrative-reconstructor-icon-editor rotate: false - xy: 645, 213 + xy: 645, 205 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 3421, 339 + xy: 849, 41 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 1239, 113 + xy: 1357, 235 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 1357, 243 + xy: 1455, 235 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 3371, 237 + xy: 2807, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 3487, 339 + xy: 1141, 39 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 2037, 373 + xy: 2167, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 3405, 237 + xy: 2841, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 3439, 237 + xy: 2875, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 3553, 339 + xy: 1207, 39 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +tsunami-icon-editor + rotate: false + xy: 1553, 267 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 underflow-gate-icon-editor rotate: false - xy: 3473, 237 + xy: 2909, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 3507, 237 + xy: 2943, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 1455, 243 + xy: 1651, 267 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 3619, 339 + xy: 1273, 39 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 3685, 339 + xy: 1357, 169 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 181 + xy: 1, 173 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 323, 181 + xy: 323, 173 size: 320, 320 orig: 320, 320 offset: 0, 0 @@ -11195,7 +13442,7 @@ alpha-bg index: -1 bar rotate: false - xy: 1426, 1 + xy: 2343, 150 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -11203,7 +13450,7 @@ bar index: -1 bar-top rotate: false - xy: 1358, 1 + xy: 3550, 139 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -11211,28 +13458,28 @@ bar-top index: -1 block-additive-reconstructor-large rotate: false - xy: 131, 4 + xy: 1004, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-additive-reconstructor-medium rotate: false - xy: 3133, 308 + xy: 3587, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-additive-reconstructor-small rotate: false - xy: 983, 7 + xy: 1605, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-additive-reconstructor-tiny rotate: false - xy: 3491, 395 + xy: 881, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11246,28 +13493,28 @@ block-additive-reconstructor-xlarge index: -1 block-air-factory-large rotate: false - xy: 173, 4 + xy: 1046, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-air-factory-medium rotate: false - xy: 3171, 337 + xy: 3621, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-air-factory-small rotate: false - xy: 1455, 1 + xy: 1731, 96 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-air-factory-tiny rotate: false - xy: 3491, 377 + xy: 309, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11281,28 +13528,28 @@ block-air-factory-xlarge index: -1 block-alloy-smelter-large rotate: false - xy: 215, 4 + xy: 1004, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alloy-smelter-medium rotate: false - xy: 3205, 337 + xy: 3655, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alloy-smelter-small rotate: false - xy: 1709, 41 + xy: 1731, 70 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 3545, 345 + xy: 2169, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11316,28 +13563,28 @@ block-alloy-smelter-xlarge index: -1 block-arc-large rotate: false - xy: 845, 371 + xy: 1088, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 3239, 337 + xy: 901, 155 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 2706, 101 + xy: 1731, 44 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 4079, 287 + xy: 2187, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11351,28 +13598,28 @@ block-arc-xlarge index: -1 block-armored-conveyor-large rotate: false - xy: 887, 371 + xy: 1046, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 3273, 337 + xy: 935, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 1009, 7 + xy: 3810, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 4079, 269 + xy: 2205, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11386,28 +13633,28 @@ block-armored-conveyor-xlarge index: -1 block-basalt-large rotate: false - xy: 929, 371 + xy: 1130, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-basalt-medium rotate: false - xy: 3307, 337 + xy: 969, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-basalt-small rotate: false - xy: 1481, 1 + xy: 2372, 162 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-basalt-tiny rotate: false - xy: 4079, 251 + xy: 2223, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11421,35 +13668,35 @@ block-basalt-xlarge index: -1 block-battery-large rotate: false - xy: 971, 371 + xy: 1088, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-large rotate: false - xy: 1013, 371 + xy: 1172, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-medium rotate: false - xy: 3341, 337 + xy: 2639, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-large-small rotate: false - xy: 1507, 1 + xy: 2372, 136 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-large-tiny rotate: false - xy: 4079, 233 + xy: 2241, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11463,21 +13710,21 @@ block-battery-large-xlarge index: -1 block-battery-medium rotate: false - xy: 3375, 337 + xy: 2673, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-small rotate: false - xy: 1533, 1 + xy: 2398, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-tiny rotate: false - xy: 4079, 215 + xy: 2259, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11491,28 +13738,28 @@ block-battery-xlarge index: -1 block-blast-drill-large rotate: false - xy: 1055, 371 + xy: 1130, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-drill-medium rotate: false - xy: 3409, 337 + xy: 2707, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-small rotate: false - xy: 1559, 1 + xy: 2424, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-drill-tiny rotate: false - xy: 4079, 197 + xy: 2277, 29 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11526,28 +13773,28 @@ block-blast-drill-xlarge index: -1 block-blast-mixer-large rotate: false - xy: 1097, 371 + xy: 1214, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-mixer-medium rotate: false - xy: 3443, 337 + xy: 2741, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-mixer-small rotate: false - xy: 1585, 1 + xy: 2398, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-mixer-tiny rotate: false - xy: 4079, 179 + xy: 257, 2 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11561,28 +13808,28 @@ block-blast-mixer-xlarge index: -1 block-block-forge-large rotate: false - xy: 1139, 371 + xy: 1172, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-forge-medium rotate: false - xy: 2539, 211 + xy: 2775, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-forge-small rotate: false - xy: 1735, 41 + xy: 2424, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-forge-tiny rotate: false - xy: 4079, 161 + xy: 2384, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11596,28 +13843,28 @@ block-block-forge-xlarge index: -1 block-block-loader-large rotate: false - xy: 1181, 371 + xy: 1256, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-loader-medium rotate: false - xy: 2573, 211 + xy: 2809, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-loader-small rotate: false - xy: 1035, 7 + xy: 3825, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-loader-tiny rotate: false - xy: 3886, 312 + xy: 2402, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11631,28 +13878,28 @@ block-block-loader-xlarge index: -1 block-block-unloader-large rotate: false - xy: 1223, 371 + xy: 1214, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-unloader-medium rotate: false - xy: 938, 169 + xy: 2843, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-unloader-small rotate: false - xy: 1761, 41 + xy: 3836, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-unloader-tiny rotate: false - xy: 3047, 261 + xy: 2420, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11666,28 +13913,28 @@ block-block-unloader-xlarge index: -1 block-boulder-large rotate: false - xy: 1265, 371 + xy: 1298, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-boulder-medium rotate: false - xy: 972, 169 + xy: 2877, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-boulder-small rotate: false - xy: 1061, 7 + xy: 3825, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-boulder-tiny rotate: false - xy: 2969, 183 + xy: 2438, 81 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11701,28 +13948,28 @@ block-boulder-xlarge index: -1 block-bridge-conduit-large rotate: false - xy: 1307, 371 + xy: 1256, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conduit-medium rotate: false - xy: 1006, 169 + xy: 2911, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conduit-small rotate: false - xy: 1787, 41 + xy: 3824, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conduit-tiny rotate: false - xy: 2992, 209 + xy: 2381, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11736,28 +13983,28 @@ block-bridge-conduit-xlarge index: -1 block-bridge-conveyor-large rotate: false - xy: 1349, 371 + xy: 1340, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conveyor-medium rotate: false - xy: 1040, 169 + xy: 2945, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conveyor-small rotate: false - xy: 1087, 7 + xy: 3851, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conveyor-tiny rotate: false - xy: 309, 160 + xy: 2381, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11771,28 +14018,28 @@ block-bridge-conveyor-xlarge index: -1 block-char-large rotate: false - xy: 1391, 371 + xy: 1298, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-char-medium rotate: false - xy: 1074, 169 + xy: 2979, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-small rotate: false - xy: 1813, 41 + xy: 3851, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-char-tiny rotate: false - xy: 2448, 142 + xy: 2399, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11806,28 +14053,28 @@ block-char-xlarge index: -1 block-cliff-large rotate: false - xy: 1433, 371 + xy: 1382, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cliff-medium rotate: false - xy: 1108, 169 + xy: 3013, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliff-small rotate: false - xy: 1113, 7 + xy: 3850, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cliff-tiny rotate: false - xy: 3065, 261 + xy: 2381, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11841,28 +14088,28 @@ block-cliff-xlarge index: -1 block-coal-centrifuge-large rotate: false - xy: 1475, 371 + xy: 1340, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-coal-centrifuge-medium rotate: false - xy: 1142, 169 + xy: 3047, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-small rotate: false - xy: 1839, 41 + xy: 3862, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-coal-centrifuge-tiny rotate: false - xy: 3083, 261 + xy: 2399, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11876,28 +14123,28 @@ block-coal-centrifuge-xlarge index: -1 block-combustion-generator-large rotate: false - xy: 1517, 371 + xy: 1424, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-combustion-generator-medium rotate: false - xy: 1176, 169 + xy: 3081, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-combustion-generator-small rotate: false - xy: 1139, 7 + xy: 3877, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-combustion-generator-tiny rotate: false - xy: 3101, 261 + xy: 2417, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11911,28 +14158,28 @@ block-combustion-generator-xlarge index: -1 block-command-center-large rotate: false - xy: 1559, 371 + xy: 1382, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-command-center-medium rotate: false - xy: 1210, 169 + xy: 3115, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-command-center-small rotate: false - xy: 1865, 41 + xy: 3877, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-command-center-tiny rotate: false - xy: 2787, 131 + xy: 2381, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11946,28 +14193,28 @@ block-command-center-xlarge index: -1 block-conduit-large rotate: false - xy: 1601, 371 + xy: 1466, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conduit-medium rotate: false - xy: 1244, 169 + xy: 3149, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-small rotate: false - xy: 1165, 7 + xy: 3876, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conduit-tiny rotate: false - xy: 2229, 5 + xy: 2399, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11981,28 +14228,28 @@ block-conduit-xlarge index: -1 block-container-large rotate: false - xy: 1643, 371 + xy: 1424, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-container-medium rotate: false - xy: 1278, 169 + xy: 3183, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-small rotate: false - xy: 1891, 41 + xy: 3888, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-container-tiny rotate: false - xy: 2247, 5 + xy: 2417, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12016,28 +14263,28 @@ block-container-xlarge index: -1 block-conveyor-large rotate: false - xy: 1685, 371 + xy: 1508, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conveyor-medium rotate: false - xy: 1312, 169 + xy: 3217, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-small rotate: false - xy: 1191, 7 + xy: 3903, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conveyor-tiny rotate: false - xy: 2265, 5 + xy: 2435, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12051,35 +14298,35 @@ block-conveyor-xlarge index: -1 block-copper-wall-large rotate: false - xy: 1727, 371 + xy: 1466, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-large rotate: false - xy: 1769, 371 + xy: 1550, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-medium rotate: false - xy: 1346, 169 + xy: 3251, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-small rotate: false - xy: 1917, 41 + xy: 3903, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-large-tiny rotate: false - xy: 2283, 5 + xy: 2399, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12093,21 +14340,21 @@ block-copper-wall-large-xlarge index: -1 block-copper-wall-medium rotate: false - xy: 1380, 169 + xy: 3285, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-small rotate: false - xy: 1217, 7 + xy: 3902, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-tiny rotate: false - xy: 2301, 5 + xy: 2417, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12121,28 +14368,28 @@ block-copper-wall-xlarge index: -1 block-core-foundation-large rotate: false - xy: 1811, 371 + xy: 1508, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-foundation-medium rotate: false - xy: 1414, 169 + xy: 3319, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-small rotate: false - xy: 1943, 41 + xy: 3914, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-foundation-tiny rotate: false - xy: 2319, 5 + xy: 2435, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12156,28 +14403,28 @@ block-core-foundation-xlarge index: -1 block-core-nucleus-large rotate: false - xy: 1853, 371 + xy: 1592, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-nucleus-medium rotate: false - xy: 1448, 169 + xy: 3353, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-nucleus-small rotate: false - xy: 1243, 7 + xy: 3929, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-nucleus-tiny rotate: false - xy: 2337, 5 + xy: 2417, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12191,28 +14438,28 @@ block-core-nucleus-xlarge index: -1 block-core-shard-large rotate: false - xy: 1895, 371 + xy: 1550, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-shard-medium rotate: false - xy: 1482, 169 + xy: 3387, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-shard-small rotate: false - xy: 1969, 41 + xy: 3929, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-shard-tiny rotate: false - xy: 2355, 5 + xy: 2435, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12226,28 +14473,28 @@ block-core-shard-xlarge index: -1 block-craters-large rotate: false - xy: 1937, 371 + xy: 1634, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-craters-medium rotate: false - xy: 1516, 169 + xy: 1799, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-craters-small rotate: false - xy: 1269, 7 + xy: 3928, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-craters-tiny rotate: false - xy: 2373, 5 + xy: 2435, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12259,35 +14506,35 @@ block-craters-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-cryofluidmixer-large +block-cryofluid-mixer-large rotate: false - xy: 1979, 371 + xy: 1592, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cryofluidmixer-medium +block-cryofluid-mixer-medium rotate: false - xy: 1550, 169 + xy: 1833, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cryofluidmixer-small +block-cryofluid-mixer-small rotate: false - xy: 1995, 41 + xy: 3940, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cryofluidmixer-tiny +block-cryofluid-mixer-tiny rotate: false - xy: 2391, 5 + xy: 2462, 107 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cryofluidmixer-xlarge +block-cryofluid-mixer-xlarge rotate: false xy: 1907, 463 size: 48, 48 @@ -12296,28 +14543,28 @@ block-cryofluidmixer-xlarge index: -1 block-cultivator-large rotate: false - xy: 2021, 371 + xy: 1676, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cultivator-medium rotate: false - xy: 1584, 169 + xy: 1867, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cultivator-small rotate: false - xy: 1295, 7 + xy: 3955, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cultivator-tiny rotate: false - xy: 2409, 5 + xy: 1809, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12331,28 +14578,28 @@ block-cultivator-xlarge index: -1 block-cyclone-large rotate: false - xy: 2063, 371 + xy: 1634, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cyclone-medium rotate: false - xy: 1618, 169 + xy: 1901, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cyclone-small rotate: false - xy: 2021, 41 + xy: 3955, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cyclone-tiny rotate: false - xy: 2427, 5 + xy: 1827, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12366,28 +14613,28 @@ block-cyclone-xlarge index: -1 block-dacite-boulder-large rotate: false - xy: 2105, 371 + xy: 1718, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dacite-boulder-medium rotate: false - xy: 1652, 169 + xy: 1935, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dacite-boulder-small rotate: false - xy: 1321, 7 + xy: 3954, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dacite-boulder-tiny rotate: false - xy: 2445, 5 + xy: 1845, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12401,56 +14648,56 @@ block-dacite-boulder-xlarge index: -1 block-dacite-large rotate: false - xy: 2147, 371 + xy: 1676, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dacite-medium rotate: false - xy: 1686, 169 + xy: 1969, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dacite-small rotate: false - xy: 2047, 41 + xy: 3966, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dacite-tiny rotate: false - xy: 2463, 5 + xy: 1863, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dacite-wall-large rotate: false - xy: 2189, 371 + xy: 1760, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dacite-wall-medium rotate: false - xy: 1720, 169 + xy: 2003, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dacite-wall-small rotate: false - xy: 2073, 41 + xy: 3981, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dacite-wall-tiny rotate: false - xy: 2784, 113 + xy: 1881, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12471,28 +14718,28 @@ block-dacite-xlarge index: -1 block-dark-metal-large rotate: false - xy: 2231, 371 + xy: 1718, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-metal-medium rotate: false - xy: 1754, 169 + xy: 2037, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-metal-small rotate: false - xy: 2099, 41 + xy: 3981, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-metal-tiny rotate: false - xy: 2784, 95 + xy: 1899, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12506,28 +14753,28 @@ block-dark-metal-xlarge index: -1 block-dark-panel-1-large rotate: false - xy: 2273, 371 + xy: 1802, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-1-medium rotate: false - xy: 1788, 169 + xy: 2071, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-1-small rotate: false - xy: 2208, 75 + xy: 3980, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-1-tiny rotate: false - xy: 2784, 77 + xy: 1917, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12541,28 +14788,28 @@ block-dark-panel-1-xlarge index: -1 block-dark-panel-2-large rotate: false - xy: 2315, 371 + xy: 1760, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-2-medium rotate: false - xy: 1822, 169 + xy: 2105, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-2-small rotate: false - xy: 2234, 75 + xy: 3992, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-2-tiny rotate: false - xy: 2891, 157 + xy: 1935, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12576,28 +14823,28 @@ block-dark-panel-2-xlarge index: -1 block-dark-panel-3-large rotate: false - xy: 2357, 371 + xy: 1844, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-3-medium rotate: false - xy: 1856, 169 + xy: 2139, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-3-small rotate: false - xy: 2260, 75 + xy: 4018, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-3-tiny rotate: false - xy: 2909, 157 + xy: 1953, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12611,28 +14858,28 @@ block-dark-panel-3-xlarge index: -1 block-dark-panel-4-large rotate: false - xy: 2399, 371 + xy: 1802, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-4-medium rotate: false - xy: 1890, 169 + xy: 2173, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-4-small rotate: false - xy: 2286, 75 + xy: 4007, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-4-tiny rotate: false - xy: 2927, 157 + xy: 1971, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12646,28 +14893,28 @@ block-dark-panel-4-xlarge index: -1 block-dark-panel-5-large rotate: false - xy: 2441, 371 + xy: 1886, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-5-medium rotate: false - xy: 1924, 169 + xy: 2207, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-5-small rotate: false - xy: 2312, 75 + xy: 4007, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-5-tiny rotate: false - xy: 2945, 162 + xy: 2169, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12681,28 +14928,28 @@ block-dark-panel-5-xlarge index: -1 block-dark-panel-6-large rotate: false - xy: 2483, 371 + xy: 1844, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-6-medium rotate: false - xy: 1958, 169 + xy: 2241, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-6-small rotate: false - xy: 2338, 75 + xy: 4006, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-6-tiny rotate: false - xy: 2813, 141 + xy: 2187, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12716,49 +14963,49 @@ block-dark-panel-6-xlarge index: -1 block-darksand-large rotate: false - xy: 2525, 371 + xy: 1928, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-medium rotate: false - xy: 1992, 169 + xy: 2275, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-small rotate: false - xy: 2364, 75 + xy: 4033, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-large rotate: false - xy: 2567, 371 + xy: 1886, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-tainted-water-medium rotate: false - xy: 2026, 169 + xy: 2309, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-tainted-water-small rotate: false - xy: 2390, 75 + xy: 4033, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-tiny rotate: false - xy: 2831, 141 + xy: 2205, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12772,35 +15019,35 @@ block-darksand-tainted-water-xlarge index: -1 block-darksand-tiny rotate: false - xy: 2849, 141 + xy: 2223, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-water-large rotate: false - xy: 2609, 371 + xy: 1970, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-water-medium rotate: false - xy: 2060, 169 + xy: 1969, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-water-small rotate: false - xy: 2416, 75 + xy: 4032, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-water-tiny rotate: false - xy: 2867, 146 + xy: 2241, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12821,28 +15068,28 @@ block-darksand-xlarge index: -1 block-deepwater-large rotate: false - xy: 2651, 371 + xy: 1928, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-deepwater-medium rotate: false - xy: 2094, 169 + xy: 2003, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-deepwater-small rotate: false - xy: 1387, 7 + xy: 4059, 226 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-deepwater-tiny rotate: false - xy: 1611, 7 + xy: 2259, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12856,28 +15103,28 @@ block-deepwater-xlarge index: -1 block-differential-generator-large rotate: false - xy: 2693, 371 + xy: 2012, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-differential-generator-medium rotate: false - xy: 2128, 169 + xy: 2037, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-differential-generator-small rotate: false - xy: 2125, 41 + xy: 4059, 200 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-differential-generator-tiny rotate: false - xy: 1629, 7 + xy: 2277, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12891,28 +15138,28 @@ block-differential-generator-xlarge index: -1 block-diode-large rotate: false - xy: 2735, 371 + xy: 1970, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-diode-medium rotate: false - xy: 2162, 169 + xy: 2071, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-diode-small rotate: false - xy: 2151, 50 + xy: 4059, 174 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-diode-tiny rotate: false - xy: 2992, 191 + xy: 2295, 18 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12926,56 +15173,56 @@ block-diode-xlarge index: -1 block-dirt-large rotate: false - xy: 2777, 371 + xy: 2054, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dirt-medium rotate: false - xy: 2196, 169 + xy: 2105, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dirt-small rotate: false - xy: 2177, 53 + xy: 4058, 148 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dirt-tiny rotate: false - xy: 3010, 209 + xy: 2462, 89 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dirt-wall-large rotate: false - xy: 2819, 371 + xy: 2012, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dirt-wall-medium rotate: false - xy: 2230, 169 + xy: 2139, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dirt-wall-small rotate: false - xy: 2203, 49 + xy: 2445, 177 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dirt-wall-tiny rotate: false - xy: 3010, 191 + xy: 2069, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12996,28 +15243,28 @@ block-dirt-xlarge index: -1 block-disassembler-large rotate: false - xy: 2861, 371 + xy: 2096, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-disassembler-medium rotate: false - xy: 2264, 169 + xy: 2173, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-disassembler-small rotate: false - xy: 2229, 49 + xy: 2450, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-disassembler-tiny rotate: false - xy: 3018, 227 + xy: 2087, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13031,28 +15278,28 @@ block-disassembler-xlarge index: -1 block-distributor-large rotate: false - xy: 2903, 371 + xy: 2054, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-distributor-medium rotate: false - xy: 2298, 169 + xy: 2207, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-distributor-small rotate: false - xy: 2255, 49 + xy: 2450, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-distributor-tiny rotate: false - xy: 2481, 5 + xy: 2453, 63 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13066,35 +15313,35 @@ block-distributor-xlarge index: -1 block-door-large rotate: false - xy: 2945, 371 + xy: 2138, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-large rotate: false - xy: 2987, 371 + xy: 2096, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-medium rotate: false - xy: 2332, 169 + xy: 2241, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-large-small rotate: false - xy: 2281, 49 + xy: 2471, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-large-tiny rotate: false - xy: 3028, 209 + xy: 2453, 45 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13108,21 +15355,21 @@ block-door-large-xlarge index: -1 block-door-medium rotate: false - xy: 2366, 169 + xy: 2275, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-small rotate: false - xy: 2307, 49 + xy: 2497, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-tiny rotate: false - xy: 3028, 191 + xy: 2453, 27 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13136,28 +15383,28 @@ block-door-xlarge index: -1 block-dune-wall-large rotate: false - xy: 3029, 371 + xy: 2180, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dune-wall-medium rotate: false - xy: 2791, 279 + xy: 2309, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dune-wall-small rotate: false - xy: 2333, 49 + xy: 2523, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dune-wall-tiny rotate: false - xy: 3036, 227 + xy: 2453, 9 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13171,28 +15418,28 @@ block-dune-wall-xlarge index: -1 block-duo-large rotate: false - xy: 3071, 371 + xy: 2138, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-duo-medium rotate: false - xy: 2825, 279 + xy: 881, 121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-small rotate: false - xy: 2359, 49 + xy: 2549, 194 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-duo-tiny rotate: false - xy: 3046, 209 + xy: 4047, 123 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13206,28 +15453,28 @@ block-duo-xlarge index: -1 block-exponential-reconstructor-large rotate: false - xy: 3113, 371 + xy: 2222, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-exponential-reconstructor-medium rotate: false - xy: 2859, 279 + xy: 881, 87 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-exponential-reconstructor-small rotate: false - xy: 2385, 49 + xy: 2549, 168 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-exponential-reconstructor-tiny rotate: false - xy: 3046, 191 + xy: 4065, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13241,28 +15488,28 @@ block-exponential-reconstructor-xlarge index: -1 block-force-projector-large rotate: false - xy: 3155, 371 + xy: 2180, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-force-projector-medium rotate: false - xy: 2893, 279 + xy: 881, 53 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-force-projector-small rotate: false - xy: 2411, 49 + xy: 2575, 177 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-force-projector-tiny rotate: false - xy: 3054, 227 + xy: 4047, 105 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13274,5469 +15521,5609 @@ block-force-projector-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-fuse-large +block-foreshadow-large rotate: false - xy: 3197, 371 + xy: 2264, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-fuse-medium +block-foreshadow-medium rotate: false - xy: 2927, 279 + xy: 881, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-fuse-small +block-foreshadow-small rotate: false - xy: 2706, 75 + xy: 2601, 177 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-fuse-tiny +block-foreshadow-tiny rotate: false - xy: 3064, 209 + xy: 4065, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-fuse-xlarge +block-foreshadow-xlarge rotate: false xy: 3357, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-graphite-press-large +block-fuse-large rotate: false - xy: 3239, 371 + xy: 2222, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-graphite-press-medium +block-fuse-medium rotate: false - xy: 2961, 279 + xy: 915, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-graphite-press-small +block-fuse-small rotate: false - xy: 2151, 24 + xy: 2575, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-graphite-press-tiny +block-fuse-tiny rotate: false - xy: 3064, 191 + xy: 4065, 94 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-graphite-press-xlarge +block-fuse-xlarge rotate: false xy: 3407, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-grass-large +block-graphite-press-large rotate: false - xy: 3281, 371 + xy: 2306, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-grass-medium +block-graphite-press-medium rotate: false - xy: 2995, 279 + xy: 915, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-grass-small +block-graphite-press-small rotate: false - xy: 2177, 27 + xy: 2601, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-grass-tiny +block-graphite-press-tiny rotate: false - xy: 3072, 227 + xy: 3809, 311 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-grass-xlarge +block-graphite-press-xlarge rotate: false xy: 3457, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ground-factory-large +block-grass-large rotate: false - xy: 3323, 371 + xy: 2264, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ground-factory-medium +block-grass-medium rotate: false - xy: 3029, 279 + xy: 949, 119 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ground-factory-small +block-grass-small rotate: false - xy: 2177, 1 + xy: 3581, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ground-factory-tiny +block-grass-tiny rotate: false - xy: 3082, 209 + xy: 2476, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ground-factory-xlarge +block-grass-xlarge rotate: false xy: 3507, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hail-large +block-ground-factory-large rotate: false - xy: 3365, 371 + xy: 2348, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hail-medium +block-ground-factory-medium rotate: false - xy: 3063, 279 + xy: 915, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hail-small +block-ground-factory-small rotate: false - xy: 2203, 23 + xy: 3607, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hail-tiny +block-ground-factory-tiny rotate: false - xy: 3082, 191 + xy: 2476, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hail-xlarge +block-ground-factory-xlarge rotate: false xy: 3557, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hotrock-large +block-hail-large rotate: false - xy: 3407, 371 + xy: 2306, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hotrock-medium +block-hail-medium rotate: false - xy: 3097, 279 + xy: 949, 85 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hotrock-small +block-hail-small rotate: false - xy: 2229, 23 + xy: 3633, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hotrock-tiny +block-hail-tiny rotate: false - xy: 3090, 227 + xy: 2476, 139 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hotrock-xlarge +block-hail-xlarge rotate: false xy: 3607, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hyper-processor-large +block-hotrock-large rotate: false - xy: 3449, 371 + xy: 2390, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hyper-processor-medium +block-hotrock-medium rotate: false - xy: 3131, 274 + xy: 949, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hyper-processor-small +block-hotrock-small rotate: false - xy: 2255, 23 + xy: 3659, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hyper-processor-tiny +block-hotrock-tiny rotate: false - xy: 3100, 209 + xy: 2494, 167 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hyper-processor-xlarge +block-hotrock-xlarge rotate: false xy: 3657, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-large +block-hyper-processor-large rotate: false - xy: 859, 329 + xy: 2348, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ice-medium +block-hyper-processor-medium rotate: false - xy: 3167, 303 + xy: 915, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ice-small +block-hyper-processor-small rotate: false - xy: 2281, 23 + xy: 3685, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ice-snow-large +block-hyper-processor-tiny rotate: false - xy: 859, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 3201, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 2307, 23 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 3100, 191 + xy: 2512, 167 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ice-snow-xlarge +block-hyper-processor-xlarge rotate: false xy: 3707, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-tiny +block-ice-large rotate: false - xy: 3108, 227 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-wall-large - rotate: false - xy: 901, 329 + xy: 2432, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ice-wall-medium +block-ice-medium rotate: false - xy: 3235, 303 + xy: 949, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ice-wall-small +block-ice-small rotate: false - xy: 2333, 23 + xy: 3579, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ice-wall-tiny +block-ice-snow-large rotate: false - xy: 3118, 209 + 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-ice-wall-xlarge +block-ice-snow-xlarge rotate: false xy: 3757, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-xlarge +block-ice-tiny + rotate: false + xy: 2530, 167 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +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-illuminator-large - rotate: false - xy: 859, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-illuminator-medium - rotate: false - xy: 3269, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-illuminator-small - rotate: false - xy: 2359, 23 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-illuminator-tiny - rotate: false - xy: 3118, 191 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-illuminator-xlarge +block-ice-xlarge rotate: false xy: 3857, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-impact-reactor-large +block-illuminator-large rotate: false - xy: 901, 287 + xy: 2432, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-impact-reactor-medium +block-illuminator-medium rotate: false - xy: 3303, 303 + xy: 983, 51 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-impact-reactor-small +block-illuminator-small rotate: false - xy: 2385, 23 + xy: 3657, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-impact-reactor-tiny +block-illuminator-tiny rotate: false - xy: 3126, 227 + xy: 2530, 149 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-impact-reactor-xlarge +block-illuminator-xlarge rotate: false xy: 3907, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-incinerator-large +block-impact-reactor-large rotate: false - xy: 943, 329 + xy: 2516, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-incinerator-medium +block-impact-reactor-medium rotate: false - xy: 3337, 303 + xy: 983, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-incinerator-small +block-impact-reactor-small rotate: false - xy: 2411, 23 + xy: 3683, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-incinerator-tiny +block-impact-reactor-tiny rotate: false - xy: 3136, 209 + xy: 2548, 150 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-incinerator-xlarge +block-impact-reactor-xlarge rotate: false xy: 3957, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-inverted-sorter-large +block-incinerator-large rotate: false - xy: 859, 203 + xy: 2474, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-inverted-sorter-medium +block-incinerator-medium rotate: false - xy: 3371, 303 + xy: 2741, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-inverted-sorter-small +block-incinerator-small rotate: false - xy: 2699, 261 + xy: 1731, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-inverted-sorter-tiny +block-incinerator-tiny rotate: false - xy: 3136, 191 + xy: 2494, 131 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-inverted-sorter-xlarge +block-incinerator-xlarge rotate: false xy: 4007, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-item-source-large +block-inverted-sorter-large rotate: false - xy: 901, 245 + xy: 2558, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-item-source-medium +block-inverted-sorter-medium rotate: false - xy: 3405, 303 + xy: 2775, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-item-source-small +block-inverted-sorter-small rotate: false - xy: 2709, 235 + xy: 1757, 205 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-item-source-tiny +block-inverted-sorter-tiny rotate: false - xy: 3144, 227 + xy: 2512, 131 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-item-source-xlarge +block-inverted-sorter-xlarge rotate: false xy: 345, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-item-void-large +block-item-source-large rotate: false - xy: 943, 287 + xy: 2516, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-item-void-medium +block-item-source-medium rotate: false - xy: 3439, 303 + xy: 2809, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-item-void-small +block-item-source-small rotate: false - xy: 2709, 209 + xy: 1757, 96 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-item-void-tiny +block-item-source-tiny rotate: false - xy: 3154, 209 + xy: 2530, 131 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-item-void-xlarge +block-item-source-xlarge rotate: false xy: 395, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-junction-large +block-item-void-large rotate: false - xy: 985, 329 + xy: 2600, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-junction-medium +block-item-void-medium rotate: false - xy: 3165, 269 + xy: 2843, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-junction-small +block-item-void-small rotate: false - xy: 1650, 7 + xy: 1757, 70 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-junction-tiny +block-item-void-tiny rotate: false - xy: 3154, 191 + xy: 2548, 132 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-junction-xlarge +block-item-void-xlarge rotate: false xy: 445, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-kiln-large +block-junction-large rotate: false - xy: 901, 203 + xy: 2558, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-kiln-medium +block-junction-medium rotate: false - xy: 3199, 269 + xy: 2877, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-kiln-small +block-junction-small rotate: false - xy: 1676, 7 + xy: 1757, 44 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-kiln-tiny +block-junction-tiny rotate: false - xy: 3162, 227 + xy: 2566, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-kiln-xlarge +block-junction-xlarge rotate: false xy: 495, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-lancer-large +block-kiln-large rotate: false - xy: 943, 245 + xy: 2642, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-lancer-medium +block-kiln-medium rotate: false - xy: 3233, 269 + xy: 2911, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-lancer-small +block-kiln-small rotate: false - xy: 1709, 15 + xy: 3711, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-lancer-tiny +block-kiln-tiny rotate: false - xy: 3172, 209 + xy: 2584, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-lancer-xlarge +block-kiln-xlarge rotate: false xy: 545, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-large-logic-display-large +block-lancer-large rotate: false - xy: 985, 287 + xy: 2600, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-large-logic-display-medium +block-lancer-medium rotate: false - xy: 3267, 269 + xy: 2945, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-large-logic-display-small +block-lancer-small rotate: false - xy: 1735, 15 + xy: 3737, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-large-logic-display-tiny +block-lancer-tiny rotate: false - xy: 3172, 191 + xy: 2602, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-large-logic-display-xlarge +block-lancer-xlarge rotate: false xy: 595, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-laser-drill-large +block-large-logic-display-large rotate: false - xy: 1027, 329 + xy: 2684, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-laser-drill-medium +block-large-logic-display-medium rotate: false - xy: 3301, 269 + xy: 2979, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-laser-drill-small +block-large-logic-display-small rotate: false - xy: 1761, 15 + xy: 3763, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-laser-drill-tiny +block-large-logic-display-tiny rotate: false - xy: 3180, 227 + xy: 2620, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-laser-drill-xlarge +block-large-logic-display-xlarge rotate: false xy: 645, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-launch-pad-large +block-laser-drill-large rotate: false - xy: 943, 203 + xy: 2642, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-launch-pad-large-large +block-laser-drill-medium rotate: false - xy: 985, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 3335, 269 + xy: 3013, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-launch-pad-large-small +block-laser-drill-small rotate: false - xy: 1787, 15 + xy: 3789, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-launch-pad-large-tiny +block-laser-drill-tiny rotate: false - xy: 3190, 209 + xy: 1989, 11 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-launch-pad-large-xlarge +block-laser-drill-xlarge rotate: false xy: 695, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-launch-pad-medium +block-launch-pad-large rotate: false - xy: 3369, 269 + xy: 2726, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-large + rotate: false + 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-launch-pad-small +block-launch-pad-large-small rotate: false - xy: 1813, 15 + xy: 3815, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-launch-pad-tiny +block-launch-pad-large-tiny rotate: false - xy: 3190, 191 + xy: 2007, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-launch-pad-xlarge +block-launch-pad-large-xlarge rotate: false xy: 231, 96 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-junction-large +block-launch-pad-medium rotate: false - xy: 1027, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 3403, 269 + xy: 3081, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-junction-small +block-launch-pad-small rotate: false - xy: 1839, 15 + xy: 3841, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-junction-tiny +block-launch-pad-tiny rotate: false - xy: 3198, 227 + xy: 2025, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-junction-xlarge +block-launch-pad-xlarge rotate: false xy: 231, 46 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-router-large +block-liquid-junction-large rotate: false - xy: 1069, 329 + xy: 2768, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-router-medium +block-liquid-junction-medium rotate: false - xy: 3437, 269 + xy: 3115, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-router-small +block-liquid-junction-small rotate: false - xy: 1865, 15 + xy: 3867, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-router-tiny +block-liquid-junction-tiny rotate: false - xy: 3208, 209 + xy: 2043, 3 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-router-xlarge +block-liquid-junction-xlarge rotate: false xy: 745, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-source-large +block-liquid-router-large rotate: false - xy: 985, 203 + xy: 2726, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-source-medium +block-liquid-router-medium rotate: false - xy: 2607, 211 + xy: 3149, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-source-small +block-liquid-router-small rotate: false - xy: 1891, 15 + xy: 3893, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-source-tiny +block-liquid-router-tiny rotate: false - xy: 3208, 191 + xy: 3887, 312 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-source-xlarge +block-liquid-router-xlarge rotate: false xy: 281, 107 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-tank-large +block-liquid-source-large rotate: false - xy: 1027, 245 + xy: 2810, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-tank-medium +block-liquid-source-medium rotate: false - xy: 2641, 224 + xy: 3183, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-tank-small +block-liquid-source-small rotate: false - xy: 1917, 15 + xy: 3919, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-tank-tiny +block-liquid-source-tiny rotate: false - xy: 3216, 227 + xy: 3887, 294 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-tank-xlarge +block-liquid-source-xlarge rotate: false xy: 281, 57 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-void-large +block-liquid-tank-large rotate: false - xy: 1069, 287 + xy: 2768, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-void-medium +block-liquid-tank-medium rotate: false - xy: 2675, 224 + xy: 3217, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-void-small +block-liquid-tank-small rotate: false - xy: 1943, 15 + xy: 3945, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-void-tiny +block-liquid-tank-tiny rotate: false - xy: 3226, 209 + xy: 3887, 276 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-void-xlarge +block-liquid-tank-xlarge rotate: false xy: 795, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-logic-display-large +block-liquid-void-large rotate: false - xy: 1111, 329 + xy: 2852, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-logic-display-medium +block-liquid-void-medium rotate: false - xy: 4047, 305 + xy: 3251, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-logic-display-small +block-liquid-void-small rotate: false - xy: 1969, 15 + xy: 3971, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-logic-display-tiny +block-liquid-void-tiny rotate: false - xy: 3226, 191 + xy: 3905, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-logic-display-xlarge +block-liquid-void-xlarge rotate: false xy: 309, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-logic-processor-large +block-logic-display-large rotate: false - xy: 1027, 203 + xy: 2810, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-logic-processor-medium +block-logic-display-medium rotate: false - xy: 3477, 337 + xy: 3285, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-logic-processor-small +block-logic-display-small rotate: false - xy: 1995, 15 + xy: 3997, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-logic-processor-tiny +block-logic-display-tiny rotate: false - xy: 3234, 227 + xy: 3923, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-logic-processor-xlarge +block-logic-display-xlarge rotate: false xy: 309, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-magmarock-large +block-logic-processor-large rotate: false - xy: 1069, 245 + xy: 2894, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-magmarock-medium +block-logic-processor-medium rotate: false - xy: 3473, 303 + xy: 3319, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-magmarock-small +block-logic-processor-small rotate: false - xy: 2021, 15 + xy: 4023, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-magmarock-tiny +block-logic-processor-tiny rotate: false - xy: 3244, 209 + xy: 3941, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-magmarock-xlarge +block-logic-processor-xlarge rotate: false xy: 359, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mass-driver-large +block-magmarock-large rotate: false - xy: 1111, 287 + xy: 2852, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mass-driver-medium +block-magmarock-medium rotate: false - xy: 3471, 269 + xy: 3353, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mass-driver-small +block-magmarock-small rotate: false - xy: 2047, 15 + xy: 3709, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mass-driver-tiny +block-magmarock-tiny rotate: false - xy: 3244, 191 + xy: 3905, 287 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mass-driver-xlarge +block-magmarock-xlarge rotate: false xy: 309, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mechanical-drill-large +block-mass-driver-large rotate: false - xy: 1153, 329 + xy: 2936, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mechanical-drill-medium +block-mass-driver-medium rotate: false - xy: 3511, 343 + xy: 3387, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mechanical-drill-small +block-mass-driver-small rotate: false - xy: 2073, 15 + xy: 3735, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mechanical-drill-tiny +block-mass-driver-tiny rotate: false - xy: 3252, 227 + xy: 3923, 287 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mechanical-drill-xlarge +block-mass-driver-xlarge rotate: false xy: 359, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mechanical-pump-large +block-mechanical-drill-large rotate: false - xy: 1069, 203 + xy: 2894, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mechanical-pump-medium +block-mechanical-drill-medium rotate: false - xy: 918, 135 + xy: 1631, 222 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mechanical-pump-small +block-mechanical-drill-small rotate: false - xy: 2099, 15 + xy: 3761, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mechanical-pump-tiny +block-mechanical-drill-tiny rotate: false - xy: 3262, 209 + xy: 3941, 287 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mechanical-pump-xlarge +block-mechanical-drill-xlarge rotate: false xy: 409, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-meltdown-large +block-mechanical-pump-large rotate: false - xy: 1111, 245 + xy: 2978, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-meltdown-medium +block-mechanical-pump-medium rotate: false - xy: 917, 101 + xy: 1665, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-meltdown-small +block-mechanical-pump-small rotate: false - xy: 2125, 15 + xy: 3787, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-meltdown-tiny +block-mechanical-pump-tiny rotate: false - xy: 3262, 191 + xy: 3959, 295 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-meltdown-xlarge +block-mechanical-pump-xlarge rotate: false xy: 359, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-melter-large +block-meltdown-large rotate: false - xy: 1153, 287 + xy: 2936, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-melter-medium +block-meltdown-medium rotate: false - xy: 952, 135 + xy: 1699, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-melter-small +block-meltdown-small rotate: false - xy: 3511, 317 + xy: 3813, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-melter-tiny +block-meltdown-tiny rotate: false - xy: 3270, 227 + xy: 3977, 295 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-melter-xlarge +block-meltdown-xlarge rotate: false xy: 409, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-memory-cell-large +block-melter-large rotate: false - xy: 1195, 329 + xy: 3020, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-memory-cell-medium +block-melter-medium rotate: false - xy: 951, 101 + xy: 3421, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-memory-cell-small +block-melter-small rotate: false - xy: 3507, 291 + xy: 3839, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-memory-cell-tiny +block-melter-tiny rotate: false - xy: 3280, 209 + xy: 3959, 277 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-memory-cell-xlarge +block-melter-xlarge rotate: false xy: 459, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mend-projector-large +block-memory-bank-large rotate: false - xy: 1111, 203 + xy: 2978, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mend-projector-medium +block-memory-bank-medium rotate: false - xy: 986, 135 + xy: 3455, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mend-projector-small +block-memory-bank-small rotate: false - xy: 3505, 265 + xy: 3865, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mend-projector-tiny +block-memory-bank-tiny rotate: false - xy: 3280, 191 + xy: 3977, 277 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mend-projector-xlarge +block-memory-bank-xlarge rotate: false xy: 409, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mender-large +block-memory-cell-large rotate: false - xy: 1153, 245 + xy: 3062, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mender-medium +block-memory-cell-medium rotate: false - xy: 985, 101 + xy: 3421, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mender-small +block-memory-cell-small rotate: false - xy: 3537, 317 + xy: 3891, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mender-tiny +block-memory-cell-tiny rotate: false - xy: 3288, 227 + xy: 2471, 71 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mender-xlarge +block-memory-cell-xlarge rotate: false xy: 459, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-message-large +block-mend-projector-large rotate: false - xy: 1195, 287 + xy: 3020, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-message-medium +block-mend-projector-medium rotate: false - xy: 1020, 135 + xy: 3455, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-message-small +block-mend-projector-small rotate: false - xy: 3533, 291 + xy: 3917, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-message-tiny +block-mend-projector-tiny rotate: false - xy: 3298, 209 + xy: 2471, 53 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-message-xlarge +block-mend-projector-xlarge rotate: false xy: 509, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-2-large +block-mender-large rotate: false - xy: 1237, 329 + xy: 3104, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-2-medium +block-mender-medium rotate: false - xy: 1019, 101 + xy: 2555, 220 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-2-small +block-mender-small rotate: false - xy: 3531, 265 + xy: 3943, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-2-tiny +block-mender-tiny rotate: false - xy: 3298, 191 + xy: 2471, 35 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-2-xlarge +block-mender-xlarge rotate: false xy: 459, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-3-large +block-message-large rotate: false - xy: 1153, 203 + xy: 3062, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-3-medium +block-message-medium rotate: false - xy: 1054, 135 + xy: 2589, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-3-small +block-message-small rotate: false - xy: 3808, 304 + xy: 3969, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-3-tiny +block-message-tiny rotate: false - xy: 3306, 227 + xy: 2471, 17 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-3-xlarge +block-message-xlarge rotate: false xy: 509, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-5-large +block-metal-floor-2-large rotate: false - xy: 1195, 245 + xy: 3146, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-5-medium +block-metal-floor-2-medium rotate: false - xy: 1053, 101 + xy: 2471, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-5-small +block-metal-floor-2-small rotate: false - xy: 3834, 304 + xy: 3995, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-5-tiny +block-metal-floor-2-tiny rotate: false - xy: 3316, 209 + xy: 2548, 114 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-5-xlarge +block-metal-floor-2-xlarge rotate: false xy: 559, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-damaged-large +block-metal-floor-3-large rotate: false - xy: 1237, 287 + xy: 3104, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-damaged-medium +block-metal-floor-3-medium rotate: false - xy: 1088, 135 + xy: 2505, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-damaged-small +block-metal-floor-3-small rotate: false - xy: 3563, 337 + xy: 4021, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-damaged-tiny +block-metal-floor-3-tiny rotate: false - xy: 3316, 191 + xy: 2566, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-damaged-xlarge +block-metal-floor-3-xlarge rotate: false xy: 509, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-large +block-metal-floor-5-large rotate: false - xy: 1279, 329 + xy: 3188, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-medium +block-metal-floor-5-medium rotate: false - xy: 1087, 101 + xy: 3552, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-small +block-metal-floor-5-small rotate: false - xy: 3589, 337 + xy: 1760, 179 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-tiny +block-metal-floor-5-tiny rotate: false - xy: 3324, 227 + xy: 2584, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-xlarge +block-metal-floor-5-xlarge rotate: false xy: 559, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-micro-processor-large +block-metal-floor-damaged-large rotate: false - xy: 1195, 203 + xy: 3146, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-micro-processor-medium +block-metal-floor-damaged-medium rotate: false - xy: 1122, 135 + xy: 3587, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-micro-processor-small +block-metal-floor-damaged-small rotate: false - xy: 3615, 337 + xy: 1760, 153 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-micro-processor-tiny +block-metal-floor-damaged-tiny rotate: false - xy: 3334, 209 + xy: 2602, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-micro-processor-xlarge +block-metal-floor-damaged-xlarge rotate: false xy: 609, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-moss-large +block-metal-floor-large rotate: false - xy: 1237, 245 + xy: 3230, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-moss-medium +block-metal-floor-medium rotate: false - xy: 1121, 101 + xy: 3621, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-moss-small +block-metal-floor-small rotate: false - xy: 3641, 337 + xy: 1760, 127 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-moss-tiny +block-metal-floor-tiny rotate: false - xy: 3334, 191 + xy: 2620, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-moss-xlarge +block-metal-floor-xlarge rotate: false xy: 559, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mud-large +block-micro-processor-large rotate: false - xy: 1279, 287 + xy: 3188, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mud-medium +block-micro-processor-medium rotate: false - xy: 1156, 135 + xy: 3655, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mud-small +block-micro-processor-small rotate: false - xy: 3667, 337 + xy: 1786, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mud-tiny +block-micro-processor-tiny rotate: false - xy: 3342, 227 + xy: 2566, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mud-xlarge +block-micro-processor-xlarge rotate: false xy: 609, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multi-press-large +block-moss-large rotate: false - xy: 1321, 329 + xy: 3272, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multi-press-medium +block-moss-medium rotate: false - xy: 1155, 101 + xy: 3689, 217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multi-press-small +block-moss-small rotate: false - xy: 3563, 311 + xy: 1786, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multi-press-tiny +block-moss-tiny rotate: false - xy: 3352, 209 + xy: 2584, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multi-press-xlarge +block-moss-xlarge rotate: false xy: 659, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-large +block-mud-large rotate: false - xy: 1237, 203 + xy: 3230, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-medium +block-mud-medium rotate: false - xy: 1190, 135 + xy: 3723, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-small +block-mud-small rotate: false - xy: 3589, 311 + xy: 1812, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-tiny +block-mud-tiny rotate: false - xy: 3352, 191 + xy: 2602, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-xlarge +block-mud-xlarge rotate: false xy: 609, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-naval-factory-large +block-multi-press-large rotate: false - xy: 1279, 245 + xy: 3314, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-naval-factory-medium +block-multi-press-medium rotate: false - xy: 1189, 101 + xy: 3757, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-naval-factory-small +block-multi-press-small rotate: false - xy: 3615, 311 + xy: 1812, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-naval-factory-tiny +block-multi-press-tiny rotate: false - xy: 3360, 227 + xy: 2620, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-naval-factory-xlarge +block-multi-press-xlarge rotate: false xy: 659, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-oil-extractor-large +block-multiplicative-reconstructor-large rotate: false - xy: 1321, 287 + xy: 3272, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-oil-extractor-medium +block-multiplicative-reconstructor-medium rotate: false - xy: 1224, 135 + xy: 993, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-oil-extractor-small +block-multiplicative-reconstructor-small rotate: false - xy: 3641, 311 + xy: 1786, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-oil-extractor-tiny +block-multiplicative-reconstructor-tiny rotate: false - xy: 3370, 209 + xy: 2627, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-oil-extractor-xlarge +block-multiplicative-reconstructor-xlarge rotate: false xy: 709, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-coal-large +block-naval-factory-large rotate: false - xy: 1363, 329 + xy: 3356, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-coal-medium +block-naval-factory-medium rotate: false - xy: 1223, 101 + xy: 1027, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-coal-small +block-naval-factory-small rotate: false - xy: 3667, 311 + xy: 1838, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-coal-tiny +block-naval-factory-tiny rotate: false - xy: 3370, 191 + xy: 2627, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-coal-xlarge +block-naval-factory-xlarge rotate: false xy: 659, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-copper-large +block-oil-extractor-large rotate: false - xy: 1279, 203 + xy: 3314, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-copper-medium +block-oil-extractor-medium rotate: false - xy: 1258, 135 + xy: 1061, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-copper-small +block-oil-extractor-small rotate: false - xy: 3559, 285 + xy: 1838, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-copper-tiny +block-oil-extractor-tiny rotate: false - xy: 3378, 227 + xy: 2638, 136 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-copper-xlarge +block-oil-extractor-xlarge rotate: false xy: 709, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-lead-large +block-ore-coal-large rotate: false - xy: 1321, 245 + xy: 3398, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-lead-medium +block-ore-coal-medium rotate: false - xy: 1257, 101 + xy: 1095, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-lead-small +block-ore-coal-small rotate: false - xy: 3585, 285 + xy: 1812, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-lead-tiny +block-ore-coal-tiny rotate: false - xy: 3388, 209 + xy: 2638, 118 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-lead-xlarge +block-ore-coal-xlarge rotate: false xy: 709, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-scrap-large +block-ore-copper-large rotate: false - xy: 1363, 287 + xy: 3356, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-scrap-medium +block-ore-copper-medium rotate: false - xy: 1292, 135 + xy: 1129, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-scrap-small +block-ore-copper-small rotate: false - xy: 3611, 285 + xy: 1864, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-scrap-tiny +block-ore-copper-tiny rotate: false - xy: 3388, 191 + xy: 2638, 100 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-scrap-xlarge +block-ore-copper-xlarge rotate: false xy: 759, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-thorium-large +block-ore-lead-large rotate: false - xy: 1405, 329 + xy: 3440, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-thorium-medium +block-ore-lead-medium rotate: false - xy: 1291, 101 + xy: 1163, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-thorium-small +block-ore-lead-small rotate: false - xy: 3637, 285 + xy: 1864, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-thorium-tiny +block-ore-lead-tiny rotate: false - xy: 3396, 227 + xy: 2638, 82 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-thorium-xlarge +block-ore-lead-xlarge rotate: false xy: 759, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-titanium-large +block-ore-scrap-large rotate: false - xy: 1321, 203 + xy: 3398, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-titanium-medium +block-ore-scrap-medium rotate: false - xy: 1326, 135 + xy: 1197, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-titanium-small +block-ore-scrap-small rotate: false - xy: 3663, 285 + xy: 1838, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-titanium-tiny +block-ore-scrap-tiny rotate: false - xy: 3406, 209 + xy: 2480, 96 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-titanium-xlarge +block-ore-scrap-xlarge rotate: false xy: 759, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-dome-large +block-ore-thorium-large rotate: false - xy: 1363, 245 + xy: 3482, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-dome-medium +block-ore-thorium-medium rotate: false - xy: 1325, 101 + xy: 1231, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-dome-small +block-ore-thorium-small rotate: false - xy: 3557, 259 + xy: 1890, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-dome-tiny +block-ore-thorium-tiny rotate: false - xy: 3406, 191 + xy: 2489, 78 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-dome-xlarge +block-ore-thorium-xlarge rotate: false xy: 809, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-projector-large +block-ore-titanium-large rotate: false - xy: 1405, 287 + xy: 3440, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-projector-medium +block-ore-titanium-medium rotate: false - xy: 1360, 135 + xy: 1265, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-projector-small +block-ore-titanium-small rotate: false - xy: 3583, 259 + xy: 1890, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-projector-tiny +block-ore-titanium-tiny rotate: false - xy: 3414, 227 + xy: 2489, 60 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-projector-xlarge +block-ore-titanium-xlarge rotate: false xy: 809, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overflow-gate-large +block-overdrive-dome-large rotate: false - xy: 1447, 329 + xy: 3524, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overflow-gate-medium +block-overdrive-dome-medium rotate: false - xy: 1359, 101 + xy: 1299, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overflow-gate-small +block-overdrive-dome-small rotate: false - xy: 3609, 259 + xy: 1864, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overflow-gate-tiny +block-overdrive-dome-tiny rotate: false - xy: 3424, 209 + xy: 2489, 42 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overflow-gate-xlarge +block-overdrive-dome-xlarge rotate: false xy: 809, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-parallax-large +block-overdrive-projector-large rotate: false - xy: 1363, 203 + xy: 3482, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-parallax-medium +block-overdrive-projector-medium rotate: false - xy: 1394, 135 + xy: 1333, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-parallax-small +block-overdrive-projector-small rotate: false - xy: 3635, 259 + xy: 1916, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-parallax-tiny +block-overdrive-projector-tiny rotate: false - xy: 3424, 191 + xy: 2489, 24 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-parallax-xlarge +block-overdrive-projector-xlarge rotate: false xy: 809, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-conveyor-large +block-overflow-gate-large rotate: false - xy: 1405, 245 + xy: 3566, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-conveyor-medium +block-overflow-gate-medium rotate: false - xy: 1393, 101 + xy: 1367, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-conveyor-small +block-overflow-gate-small rotate: false - xy: 3661, 259 + xy: 1916, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-conveyor-tiny +block-overflow-gate-tiny rotate: false - xy: 3432, 227 + xy: 2498, 96 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-conveyor-xlarge +block-overflow-gate-xlarge rotate: false xy: 281, 7 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-router-large +block-parallax-large rotate: false - xy: 1447, 287 + xy: 3524, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-router-medium +block-parallax-medium rotate: false - xy: 1428, 135 + xy: 1401, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-router-small +block-parallax-small rotate: false - xy: 3693, 312 + xy: 1890, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-router-tiny +block-parallax-tiny rotate: false - xy: 3442, 209 + xy: 2507, 78 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-router-xlarge +block-parallax-xlarge rotate: false xy: 331, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pebbles-large +block-payload-conveyor-large rotate: false - xy: 1489, 329 + xy: 3608, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pebbles-medium +block-payload-conveyor-medium rotate: false - xy: 1427, 101 + xy: 1435, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pebbles-small +block-payload-conveyor-small rotate: false - xy: 2442, 75 + xy: 1942, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pebbles-tiny +block-payload-conveyor-tiny rotate: false - xy: 3442, 191 + xy: 2507, 60 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pebbles-xlarge +block-payload-conveyor-xlarge rotate: false xy: 331, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conduit-large +block-payload-router-large rotate: false - xy: 1405, 203 + xy: 3566, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conduit-medium +block-payload-router-medium rotate: false - xy: 1462, 135 + xy: 1469, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conduit-small +block-payload-router-small rotate: false - xy: 2437, 49 + xy: 1942, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conduit-tiny +block-payload-router-tiny rotate: false - xy: 3450, 227 + xy: 2507, 42 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conduit-xlarge +block-payload-router-xlarge rotate: false xy: 381, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conveyor-large +block-pebbles-large rotate: false - xy: 1447, 245 + xy: 3650, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conveyor-medium +block-pebbles-medium rotate: false - xy: 1461, 101 + xy: 1503, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conveyor-small +block-pebbles-small rotate: false - xy: 2437, 23 + xy: 1916, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conveyor-tiny +block-pebbles-tiny rotate: false - xy: 3460, 209 + xy: 2507, 24 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conveyor-xlarge +block-pebbles-xlarge rotate: false xy: 331, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-large +block-phase-conduit-large rotate: false - xy: 1489, 287 + xy: 3608, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-wall-large-large +block-phase-conduit-medium rotate: false - xy: 1531, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 1496, 135 + xy: 1537, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-wall-large-small +block-phase-conduit-small rotate: false - xy: 3854, 354 + xy: 1942, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-wall-large-tiny +block-phase-conduit-tiny rotate: false - xy: 3460, 191 + xy: 2516, 96 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-wall-large-xlarge +block-phase-conduit-xlarge rotate: false xy: 381, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-medium +block-phase-conveyor-large rotate: false - xy: 1495, 101 + 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-phase-wall-small +block-phase-conveyor-small rotate: false - xy: 3880, 356 + xy: 1968, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-wall-tiny +block-phase-conveyor-tiny rotate: false - xy: 3468, 227 + xy: 2525, 78 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-wall-xlarge +block-phase-conveyor-xlarge rotate: false xy: 431, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-weaver-large +block-phase-wall-large rotate: false - xy: 1447, 203 + xy: 959, 271 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-weaver-medium +block-phase-wall-large-large rotate: false - xy: 1530, 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-phase-weaver-small +block-phase-wall-large-small rotate: false - xy: 2463, 49 + xy: 1968, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-weaver-tiny +block-phase-wall-large-tiny rotate: false - xy: 3478, 209 + xy: 2525, 60 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-weaver-xlarge +block-phase-wall-large-xlarge rotate: false xy: 381, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pine-large +block-phase-wall-medium rotate: false - xy: 1489, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pine-medium - rotate: false - xy: 1529, 101 + xy: 1037, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pine-small +block-phase-wall-small rotate: false - xy: 2463, 23 + xy: 1994, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pine-tiny +block-phase-wall-tiny rotate: false - xy: 3478, 191 + xy: 2525, 42 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pine-xlarge +block-phase-wall-xlarge rotate: false xy: 431, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-compressor-large +block-phase-weaver-large rotate: false - xy: 1531, 287 + xy: 173, 4 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-compressor-medium +block-phase-weaver-medium rotate: false - xy: 1564, 135 + xy: 1071, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-compressor-small +block-phase-weaver-small rotate: false - xy: 3689, 285 + xy: 2020, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-compressor-tiny +block-phase-weaver-tiny rotate: false - xy: 3486, 227 + xy: 2525, 24 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-compressor-xlarge +block-phase-weaver-xlarge rotate: false xy: 481, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-conveyor-large +block-pine-large rotate: false - xy: 1573, 329 + xy: 215, 4 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-conveyor-medium +block-pine-medium rotate: false - xy: 1563, 101 + xy: 1105, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-conveyor-small +block-pine-small rotate: false - xy: 3687, 259 + xy: 2046, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-conveyor-tiny +block-pine-tiny rotate: false - xy: 3496, 209 + xy: 2534, 96 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-conveyor-xlarge +block-pine-xlarge rotate: false xy: 431, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-large +block-plastanium-compressor-large rotate: false - xy: 1489, 203 + xy: 3692, 335 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-wall-large-large +block-plastanium-compressor-medium rotate: false - xy: 1531, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 1598, 135 + xy: 1139, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-large-small +block-plastanium-compressor-small rotate: false - xy: 3906, 337 + xy: 2072, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-large-tiny +block-plastanium-compressor-tiny rotate: false - xy: 3496, 191 + xy: 2543, 78 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-large-xlarge +block-plastanium-compressor-xlarge rotate: false xy: 481, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-medium +block-plastanium-conveyor-large rotate: false - xy: 1597, 101 + xy: 909, 231 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-medium + rotate: false + xy: 1173, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-small +block-plastanium-conveyor-small rotate: false - xy: 3932, 337 + xy: 2098, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-tiny +block-plastanium-conveyor-tiny rotate: false - xy: 3504, 227 + xy: 2543, 60 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-xlarge +block-plastanium-conveyor-xlarge rotate: false xy: 531, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plated-conduit-large +block-plastanium-wall-large rotate: false - xy: 1573, 287 + xy: 951, 229 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plated-conduit-medium +block-plastanium-wall-large-large rotate: false - xy: 1632, 135 + 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-plated-conduit-small +block-plastanium-wall-large-small rotate: false - xy: 3880, 330 + xy: 2124, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plated-conduit-tiny +block-plastanium-wall-large-tiny rotate: false - xy: 3514, 209 + xy: 2543, 42 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plated-conduit-xlarge +block-plastanium-wall-large-xlarge rotate: false xy: 481, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pneumatic-drill-large +block-plastanium-wall-medium rotate: false - xy: 1615, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 1631, 101 + xy: 1241, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pneumatic-drill-small +block-plastanium-wall-small rotate: false - xy: 3906, 311 + xy: 2150, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pneumatic-drill-tiny +block-plastanium-wall-tiny rotate: false - xy: 3514, 191 + xy: 2543, 24 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pneumatic-drill-xlarge +block-plastanium-wall-xlarge rotate: false xy: 531, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-large +block-plated-conduit-large rotate: false - xy: 1531, 203 + xy: 944, 187 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-node-large-large +block-plated-conduit-medium rotate: false - xy: 1573, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 1666, 135 + xy: 1275, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-large-small +block-plated-conduit-small rotate: false - xy: 3932, 311 + xy: 2176, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-large-tiny +block-plated-conduit-tiny rotate: false - xy: 3522, 227 + xy: 2561, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-large-xlarge +block-plated-conduit-xlarge rotate: false xy: 581, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-medium +block-pneumatic-drill-large rotate: false - xy: 1665, 101 + xy: 1004, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pneumatic-drill-medium + rotate: false + xy: 1309, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-small +block-pneumatic-drill-small rotate: false - xy: 3958, 297 + xy: 2202, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-tiny +block-pneumatic-drill-tiny rotate: false - xy: 3532, 209 + xy: 2561, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-xlarge +block-pneumatic-drill-xlarge rotate: false xy: 531, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-source-large +block-power-node-large rotate: false - xy: 1615, 287 + xy: 1046, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-source-medium +block-power-node-large-large rotate: false - xy: 1700, 135 + 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-power-source-small +block-power-node-large-small rotate: false - xy: 3860, 304 + xy: 2228, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-source-tiny +block-power-node-large-tiny rotate: false - xy: 3532, 191 + xy: 2579, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-source-xlarge +block-power-node-large-xlarge rotate: false xy: 581, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-void-large +block-power-node-medium rotate: false - xy: 1657, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 1699, 101 + xy: 1377, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-void-small +block-power-node-small rotate: false - xy: 2732, 101 + xy: 2254, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-void-tiny +block-power-node-tiny rotate: false - xy: 3540, 227 + xy: 2561, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-void-xlarge +block-power-node-xlarge rotate: false xy: 631, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulse-conduit-large +block-power-source-large rotate: false - xy: 1573, 203 + xy: 1130, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulse-conduit-medium +block-power-source-medium rotate: false - xy: 1734, 135 + xy: 1411, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulse-conduit-small +block-power-source-small rotate: false - xy: 2732, 75 + xy: 2280, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulse-conduit-tiny +block-power-source-tiny rotate: false - xy: 3550, 209 + xy: 2579, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulse-conduit-xlarge +block-power-source-xlarge rotate: false xy: 581, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulverizer-large +block-power-void-large rotate: false - xy: 1615, 245 + xy: 1172, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulverizer-medium +block-power-void-medium rotate: false - xy: 1733, 101 + xy: 1445, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulverizer-small +block-power-void-small rotate: false - xy: 3715, 286 + xy: 2306, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulverizer-tiny +block-power-void-tiny rotate: false - xy: 3550, 191 + xy: 2597, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulverizer-xlarge +block-power-void-xlarge rotate: false xy: 631, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pyratite-mixer-large +block-pulse-conduit-large rotate: false - xy: 1657, 287 + xy: 1214, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pyratite-mixer-medium +block-pulse-conduit-medium rotate: false - xy: 1768, 135 + xy: 1479, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pyratite-mixer-small +block-pulse-conduit-small rotate: false - xy: 3741, 303 + xy: 1994, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pyratite-mixer-tiny +block-pulse-conduit-tiny rotate: false - xy: 3558, 227 + xy: 2561, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pyratite-mixer-xlarge +block-pulse-conduit-xlarge rotate: false xy: 681, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-repair-point-large +block-pulverizer-large rotate: false - xy: 1699, 329 + xy: 1256, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-repair-point-medium +block-pulverizer-medium rotate: false - xy: 1767, 101 + xy: 1513, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-repair-point-small +block-pulverizer-small rotate: false - xy: 3741, 277 + xy: 2020, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-repair-point-tiny +block-pulverizer-tiny rotate: false - xy: 3568, 209 + xy: 2579, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-repair-point-xlarge +block-pulverizer-xlarge rotate: false xy: 631, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-resupply-point-large +block-pyratite-mixer-large rotate: false - xy: 1615, 203 + xy: 1298, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-resupply-point-medium +block-pyratite-mixer-medium rotate: false - xy: 1802, 135 + xy: 1547, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-resupply-point-small +block-pyratite-mixer-small rotate: false - xy: 3767, 297 + xy: 2046, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-resupply-point-tiny +block-pyratite-mixer-tiny rotate: false - xy: 3568, 191 + xy: 2597, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-resupply-point-xlarge +block-pyratite-mixer-xlarge rotate: false xy: 681, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ripple-large +block-repair-point-large rotate: false - xy: 1657, 245 + xy: 1340, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ripple-medium +block-repair-point-medium rotate: false - xy: 1801, 101 + xy: 1581, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ripple-small +block-repair-point-small rotate: false - xy: 3767, 271 + xy: 2072, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ripple-tiny +block-repair-point-tiny rotate: false - xy: 3576, 227 + xy: 2615, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ripple-xlarge +block-repair-point-xlarge rotate: false xy: 731, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rotary-pump-large +block-resupply-point-large rotate: false - xy: 1699, 287 + xy: 1382, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rotary-pump-medium +block-resupply-point-medium rotate: false - xy: 1836, 135 + xy: 1017, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rotary-pump-small +block-resupply-point-small rotate: false - xy: 3793, 278 + xy: 2098, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rotary-pump-tiny +block-resupply-point-tiny rotate: false - xy: 3586, 209 + xy: 2579, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rotary-pump-xlarge +block-resupply-point-xlarge rotate: false xy: 681, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-router-large +block-ripple-large rotate: false - xy: 1741, 329 + xy: 1424, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-router-medium +block-ripple-medium rotate: false - xy: 1835, 101 + xy: 1017, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-router-small +block-ripple-small rotate: false - xy: 3819, 278 + xy: 2124, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-router-tiny +block-ripple-tiny rotate: false - xy: 3586, 191 + xy: 2597, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-router-xlarge +block-ripple-xlarge rotate: false xy: 731, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rtg-generator-large +block-rotary-pump-large rotate: false - xy: 1657, 203 + xy: 1466, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rtg-generator-medium +block-rotary-pump-medium rotate: false - xy: 1870, 135 + xy: 1051, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rtg-generator-small +block-rotary-pump-small rotate: false - xy: 3845, 278 + xy: 2150, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rtg-generator-tiny +block-rotary-pump-tiny rotate: false - xy: 3594, 227 + xy: 2615, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rtg-generator-xlarge +block-rotary-pump-xlarge rotate: false xy: 731, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salt-large +block-router-large rotate: false - xy: 1699, 245 + xy: 1508, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salt-medium +block-router-medium rotate: false - xy: 1869, 101 + xy: 1017, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salt-small +block-router-small rotate: false - xy: 3871, 278 + xy: 2176, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salt-tiny +block-router-tiny rotate: false - xy: 3604, 209 + xy: 2597, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salt-wall-large - rotate: false - xy: 1741, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-wall-medium - rotate: false - xy: 1904, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-wall-small - rotate: false - xy: 3715, 260 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-wall-tiny - rotate: false - xy: 3604, 191 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-wall-xlarge +block-router-xlarge rotate: false xy: 331, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salt-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-salvo-large +block-salt-large rotate: false - xy: 1783, 329 + xy: 1592, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salvo-medium +block-salt-medium rotate: false - xy: 1903, 101 + xy: 1085, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salvo-small +block-salt-small rotate: false - xy: 3741, 251 + xy: 2228, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salvo-tiny +block-salt-tiny rotate: false - xy: 3612, 227 + xy: 2615, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salvo-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-sand-boulder-large - rotate: false - xy: 1699, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-boulder-medium - rotate: false - xy: 1938, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 3767, 245 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 3622, 209 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge +block-salt-xlarge rotate: false xy: 481, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-large +block-salvo-large rotate: false - xy: 1741, 245 + xy: 1676, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-medium +block-salvo-medium rotate: false - xy: 1937, 101 + xy: 1051, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-small +block-salvo-small rotate: false - xy: 3793, 252 + xy: 2280, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-tiny +block-salvo-tiny rotate: false - xy: 3622, 191 + xy: 2633, 46 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-wall-large - rotate: false - xy: 1783, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-wall-medium - rotate: false - xy: 1972, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-wall-small - rotate: false - xy: 3819, 252 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-wall-tiny - rotate: false - xy: 3630, 227 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-wall-xlarge +block-salvo-xlarge rotate: false xy: 531, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-water-large +block-sand-boulder-large rotate: false - xy: 1825, 329 + xy: 1718, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-water-medium +block-sand-boulder-medium rotate: false - xy: 1971, 101 + xy: 1085, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-water-small +block-sand-boulder-small rotate: false - xy: 3845, 252 + xy: 2306, 125 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-water-tiny +block-sand-boulder-tiny rotate: false - xy: 3640, 209 + xy: 2633, 28 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-xlarge +block-sand-boulder-xlarge rotate: false xy: 581, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-xlarge +block-sand-large + rotate: false + xy: 1760, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-medium + rotate: false + xy: 1119, 143 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-small + rotate: false + xy: 2332, 124 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-tiny + rotate: false + xy: 2489, 6 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +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-scatter-large +block-sand-water-large rotate: false - xy: 1741, 203 + xy: 1844, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scatter-medium +block-sand-water-medium rotate: false - xy: 2006, 135 + xy: 1085, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scatter-small +block-sand-water-small rotate: false - xy: 3871, 252 + xy: 1812, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scatter-tiny +block-sand-water-tiny rotate: false - xy: 3640, 191 + xy: 2525, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scatter-xlarge +block-sand-water-xlarge rotate: false xy: 681, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scorch-large - rotate: false - xy: 1783, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scorch-medium - rotate: false - xy: 2005, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-small - rotate: false - xy: 3897, 285 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scorch-tiny - rotate: false - xy: 3648, 227 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scorch-xlarge +block-sand-xlarge rotate: false xy: 731, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-large +block-scatter-large rotate: false - xy: 1825, 287 + xy: 1886, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-medium +block-scatter-medium rotate: false - xy: 2040, 135 + xy: 1119, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-small +block-scatter-small rotate: false - xy: 3923, 285 + xy: 1838, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-tiny +block-scatter-tiny rotate: false - xy: 3658, 209 + xy: 2543, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-xlarge +block-scatter-xlarge rotate: false xy: 781, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-huge-large +block-scorch-large rotate: false - xy: 1867, 329 + xy: 1928, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-huge-medium +block-scorch-medium rotate: false - xy: 2039, 101 + xy: 1153, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-huge-small +block-scorch-small rotate: false - xy: 3897, 259 + xy: 1864, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-huge-tiny +block-scorch-tiny rotate: false - xy: 3658, 191 + xy: 2561, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-huge-xlarge +block-scorch-xlarge rotate: false xy: 781, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-large +block-scrap-wall-gigantic-large rotate: false - xy: 1783, 203 + xy: 1970, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-large-large +block-scrap-wall-gigantic-medium rotate: false - xy: 1825, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 2074, 135 + xy: 1085, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-large-small +block-scrap-wall-gigantic-small rotate: false - xy: 3923, 259 + xy: 1890, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-large-tiny +block-scrap-wall-gigantic-tiny rotate: false - xy: 3666, 227 + xy: 2579, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-large-xlarge +block-scrap-wall-gigantic-xlarge rotate: false xy: 781, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-medium +block-scrap-wall-huge-large rotate: false - xy: 2073, 101 + xy: 2012, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-medium + rotate: false + xy: 1119, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-small +block-scrap-wall-huge-small rotate: false - xy: 3949, 271 + xy: 1916, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-tiny +block-scrap-wall-huge-tiny rotate: false - xy: 3676, 209 + xy: 2597, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-xlarge +block-scrap-wall-huge-xlarge rotate: false xy: 831, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-segment-large +block-scrap-wall-large rotate: false - xy: 1867, 287 + xy: 2054, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-segment-medium +block-scrap-wall-large-large rotate: false - xy: 2108, 135 + 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-segment-small +block-scrap-wall-large-small rotate: false - xy: 3949, 245 + xy: 1942, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-segment-tiny +block-scrap-wall-large-tiny rotate: false - xy: 3676, 191 + xy: 2615, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-segment-xlarge +block-scrap-wall-large-xlarge rotate: false xy: 831, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-separator-large +block-scrap-wall-medium rotate: false - xy: 1909, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 2107, 101 + xy: 1187, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-separator-small +block-scrap-wall-small rotate: false - xy: 3975, 271 + xy: 1968, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-separator-tiny +block-scrap-wall-tiny rotate: false - xy: 3684, 227 + xy: 2633, 10 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-separator-xlarge +block-scrap-wall-xlarge rotate: false xy: 831, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-boulder-large +block-segment-large rotate: false - xy: 1825, 203 + xy: 2138, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-boulder-medium +block-segment-medium rotate: false - xy: 2142, 135 + xy: 1119, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-boulder-small +block-segment-small rotate: false - xy: 3975, 245 + xy: 1783, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-boulder-tiny +block-segment-tiny rotate: false - xy: 3694, 209 + xy: 2651, 64 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-boulder-xlarge +block-segment-xlarge rotate: false xy: 859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-large +block-separator-large rotate: false - xy: 1867, 245 + xy: 2180, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-medium +block-separator-medium rotate: false - xy: 2141, 101 + xy: 1153, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-small +block-separator-small rotate: false - xy: 3793, 226 + xy: 1783, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-tiny +block-separator-tiny rotate: false - xy: 3694, 191 + xy: 2651, 46 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-wall-large - rotate: false - xy: 1909, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-wall-medium - rotate: false - xy: 2176, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-wall-small - rotate: false - xy: 3819, 226 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-wall-tiny - rotate: false - xy: 3702, 227 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-wall-xlarge +block-separator-xlarge rotate: false xy: 909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-xlarge +block-shale-boulder-large + rotate: false + xy: 2222, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-boulder-medium + rotate: false + xy: 1187, 109 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-boulder-small + rotate: false + xy: 1809, 81 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-boulder-tiny + rotate: false + xy: 2651, 28 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-boulder-xlarge rotate: false xy: 959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shock-mine-large +block-shale-large rotate: false - xy: 1951, 329 + xy: 2264, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shock-mine-medium +block-shale-medium rotate: false - xy: 2175, 101 + xy: 1221, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shock-mine-small +block-shale-small rotate: false - xy: 3845, 226 + xy: 1809, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shock-mine-tiny +block-shale-tiny rotate: false - xy: 3712, 209 + xy: 2651, 10 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shock-mine-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-shrubs-large - rotate: false - xy: 1867, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 2210, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 3871, 226 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 3712, 191 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge +block-shale-xlarge rotate: false xy: 1059, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-crucible-large +block-shock-mine-large rotate: false - xy: 1909, 245 + xy: 2348, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-crucible-medium +block-shock-mine-medium rotate: false - xy: 2209, 101 + xy: 1187, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-crucible-small +block-shock-mine-small rotate: false - xy: 3897, 233 + xy: 1835, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-crucible-tiny +block-shock-mine-tiny rotate: false - xy: 3720, 227 + xy: 2627, 201 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-crucible-xlarge +block-shock-mine-xlarge rotate: false xy: 1109, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-smelter-large +block-shrubs-large rotate: false - xy: 1951, 287 + xy: 2390, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-smelter-medium +block-shrubs-medium rotate: false - xy: 2244, 135 + xy: 1221, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-smelter-small +block-shrubs-small rotate: false - xy: 3923, 233 + xy: 1861, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-smelter-tiny +block-shrubs-tiny rotate: false - xy: 3738, 233 + xy: 2645, 183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-smelter-xlarge +block-shrubs-xlarge rotate: false xy: 1159, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-slag-large +block-silicon-crucible-large rotate: false - xy: 1993, 329 + xy: 2432, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-slag-medium +block-silicon-crucible-medium rotate: false - xy: 2243, 101 + xy: 1255, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-slag-small +block-silicon-crucible-small rotate: false - xy: 3949, 219 + xy: 1861, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-slag-tiny +block-silicon-crucible-tiny rotate: false - xy: 3730, 209 + xy: 2645, 165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-slag-xlarge +block-silicon-crucible-xlarge rotate: false xy: 1209, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-boulder-large +block-silicon-smelter-large rotate: false - xy: 1909, 203 + xy: 2474, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snow-boulder-medium +block-silicon-smelter-medium rotate: false - xy: 2278, 135 + xy: 1187, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snow-boulder-small +block-silicon-smelter-small rotate: false - xy: 3975, 219 + xy: 1887, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-boulder-tiny +block-silicon-smelter-tiny rotate: false - xy: 3730, 191 + xy: 2663, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-boulder-xlarge +block-silicon-smelter-xlarge rotate: false xy: 1259, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-large +block-slag-large rotate: false - xy: 1951, 245 + xy: 2516, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snow-medium +block-slag-medium rotate: false - xy: 2277, 101 + xy: 1221, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snow-pine-large +block-slag-small rotate: false - xy: 1993, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 2312, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 4001, 287 + xy: 1887, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-pine-tiny +block-slag-tiny rotate: false - xy: 2448, 124 + xy: 2681, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-pine-xlarge +block-slag-xlarge rotate: false xy: 1309, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-small +block-snow-boulder-large rotate: false - xy: 4001, 261 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 2447, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-wall-large - rotate: false - xy: 2035, 329 + xy: 2558, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snow-wall-medium +block-snow-boulder-medium rotate: false - xy: 2311, 101 + xy: 1255, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snow-wall-small +block-snow-boulder-small rotate: false - xy: 4001, 235 + xy: 1913, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-wall-tiny +block-snow-boulder-tiny rotate: false - xy: 2466, 131 + xy: 2663, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-wall-xlarge +block-snow-boulder-xlarge rotate: false xy: 1359, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-xlarge +block-snow-large + rotate: false + xy: 2600, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-medium + rotate: false + xy: 1289, 143 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-large + rotate: false + 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-snow-pine-tiny + rotate: false + xy: 2699, 193 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-pine-xlarge rotate: false xy: 1409, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-large +block-snow-small rotate: false - xy: 1951, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 1993, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 2346, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 4001, 209 + xy: 1939, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-solar-panel-large-tiny +block-snow-tiny rotate: false - xy: 2484, 131 + xy: 2681, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-solar-panel-large-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-solar-panel-medium - rotate: false - xy: 2345, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 3897, 207 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 2466, 113 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge +block-snow-xlarge rotate: false xy: 1509, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sorter-large +block-solar-panel-large rotate: false - xy: 2035, 287 + xy: 2726, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sorter-medium +block-solar-panel-large-large rotate: false - xy: 2380, 135 + 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-sorter-small +block-solar-panel-large-small rotate: false - xy: 3923, 207 + xy: 1965, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sorter-tiny +block-solar-panel-large-tiny rotate: false - xy: 2484, 113 + xy: 2699, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sorter-xlarge +block-solar-panel-large-xlarge rotate: false xy: 1559, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spawn-large +block-solar-panel-medium rotate: false - xy: 2077, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 2379, 101 + xy: 1323, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spawn-small +block-solar-panel-small rotate: false - xy: 3949, 193 + xy: 1965, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spawn-tiny +block-solar-panel-tiny rotate: false - xy: 2963, 162 + xy: 2717, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spawn-xlarge +block-solar-panel-xlarge rotate: false xy: 1609, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spectre-large +block-sorter-large rotate: false - xy: 1993, 203 + xy: 2810, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spectre-medium +block-sorter-medium rotate: false - xy: 2400, 169 + xy: 1255, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spectre-small +block-sorter-small rotate: false - xy: 3975, 193 + xy: 1994, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spectre-tiny +block-sorter-tiny rotate: false - xy: 2468, 95 + xy: 2663, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spectre-xlarge +block-sorter-xlarge rotate: false xy: 1659, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-cluster-large +block-space-large rotate: false - xy: 2035, 245 + xy: 2852, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-cluster-medium +block-space-medium rotate: false - xy: 2414, 135 + xy: 1289, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-cluster-small +block-space-small rotate: false - xy: 4001, 183 + xy: 2020, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-cluster-tiny +block-space-tiny rotate: false - xy: 2468, 77 + xy: 2681, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-cluster-xlarge +block-space-xlarge rotate: false xy: 1709, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-moss-large +block-spawn-large rotate: false - xy: 2077, 287 + xy: 2894, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-moss-medium +block-spawn-medium rotate: false - xy: 2413, 101 + xy: 1323, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-moss-small +block-spawn-small rotate: false - xy: 4027, 279 + xy: 2046, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-moss-tiny +block-spawn-tiny rotate: false - xy: 2486, 95 + xy: 2699, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-moss-xlarge +block-spawn-xlarge rotate: false xy: 1759, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-pine-large +block-spectre-large rotate: false - xy: 2119, 329 + xy: 2936, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-pine-medium +block-spectre-medium rotate: false - xy: 2641, 190 + xy: 1357, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-pine-small +block-spectre-small rotate: false - xy: 4027, 253 + xy: 2072, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-pine-tiny +block-spectre-tiny rotate: false - xy: 2486, 77 + xy: 2717, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-pine-xlarge +block-spectre-xlarge rotate: false xy: 1809, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-press-large +block-spore-cluster-large rotate: false - xy: 2035, 203 + xy: 2978, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-press-medium +block-spore-cluster-medium rotate: false - xy: 2675, 190 + xy: 1289, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-press-small +block-spore-cluster-small rotate: false - xy: 4053, 279 + xy: 2098, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-press-tiny +block-spore-cluster-tiny rotate: false - xy: 2504, 99 + xy: 2735, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-press-xlarge +block-spore-cluster-xlarge rotate: false xy: 1859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-wall-large +block-spore-moss-large rotate: false - xy: 2077, 245 + xy: 3020, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-wall-medium +block-spore-moss-medium rotate: false - xy: 2434, 180 + xy: 1323, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-wall-small +block-spore-moss-small rotate: false - xy: 4027, 227 + xy: 2124, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-wall-tiny +block-spore-moss-tiny rotate: false - xy: 2504, 81 + xy: 2753, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-wall-xlarge +block-spore-moss-xlarge rotate: false xy: 1909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-steam-generator-large +block-spore-pine-large rotate: false - xy: 2119, 287 + xy: 3062, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-steam-generator-medium +block-spore-pine-medium rotate: false - xy: 2468, 183 + xy: 1357, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-steam-generator-small +block-spore-pine-small rotate: false - xy: 4053, 253 + xy: 2150, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-steam-generator-tiny +block-spore-pine-tiny rotate: false - xy: 2489, 59 + xy: 2771, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-steam-generator-xlarge +block-spore-pine-xlarge rotate: false xy: 1959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-stone-large +block-spore-press-large rotate: false - xy: 2161, 329 + xy: 3104, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-stone-medium +block-spore-press-medium rotate: false - xy: 2502, 185 + xy: 1391, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-stone-small +block-spore-press-small rotate: false - xy: 4027, 201 + xy: 2176, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-stone-tiny +block-spore-press-tiny rotate: false - xy: 2489, 41 + xy: 2789, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-stone-wall-large - rotate: false - xy: 2077, 203 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-wall-medium - rotate: false - xy: 2536, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-wall-small - rotate: false - xy: 4053, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-wall-tiny - rotate: false - xy: 2489, 23 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-wall-xlarge +block-spore-press-xlarge rotate: false xy: 2009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-stone-xlarge +block-spore-wall-large + rotate: false + xy: 3146, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-wall-medium + rotate: false + xy: 1323, 41 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-wall-small + rotate: false + xy: 2202, 99 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-wall-tiny + rotate: false + xy: 2807, 172 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-wall-xlarge rotate: false xy: 2059, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-tower-large +block-steam-generator-large rotate: false - xy: 2119, 245 + xy: 3188, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-tower-medium +block-steam-generator-medium rotate: false - xy: 2570, 177 + xy: 1357, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-tower-small +block-steam-generator-small rotate: false - xy: 4053, 201 + xy: 2228, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-tower-tiny +block-steam-generator-tiny rotate: false - xy: 2507, 63 + xy: 2825, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-tower-xlarge +block-steam-generator-xlarge rotate: false xy: 2109, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-large +block-stone-large rotate: false - xy: 2161, 287 + xy: 3230, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-large +block-stone-medium rotate: false - xy: 2203, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 2604, 177 + xy: 1391, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-large-small +block-stone-small rotate: false - xy: 4027, 175 + xy: 2254, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-large-tiny +block-stone-tiny rotate: false - xy: 2507, 45 + xy: 2843, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-large-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-surge-wall-medium - rotate: false - xy: 2502, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 4053, 175 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 2507, 27 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge +block-stone-xlarge rotate: false xy: 2209, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-swarmer-large +block-surge-tower-large rotate: false - xy: 2119, 203 + xy: 3314, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-swarmer-medium +block-surge-tower-medium rotate: false - xy: 2468, 149 + xy: 1357, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-swarmer-small +block-surge-tower-small rotate: false - xy: 2725, 262 + xy: 2306, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-swarmer-tiny +block-surge-tower-tiny rotate: false - xy: 2499, 5 + xy: 2879, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-swarmer-xlarge +block-surge-tower-xlarge rotate: false xy: 2259, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-switch-large +block-surge-wall-large rotate: false - xy: 2161, 245 + xy: 3356, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-switch-medium +block-surge-wall-large-large rotate: false - xy: 2536, 143 + 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-switch-small +block-surge-wall-large-small rotate: false - xy: 2751, 262 + xy: 2332, 98 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-switch-tiny +block-surge-wall-large-tiny rotate: false - xy: 2758, 62 + xy: 2897, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-switch-xlarge +block-surge-wall-large-xlarge rotate: false xy: 2309, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tainted-water-large +block-surge-wall-medium rotate: false - xy: 2203, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 2570, 143 + xy: 1425, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tainted-water-small +block-surge-wall-small rotate: false - xy: 2735, 236 + xy: 1991, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tainted-water-tiny +block-surge-wall-tiny rotate: false - xy: 2776, 59 + xy: 2915, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tainted-water-xlarge +block-surge-wall-xlarge rotate: false xy: 2359, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tar-large +block-swarmer-large rotate: false - xy: 2245, 329 + xy: 3440, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tar-medium +block-swarmer-medium rotate: false - xy: 2604, 143 + xy: 1459, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tar-small +block-swarmer-small rotate: false - xy: 2735, 210 + xy: 2017, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tar-tiny +block-swarmer-tiny rotate: false - xy: 2794, 59 + xy: 2933, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tar-xlarge +block-swarmer-xlarge rotate: false xy: 2409, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tendrils-large +block-switch-large rotate: false - xy: 2161, 203 + xy: 3482, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tendrils-medium +block-switch-medium rotate: false - xy: 2638, 156 + xy: 1391, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tendrils-small +block-switch-small rotate: false - xy: 2761, 236 + xy: 2043, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tendrils-tiny +block-switch-tiny rotate: false - xy: 2945, 144 + xy: 2951, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tendrils-xlarge +block-switch-xlarge rotate: false xy: 2459, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tetrative-reconstructor-large +block-tainted-water-large rotate: false - xy: 2203, 245 + xy: 3524, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tetrative-reconstructor-medium +block-tainted-water-medium rotate: false - xy: 2672, 156 + xy: 1425, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tetrative-reconstructor-small +block-tainted-water-small rotate: false - xy: 2761, 210 + xy: 2069, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tetrative-reconstructor-tiny +block-tainted-water-tiny rotate: false - xy: 2963, 144 + xy: 2969, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tetrative-reconstructor-xlarge +block-tainted-water-xlarge rotate: false xy: 2509, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-generator-large +block-tar-large rotate: false - xy: 2245, 287 + xy: 3566, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-generator-medium +block-tar-medium rotate: false - xy: 2638, 122 + xy: 1459, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-generator-small +block-tar-small rotate: false - xy: 2735, 184 + xy: 2095, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-generator-tiny +block-tar-tiny rotate: false - xy: 2867, 128 + xy: 2987, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-generator-xlarge +block-tar-xlarge rotate: false xy: 2559, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-pump-large +block-tendrils-large rotate: false - xy: 2287, 329 + xy: 3608, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-pump-medium +block-tendrils-medium rotate: false - xy: 2672, 122 + xy: 1493, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-pump-small +block-tendrils-small rotate: false - xy: 2735, 158 + xy: 2121, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-pump-tiny +block-tendrils-tiny rotate: false - xy: 2885, 139 + xy: 3005, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-pump-xlarge +block-tendrils-xlarge rotate: false xy: 2609, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-reactor-large +block-tetrative-reconstructor-large rotate: false - xy: 2203, 203 + xy: 3650, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-reactor-medium +block-tetrative-reconstructor-medium rotate: false - xy: 2502, 117 + xy: 1425, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-reactor-small +block-tetrative-reconstructor-small rotate: false - xy: 2761, 184 + xy: 2147, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-reactor-tiny +block-tetrative-reconstructor-tiny rotate: false - xy: 2903, 139 + xy: 3023, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-reactor-xlarge +block-tetrative-reconstructor-xlarge rotate: false xy: 2659, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-large +block-thermal-generator-large rotate: false - xy: 2245, 245 + xy: 3692, 293 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-large +block-thermal-generator-medium rotate: false - xy: 2287, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 2536, 109 + xy: 1459, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-large-small +block-thermal-generator-small rotate: false - xy: 2735, 132 + xy: 2173, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-large-tiny +block-thermal-generator-tiny rotate: false - xy: 2921, 139 + xy: 3041, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-large-xlarge +block-thermal-generator-xlarge rotate: false xy: 2709, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-medium +block-thermal-pump-large rotate: false - xy: 2570, 109 + xy: 3734, 323 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-pump-medium + rotate: false + xy: 1493, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-small +block-thermal-pump-small rotate: false - xy: 2761, 158 + xy: 2199, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-tiny +block-thermal-pump-tiny rotate: false - xy: 2885, 121 + xy: 3059, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-xlarge +block-thermal-pump-xlarge rotate: false xy: 2759, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thruster-large +block-thorium-reactor-large rotate: false - xy: 2329, 329 + xy: 3734, 281 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thruster-medium +block-thorium-reactor-medium rotate: false - xy: 2604, 109 + xy: 1527, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thruster-small +block-thorium-reactor-small rotate: false - xy: 2761, 132 + xy: 2225, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thruster-tiny +block-thorium-reactor-tiny rotate: false - xy: 2903, 121 + xy: 3077, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thruster-xlarge +block-thorium-reactor-xlarge rotate: false xy: 2809, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-conveyor-large +block-thorium-wall-large rotate: false - xy: 2245, 203 + xy: 3692, 251 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-conveyor-medium +block-thorium-wall-large-large rotate: false - xy: 2638, 88 + 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-titanium-conveyor-small +block-thorium-wall-large-small rotate: false - xy: 2758, 106 + xy: 2251, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-conveyor-tiny +block-thorium-wall-large-tiny rotate: false - xy: 2921, 121 + xy: 3095, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-conveyor-xlarge +block-thorium-wall-large-xlarge rotate: false xy: 2859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-large +block-thorium-wall-medium rotate: false - xy: 2287, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-large - rotate: false - xy: 2329, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 2672, 88 + xy: 1493, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-large-small +block-thorium-wall-small rotate: false - xy: 2758, 80 + xy: 2277, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-large-tiny +block-thorium-wall-tiny rotate: false - xy: 2939, 126 + xy: 3113, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-large-xlarge +block-thorium-wall-xlarge rotate: false xy: 2909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-medium +block-thruster-large rotate: false - xy: 3709, 338 + xy: 1001, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thruster-medium + rotate: false + xy: 1527, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-small +block-thruster-small rotate: false - xy: 2787, 253 + xy: 2303, 73 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-tiny +block-thruster-tiny rotate: false - xy: 2957, 126 + xy: 3131, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-xlarge +block-thruster-xlarge rotate: false xy: 2959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-underflow-gate-large +block-titanium-conveyor-large rotate: false - xy: 2371, 329 + xy: 1043, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-underflow-gate-medium +block-titanium-conveyor-medium rotate: false - xy: 3743, 329 + xy: 1561, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-underflow-gate-small +block-titanium-conveyor-small rotate: false - xy: 2813, 253 + xy: 2329, 72 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-underflow-gate-tiny +block-titanium-conveyor-tiny rotate: false - xy: 2975, 126 + xy: 3149, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-underflow-gate-xlarge +block-titanium-conveyor-xlarge rotate: false xy: 3009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-unloader-large +block-titanium-wall-large rotate: false - xy: 2287, 203 + xy: 1085, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-unloader-medium +block-titanium-wall-large-large rotate: false - xy: 917, 67 + 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-unloader-small +block-titanium-wall-large-small rotate: false - xy: 2787, 227 + xy: 1991, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-unloader-tiny +block-titanium-wall-large-tiny rotate: false - xy: 2939, 108 + xy: 3167, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-unloader-xlarge +block-titanium-wall-large-xlarge rotate: false xy: 3059, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-vault-large +block-titanium-wall-medium rotate: false - xy: 2329, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-vault-medium - rotate: false - xy: 951, 67 + xy: 1527, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-vault-small +block-titanium-wall-small rotate: false - xy: 2839, 253 + xy: 2017, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-vault-tiny +block-titanium-wall-tiny rotate: false - xy: 2957, 108 + xy: 3185, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-vault-xlarge +block-titanium-wall-xlarge rotate: false xy: 3109, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-extractor-large +block-tsunami-large rotate: false - xy: 2371, 287 + xy: 1169, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-extractor-medium +block-tsunami-medium rotate: false - xy: 985, 67 + xy: 1561, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-extractor-small +block-tsunami-small rotate: false - xy: 2787, 201 + xy: 2043, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-extractor-tiny +block-tsunami-tiny rotate: false - xy: 2975, 108 + xy: 3203, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-extractor-xlarge +block-tsunami-xlarge rotate: false xy: 3159, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-large +block-underflow-gate-large rotate: false - xy: 2413, 329 + xy: 1211, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-medium +block-underflow-gate-medium rotate: false - xy: 1019, 67 + xy: 1527, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-small +block-underflow-gate-small rotate: false - xy: 2813, 227 + xy: 2069, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-tiny +block-underflow-gate-tiny rotate: false - xy: 2522, 91 + xy: 3221, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-xlarge +block-underflow-gate-xlarge rotate: false xy: 3209, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wave-large +block-unloader-large rotate: false - xy: 2329, 203 + xy: 1253, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-wave-medium +block-unloader-medium rotate: false - xy: 1053, 67 + xy: 1561, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-wave-small +block-unloader-small rotate: false - xy: 2865, 253 + xy: 2095, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-wave-tiny +block-unloader-tiny rotate: false - xy: 2540, 91 + xy: 3239, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-wave-xlarge +block-unloader-xlarge rotate: false xy: 3259, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-dead-large +block-vault-large rotate: false - xy: 2371, 245 + xy: 1295, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-dead-medium +block-vault-medium rotate: false - xy: 1087, 67 + xy: 1561, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-dead-small +block-vault-small rotate: false - xy: 2787, 175 + xy: 2121, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-dead-tiny +block-vault-tiny rotate: false - xy: 2558, 91 + xy: 3257, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-dead-xlarge +block-vault-xlarge rotate: false xy: 3309, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-large +block-water-extractor-large rotate: false - xy: 2413, 287 + xy: 1337, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-medium +block-water-extractor-medium rotate: false - xy: 1121, 67 + xy: 1017, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-small +block-water-extractor-small rotate: false - xy: 2787, 149 + xy: 2147, 47 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-tiny +block-water-extractor-tiny rotate: false - xy: 2576, 91 + xy: 3275, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-xlarge +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: 2943, 342 + xy: 2989, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18800,7 +21187,7 @@ button-right-disabled index: -1 button-edge-over-4 rotate: false - xy: 2791, 342 + xy: 4059, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18808,7 +21195,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 2623, 258 + xy: 4059, 281 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18816,7 +21203,7 @@ button-over index: -1 button-red rotate: false - xy: 2791, 313 + xy: 4059, 252 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18824,7 +21211,7 @@ button-red index: -1 button-right rotate: false - xy: 2829, 313 + xy: 2799, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18832,7 +21219,7 @@ button-right index: -1 button-right-down rotate: false - xy: 2829, 342 + xy: 2723, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18840,7 +21227,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 2661, 258 + xy: 2761, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18848,7 +21235,7 @@ button-right-over index: -1 button-select rotate: false - xy: 2813, 201 + xy: 2277, 47 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -18856,7 +21243,7 @@ button-select index: -1 button-square rotate: false - xy: 2905, 342 + xy: 2913, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18864,7 +21251,7 @@ button-square index: -1 button-square-down rotate: false - xy: 2867, 342 + xy: 2837, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18872,7 +21259,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 2867, 313 + xy: 2875, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18880,7 +21267,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 2905, 313 + xy: 2951, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18888,42 +21275,42 @@ button-trans index: -1 check-disabled rotate: false - xy: 1155, 67 + xy: 1187, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1189, 67 + xy: 1221, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1223, 67 + xy: 1255, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1257, 67 + xy: 1289, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1291, 67 + xy: 1323, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1325, 67 + xy: 1357, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18937,14 +21324,14 @@ clear index: -1 crater rotate: false - xy: 2448, 160 + xy: 1789, 1 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 cursor rotate: false - xy: 3491, 371 + xy: 2003, 247 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -18958,7 +21345,7 @@ discord-banner index: -1 flat-down-base rotate: false - xy: 2943, 313 + xy: 3027, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18973,7 +21360,7 @@ info-banner index: -1 inventory rotate: false - xy: 2839, 211 + xy: 3835, 271 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -18981,147 +21368,147 @@ inventory index: -1 item-blast-compound-icon rotate: false - xy: 1359, 67 + xy: 1391, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-icon rotate: false - xy: 1393, 67 + xy: 1425, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-icon rotate: false - xy: 1427, 67 + xy: 1459, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-icon rotate: false - xy: 1461, 67 + xy: 1493, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-icon rotate: false - xy: 1495, 67 + xy: 1527, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-icon rotate: false - xy: 1529, 67 + xy: 1561, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-icon rotate: false - xy: 1563, 67 + xy: 1595, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-icon rotate: false - xy: 1597, 67 + xy: 1595, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-icon rotate: false - xy: 1631, 67 + xy: 1595, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-icon rotate: false - xy: 1665, 67 + xy: 1595, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-icon rotate: false - xy: 1699, 67 + xy: 1595, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-icon rotate: false - xy: 1733, 67 + xy: 1615, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-icon rotate: false - xy: 1767, 67 + xy: 1629, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-icon rotate: false - xy: 1801, 67 + xy: 1629, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-icon rotate: false - xy: 1835, 67 + xy: 1629, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-icon rotate: false - xy: 1869, 67 + xy: 1629, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-icon rotate: false - xy: 1903, 67 + xy: 1629, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-icon rotate: false - xy: 1937, 67 + xy: 1649, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-icon rotate: false - xy: 1971, 67 + xy: 1663, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-icon rotate: false - xy: 2005, 67 + xy: 1663, 111 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-node rotate: false - xy: 2039, 67 + xy: 1663, 77 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19142,7 +21529,7 @@ nomap index: -1 pane rotate: false - xy: 2981, 313 + xy: 3103, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19150,7 +21537,7 @@ pane index: -1 pane-2 rotate: false - xy: 2981, 342 + xy: 3065, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19158,7 +21545,7 @@ pane-2 index: -1 scroll rotate: false - xy: 2865, 216 + xy: 2303, 36 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -19166,7 +21553,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 901, 177 + xy: 3407, 261 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -19174,70 +21561,70 @@ 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: 2813, 159 + xy: 3861, 271 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 2615, 31 + xy: 3995, 271 size: 12, 40 orig: 12, 40 offset: 0, 0 index: -1 selection rotate: false - xy: 309, 354 + xy: 1001, 310 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 2522, 81 + xy: 3689, 277 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 3777, 323 + xy: 3489, 197 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1528, 27 + xy: 3520, 197 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1559, 27 + xy: 3489, 157 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 2699, 258 + xy: 309, 354 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 underline rotate: false - xy: 3095, 342 + xy: 3293, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19245,7 +21632,7 @@ underline index: -1 underline-2 rotate: false - xy: 3019, 342 + xy: 3141, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19253,7 +21640,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 3019, 313 + xy: 3179, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19261,7 +21648,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 3057, 342 + xy: 3217, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19269,7 +21656,7 @@ underline-red index: -1 underline-white rotate: false - xy: 3057, 313 + xy: 3255, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19277,35 +21664,35 @@ underline-white index: -1 unit-alpha-large rotate: false - xy: 2455, 329 + xy: 1547, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-alpha-medium rotate: false - xy: 2073, 67 + xy: 1663, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-alpha-small rotate: false - xy: 2891, 253 + xy: 2329, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-alpha-tiny rotate: false - xy: 2594, 91 + xy: 3365, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-alpha-xlarge rotate: false - xy: 3409, 413 + xy: 3609, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -19319,681 +21706,751 @@ unit-antumbra-large index: -1 unit-antumbra-medium rotate: false - xy: 1590, 33 + xy: 3776, 271 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 unit-antumbra-small rotate: false - xy: 2969, 201 + xy: 257, 20 size: 21, 24 orig: 21, 24 offset: 0, 0 index: -1 unit-antumbra-tiny rotate: false - xy: 3693, 345 + xy: 2623, 219 size: 14, 16 orig: 14, 16 offset: 0, 0 index: -1 unit-antumbra-xlarge rotate: false - xy: 3809, 330 + xy: 959, 363 size: 43, 48 orig: 43, 48 offset: 0, 0 index: -1 unit-arkyid-large rotate: false - xy: 2371, 203 + xy: 1589, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-arkyid-medium rotate: false - xy: 2107, 67 + xy: 1663, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-arkyid-small rotate: false - xy: 2839, 185 + xy: 2358, 110 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-arkyid-tiny rotate: false - xy: 2612, 91 + xy: 3383, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-arkyid-xlarge rotate: false - xy: 3459, 413 + xy: 3659, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-atrax-large rotate: false - xy: 2413, 256 + xy: 1631, 256 size: 40, 29 orig: 40, 29 offset: 0, 0 index: -1 unit-atrax-medium rotate: false - xy: 2141, 76 + xy: 1683, 186 size: 32, 23 orig: 32, 23 offset: 0, 0 index: -1 unit-atrax-small rotate: false - xy: 2709, 190 + xy: 1731, 25 size: 24, 17 orig: 24, 17 offset: 0, 0 index: -1 unit-atrax-tiny rotate: false - xy: 2623, 245 + xy: 2723, 245 size: 16, 11 orig: 16, 11 offset: 0, 0 index: -1 unit-atrax-xlarge rotate: false - xy: 3509, 427 + xy: 3709, 427 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 unit-beta-large rotate: false - xy: 2455, 287 - 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: 916, 33 - 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: 2865, 190 - 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: 2525, 73 - 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: 3559, 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: 2497, 329 + xy: 1715, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-bryde-medium rotate: false - xy: 950, 33 + xy: 3791, 205 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-bryde-small rotate: false - xy: 2917, 253 + xy: 2355, 59 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-bryde-tiny rotate: false - xy: 2525, 55 + xy: 3401, 172 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-bryde-xlarge rotate: false - xy: 3609, 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: 2413, 214 + xy: 1799, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-crawler-medium rotate: false - xy: 984, 33 + xy: 3825, 329 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-crawler-small rotate: false - xy: 2891, 227 + xy: 2355, 33 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-crawler-tiny rotate: false - xy: 2543, 73 + xy: 2735, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-crawler-xlarge rotate: false - xy: 3659, 413 + xy: 3909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-large rotate: false - xy: 2455, 245 + xy: 1841, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-dagger-medium rotate: false - xy: 1018, 33 + xy: 1697, 152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-dagger-small rotate: false - xy: 2839, 159 + xy: 2329, 20 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-dagger-tiny rotate: false - xy: 2525, 37 + xy: 2753, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-dagger-xlarge rotate: false - xy: 3709, 413 + xy: 3959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eclipse-large rotate: false - xy: 2497, 287 + xy: 1883, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-eclipse-medium rotate: false - xy: 1052, 33 + xy: 1697, 118 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-eclipse-small rotate: false - xy: 2865, 164 + xy: 2355, 7 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-eclipse-tiny rotate: false - xy: 2543, 55 + xy: 2771, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-eclipse-xlarge rotate: false - xy: 3759, 413 + xy: 4009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-flare-large rotate: false - xy: 2539, 329 + xy: 1925, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-flare-medium rotate: false - xy: 1086, 33 + xy: 1697, 84 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-flare-small rotate: false - xy: 2943, 253 + xy: 2384, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-flare-tiny rotate: false - xy: 2561, 73 + xy: 2789, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-flare-xlarge rotate: false - xy: 3809, 413 + xy: 3859, 380 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-fortress-large rotate: false - xy: 2497, 253 + xy: 1967, 253 size: 40, 32 orig: 40, 32 offset: 0, 0 index: -1 unit-fortress-medium rotate: false - xy: 916, 6 + xy: 1697, 57 size: 32, 25 orig: 32, 25 offset: 0, 0 index: -1 unit-fortress-small rotate: false - xy: 3854, 333 + xy: 1757, 23 size: 24, 19 orig: 24, 19 offset: 0, 0 index: -1 unit-fortress-tiny rotate: false - xy: 1702, 1 + xy: 2476, 125 size: 16, 12 orig: 16, 12 offset: 0, 0 index: -1 unit-fortress-xlarge rotate: false - xy: 3859, 423 + xy: 3909, 373 size: 48, 38 orig: 48, 38 offset: 0, 0 index: -1 unit-gamma-large rotate: false - xy: 2539, 287 + xy: 2009, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-gamma-medium rotate: false - xy: 1120, 33 + xy: 1697, 23 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-gamma-small rotate: false - xy: 2891, 201 + xy: 1783, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-gamma-tiny rotate: false - xy: 2543, 37 + xy: 2807, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-gamma-xlarge rotate: false - xy: 3909, 413 + xy: 3959, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-horizon-large rotate: false - xy: 2581, 329 + xy: 2051, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-horizon-medium rotate: false - xy: 1154, 33 + xy: 3586, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-horizon-small rotate: false - xy: 2917, 227 + xy: 2410, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-horizon-tiny rotate: false - xy: 2561, 55 + xy: 2825, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-horizon-xlarge rotate: false - xy: 3959, 413 + xy: 4009, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mace-large rotate: false - xy: 2581, 287 + xy: 2093, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mace-medium rotate: false - xy: 1188, 33 + xy: 3620, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mace-small rotate: false - xy: 2969, 253 + xy: 1809, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mace-tiny rotate: false - xy: 2579, 73 + xy: 2843, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mace-xlarge rotate: false - xy: 4009, 413 + xy: 3709, 377 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mega-large rotate: false - xy: 2623, 329 + xy: 2135, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mega-medium rotate: false - xy: 1222, 33 + xy: 3654, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mega-small rotate: false - xy: 2891, 175 + xy: 2436, 99 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mega-tiny rotate: false - xy: 2561, 37 + xy: 2861, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mega-xlarge rotate: false - xy: 3509, 377 + xy: 3759, 365 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-minke-large rotate: false - xy: 881, 93 + xy: 3481, 245 size: 34, 40 orig: 34, 40 offset: 0, 0 index: -1 unit-minke-medium rotate: false - xy: 1680, 33 + xy: 3806, 271 size: 27, 32 orig: 27, 32 offset: 0, 0 index: -1 unit-minke-small rotate: false - xy: 3719, 312 + xy: 309, 178 size: 20, 24 orig: 20, 24 offset: 0, 0 index: -1 unit-minke-tiny rotate: false - xy: 3793, 305 + xy: 4044, 253 size: 13, 16 orig: 13, 16 offset: 0, 0 index: -1 unit-minke-xlarge rotate: false - xy: 4004, 313 + 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: 1256, 33 + xy: 3688, 183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mono-small rotate: false - xy: 2917, 201 + xy: 1835, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mono-tiny rotate: false - xy: 2579, 55 + xy: 2879, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mono-xlarge rotate: false - xy: 3559, 363 + 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: 1290, 33 + xy: 3722, 171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-nova-small rotate: false - xy: 2943, 227 + xy: 1861, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-nova-tiny rotate: false - xy: 2597, 73 + xy: 2897, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-nova-xlarge rotate: false - xy: 3609, 363 + 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: 1620, 25 + xy: 3520, 155 size: 28, 40 orig: 28, 40 offset: 0, 0 index: -1 unit-omura-medium rotate: false - xy: 257, 12 + xy: 1733, 211 size: 22, 32 orig: 22, 32 offset: 0, 0 index: -1 unit-omura-small rotate: false - xy: 2517, 1 + xy: 2933, 146 size: 16, 24 orig: 16, 24 offset: 0, 0 index: -1 unit-omura-tiny rotate: false - xy: 1413, 15 + xy: 4084, 156 size: 11, 16 orig: 11, 16 offset: 0, 0 index: -1 unit-omura-xlarge rotate: false - xy: 881, 43 + 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: 1324, 33 + xy: 3790, 171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-poly-small rotate: false - xy: 2995, 253 + xy: 1913, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-poly-tiny rotate: false - xy: 2579, 37 + xy: 2951, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-poly-xlarge rotate: false - xy: 3659, 363 + xy: 3959, 313 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-pulsar-large rotate: false - xy: 2707, 336 - 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: 1358, 39 - 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: 2151, 3 - size: 24, 19 - orig: 24, 19 + xy: 1763, 1 + size: 24, 20 + orig: 24, 20 offset: 0, 0 index: -1 unit-pulsar-tiny @@ -20005,133 +22462,168 @@ unit-pulsar-tiny index: -1 unit-pulsar-xlarge rotate: false - xy: 3709, 372 - 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: 2707, 294 + xy: 2429, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-quasar-medium rotate: false - xy: 1392, 33 + xy: 2343, 188 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-quasar-small rotate: false - xy: 2917, 175 + xy: 1965, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-quasar-tiny rotate: false - xy: 2597, 55 + xy: 2969, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-quasar-xlarge rotate: false - xy: 3759, 363 + xy: 859, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-reign-large rotate: false - xy: 2455, 217 + xy: 1757, 231 size: 40, 26 orig: 40, 26 offset: 0, 0 index: -1 unit-reign-medium rotate: false - xy: 2175, 79 + xy: 1730, 1 size: 31, 20 orig: 31, 20 offset: 0, 0 index: -1 unit-reign-small rotate: false - xy: 2203, 6 + 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: 3809, 380 + xy: 859, 330 size: 48, 31 orig: 48, 31 offset: 0, 0 index: -1 unit-risso-large rotate: false - xy: 881, 135 + xy: 3444, 245 size: 35, 40 orig: 35, 40 offset: 0, 0 index: -1 unit-risso-medium rotate: false - xy: 1650, 33 + xy: 3551, 177 size: 28, 32 orig: 28, 32 offset: 0, 0 index: -1 unit-risso-small rotate: false - xy: 2995, 227 + xy: 2447, 219 size: 21, 24 orig: 21, 24 offset: 0, 0 index: -1 unit-risso-tiny rotate: false - xy: 4081, 321 + xy: 2539, 227 size: 14, 16 orig: 14, 16 offset: 0, 0 index: -1 unit-risso-xlarge rotate: false - xy: 3959, 323 + xy: 959, 313 size: 43, 48 orig: 43, 48 offset: 0, 0 index: -1 unit-scepter-large rotate: false - xy: 2497, 219 + xy: 2471, 253 size: 40, 32 orig: 40, 32 offset: 0, 0 index: -1 unit-scepter-medium rotate: false - xy: 1426, 39 + xy: 2379, 217 size: 32, 26 orig: 32, 26 offset: 0, 0 index: -1 unit-scepter-small rotate: false - xy: 2943, 206 + xy: 2017, 26 size: 24, 19 orig: 24, 19 offset: 0, 0 @@ -20145,84 +22637,84 @@ unit-scepter-tiny index: -1 unit-scepter-xlarge rotate: false - xy: 3859, 382 + xy: 859, 289 size: 48, 39 orig: 48, 39 offset: 0, 0 index: -1 unit-sei-large rotate: false - xy: 2539, 245 + xy: 2513, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-sei-medium rotate: false - xy: 1460, 33 + xy: 2413, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-sei-small rotate: false - xy: 2969, 227 + xy: 2043, 21 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-sei-tiny rotate: false - xy: 2597, 37 + xy: 2987, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-sei-xlarge rotate: false - xy: 3909, 363 + 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: 950, 6 + xy: 3776, 305 size: 31, 25 orig: 31, 25 offset: 0, 0 index: -1 unit-spiroct-small rotate: false - xy: 3021, 258 + xy: 2069, 26 size: 24, 19 orig: 24, 19 offset: 0, 0 index: -1 unit-spiroct-tiny rotate: false - xy: 1720, 1 + xy: 3692, 382 size: 15, 12 orig: 15, 12 offset: 0, 0 index: -1 unit-spiroct-xlarge rotate: false - xy: 3959, 373 + xy: 909, 323 size: 48, 38 orig: 48, 38 offset: 0, 0 index: -1 unit-toxopid-large rotate: false - xy: 881, 1 + xy: 3552, 245 size: 33, 40 orig: 33, 40 offset: 0, 0 @@ -20236,63 +22728,98 @@ 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: 3984, 305 + xy: 899, 1 size: 13, 16 orig: 13, 16 offset: 0, 0 index: -1 unit-toxopid-xlarge rotate: false - xy: 2749, 288 + 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: 2581, 245 + xy: 2681, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-zenith-medium rotate: false - xy: 1494, 33 + xy: 2411, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-zenith-small rotate: false - xy: 2943, 180 + xy: 2121, 21 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-zenith-tiny rotate: false - xy: 2615, 73 + xy: 3005, 154 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-zenith-xlarge rotate: false - xy: 4009, 363 + xy: 909, 273 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 wavepane rotate: false - xy: 3095, 313 + xy: 3331, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -20300,7 +22827,7 @@ wavepane index: -1 white-pane rotate: false - xy: 3133, 342 + xy: 3369, 258 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -20308,14 +22835,14 @@ white-pane index: -1 whiteui rotate: false - xy: 4004, 368 + xy: 821, 416 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 2706, 127 + 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 a369939f63..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 3138a194d8..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 6e90118bff..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 6db7b1ace7..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 9ab5d1be50..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 2ffaff7756..37ba22d3cb 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -63,7 +63,7 @@ public class Vars implements Loadable{ /** 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 */ @@ -82,20 +82,24 @@ public class Vars implements Loadable{ 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"), @@ -180,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 cb34095a3c..269b79d3bf 100644 --- a/core/src/mindustry/ai/BaseRegistry.java +++ b/core/src/mindustry/ai/BaseRegistry.java @@ -3,13 +3,13 @@ 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.*; @@ -17,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); @@ -33,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){ diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index a7cf9b2cca..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.*; @@ -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 ObjectSet(); + damagedTiles[entity.team.id] = new ObjectSet<>(); } damagedTiles[entity.team.id].add(entity); diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index cc9762ba01..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,16 +42,18 @@ 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 @@ -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 417909a92b..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); 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 0988657adf..9636d97036 100644 --- a/core/src/mindustry/ai/formations/patterns/CircleFormation.java +++ b/core/src/mindustry/ai/formations/patterns/CircleFormation.java @@ -15,7 +15,7 @@ public class CircleFormation extends FormationPattern{ 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 7a8adbbc44..8e8c74f986 100644 --- a/core/src/mindustry/ai/types/BuilderAI.java +++ b/core/src/mindustry/ai/types/BuilderAI.java @@ -1,7 +1,7 @@ package mindustry.ai.types; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.Teams.*; @@ -12,18 +12,22 @@ import mindustry.world.blocks.ConstructBlock.*; import static mindustry.Vars.*; public class BuilderAI extends AIController{ - float buildRadius = 700; + 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); if(following != null){ @@ -67,13 +71,11 @@ public class BuilderAI extends AIController{ Units.nearby(unit.team, unit.x, unit.y, buildRadius, u -> { if(found) return; - if(u instanceof Builderc && u != unit && ((Builderc)u).activelyBuilding()){ - Builderc b = (Builderc)u; + 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){ - ConstructBuild cons = (ConstructBuild)build; + if(build instanceof ConstructBuild cons){ float dist = Math.min(cons.dst(unit) - buildingRange, 0); //make sure you can reach the request in time @@ -87,8 +89,8 @@ public class BuilderAI extends AIController{ } //find new request - if(!unit.team().data().blocks.isEmpty() && following == null && timer.get(timerTarget3, 60 * 2f)){ - 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 @@ -97,13 +99,29 @@ 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(); blocks.addLast(block); } } - } } + + @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 2f01bb984a..0758f9016a 100644 --- a/core/src/mindustry/ai/types/FlyingAI.java +++ b/core/src/mindustry/ai/types/FlyingAI.java @@ -16,7 +16,7 @@ public class FlyingAI extends AIController{ moveTo(target, unit.range() * 0.8f); unit.lookAt(target); }else{ - attack(80f); + attack(100f); } } @@ -25,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); } } diff --git a/core/src/mindustry/ai/types/FormationAI.java b/core/src/mindustry/ai/types/FormationAI.java index 4201fb3486..cbe12a565e 100644 --- a/core/src/mindustry/ai/types/FormationAI.java +++ b/core/src/mindustry/ai/types/FormationAI.java @@ -1,7 +1,8 @@ package mindustry.ai.types; +import arc.math.*; import arc.math.geom.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.ai.formations.*; import mindustry.entities.units.*; import mindustry.gen.*; @@ -32,6 +33,10 @@ public class FormationAI extends AIController implements FormationMember{ return; } + 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)); @@ -64,10 +69,6 @@ public class FormationAI extends AIController implements FormationMember{ @Override public float formationSize(){ - if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){ - //TODO return formation size - //eturn ((Commanderc)unit).formation(). - } return unit.hitSize * 1f; } diff --git a/core/src/mindustry/ai/types/GroundAI.java b/core/src/mindustry/ai/types/GroundAI.java index 74e8893ed5..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); } } @@ -51,7 +51,6 @@ public class GroundAI extends AIController{ if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type().rotateShooting){ if(unit.type().hasWeapons()){ - //TODO certain units should not look at the target, e.g. ships unit.lookAt(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); } }else if(unit.moving()){ @@ -73,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 f635c9e543..a03481768f 100644 --- a/core/src/mindustry/ai/types/MinerAI.java +++ b/core/src/mindustry/ai/types/MinerAI.java @@ -17,9 +17,7 @@ public class MinerAI extends AIController{ protected void updateMovement(){ 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); @@ -44,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); diff --git a/core/src/mindustry/ai/types/RepairAI.java b/core/src/mindustry/ai/types/RepairAI.java index 136cbc821b..5f021ae828 100644 --- a/core/src/mindustry/ai/types/RepairAI.java +++ b/core/src/mindustry/ai/types/RepairAI.java @@ -2,25 +2,33 @@ package mindustry.ai.types; import mindustry.entities.*; import mindustry.entities.units.*; +import mindustry.gen.*; import mindustry.world.blocks.ConstructBlock.*; -//note that repair AI doesn't attack anything even if it theoretically can public class RepairAI extends AIController{ @Override protected void updateMovement(){ - boolean shoot = false; + if(target instanceof Building){ + boolean shoot = false; - if(target != null){ - if(!target.within(unit, unit.type().range * 0.8f)){ - moveTo(target, unit.type().range * 0.8f); - }else{ + if(target.within(unit, unit.type().range)){ unit.aim(target); shoot = true; } + + unit.controlWeapons(shoot); + }else if(target == null){ + unit.controlWeapons(false); } - unit.controlWeapons(shoot); + if(target != null){ + if(!target.within(unit, unit.type().range * 0.65f)){ + moveTo(target, unit.type().range * 0.65f); + } + + unit.lookAt(target); + } } @Override @@ -28,5 +36,10 @@ public class RepairAI extends AIController{ 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 388c87f272..2eae6e409f 100644 --- a/core/src/mindustry/ai/types/SuicideAI.java +++ b/core/src/mindustry/ai/types/SuicideAI.java @@ -6,6 +6,8 @@ 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{ @@ -14,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; } @@ -24,9 +26,9 @@ 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)); @@ -35,39 +37,49 @@ public class SuicideAI extends GroundAI{ 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(!moveToTarget){ 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); } }else if(command() == UnitCommand.attack && core != null){ - moveTo(Pathfinder.fieldCore); + pathfind(Pathfinder.fieldCore); } if(unit.moving()) unit.lookAt(unit.vel().angle()); @@ -75,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 05c2665baf..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,47 +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(); - int bits = grounded ? ground.maskBits : flying.maskBits; + //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.body.getFixtureList().any() && ref.body.getFixtureList().first().getFilterData().categoryBits != bits){ - //set correct filter - ref.body.getFixtureList().first().setFilterData(grounded ? ground : flying); - } - - 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(); } } @@ -85,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 @@ -115,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); } } @@ -129,7 +95,6 @@ public class PhysicsProcess implements AsyncProcess{ public void reset(){ if(physics != null){ refs.clear(); - physics.dispose(); physics = null; } } @@ -138,17 +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{ public Physicsc entity; - public Body body; - public Vec2 lastPosition = new Vec2(), delta = new Vec2(), velocity = new Vec2(), lastVelocity = new Vec2(), position = new Vec2(); + 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 cb1edfa242..0000000000 --- a/core/src/mindustry/async/TeamIndexProcess.java +++ /dev/null @@ -1,96 +0,0 @@ -package mindustry.async; - -import arc.math.geom.*; -import mindustry.*; -import mindustry.game.*; -import mindustry.gen.*; -import mindustry.type.*; -import mindustry.world.blocks.payloads.*; - -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; - } - - private void count(Unit unit){ - updateCount(unit.team, unit.type(), 1); - if(!unit.deactivated) updateActiveCount(unit.team, unit.type(), 1); - - if(unit instanceof Payloadc){ - ((Payloadc)unit).payloads().each(p -> { - if(p instanceof UnitPayload){ - count(((UnitPayload)p).unit); - } - }); - } - } - - @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); - - count(unit); - } - } - - @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 350cc8cc15..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,7 +35,7 @@ public class Blocks implements ContentList{ public static Block //environment - air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, + 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, @@ -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, largeLogicDisplay, 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"); @@ -242,7 +255,7 @@ public class Blocks implements ContentList{ blendGroup = basalt; emitLight = true; - lightRadius = 60f; + lightRadius = 50f; lightColor = Color.orange.cpy().a(0.3f); }}; @@ -265,7 +278,7 @@ public class Blocks implements ContentList{ variants = 3; status = StatusEffects.muddy; statusDuration = 30f; - attributes.set(Attribute.water, 2f); + attributes.set(Attribute.water, 1f); cacheLayer = CacheLayer.mud; albedo = 0.35f; }}; @@ -282,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); }}; @@ -316,6 +329,7 @@ public class Blocks implements ContentList{ snowBoulder = new Boulder("snow-boulder"){{ variants = 2; + snow.asFloor().decoration = ice.asFloor().decoration = iceSnow.asFloor().decoration = this; }}; dirtWall = new StaticWall("dirt-wall"){{ @@ -588,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; @@ -688,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"){{ @@ -712,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"){{ @@ -751,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; @@ -815,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; }}; @@ -864,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(); }}; @@ -940,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"){{ @@ -979,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"){{ @@ -1112,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"){{ @@ -1141,13 +1156,14 @@ public class Blocks implements ContentList{ powerProduction = 1.8f; generateEffect = Fx.redgeneratespark; size = 2; + floating = true; }}; 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.07f); + consumes.liquid(Liquids.water, 0.1f); hasLiquids = true; size = 2; }}; @@ -1267,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; @@ -1279,7 +1295,7 @@ public class Blocks implements ContentList{ hasPower = true; hasItems = true; - consumes.power(0.80f); + consumes.power(0.9f); consumes.liquid(Liquids.water, 0.2f); }}; @@ -1320,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"){{ @@ -1353,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 @@ -1377,7 +1396,7 @@ public class Blocks implements ContentList{ ammoUseEffect = Fx.shellEjectSmall; health = 250; inaccuracy = 2f; - rotatespeed = 10f; + rotateSpeed = 10f; }}; scatter = new ItemTurret("scatter"){{ @@ -1395,7 +1414,7 @@ public class Blocks implements ContentList{ targetGround = false; recoilAmount = 2f; - rotatespeed = 15f; + rotateSpeed = 15f; inaccuracy = 17f; shootCone = 35f; @@ -1498,8 +1517,8 @@ public class Blocks implements ContentList{ }}; reloadTime = 35f; shootCone = 40f; - rotatespeed = 8f; - powerUse = 4f; + rotateSpeed = 8f; + powerUse = 3f; targetAir = false; range = 90f; shootEffect = Fx.lightningShoot; @@ -1515,10 +1534,10 @@ public class Blocks implements ContentList{ hasPower = true; size = 2; - force = 4.5f; + force = 5f; scaledForce = 5.5f; - range = 110f; - damage = 0.1f; + range = 160f; + damage = 0.4f; health = 160 * size * size; rotateSpeed = 10; @@ -1572,13 +1591,37 @@ public class Blocks implements ContentList{ requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phasefabric, 40)); health = 250 * size * size; - range = 140f; + range = 160f; hasPower = true; - consumes.power(8f); + consumes.powerCond(8f, (PointDefenseBuild b) -> b.target != null); size = 2; shootLength = 5f; bulletDamage = 25f; - reloadTime = 10f; + 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"){{ @@ -1597,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; }}); @@ -1647,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; @@ -1655,6 +1700,48 @@ 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, 900, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250)); ammo( @@ -1677,7 +1764,7 @@ 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); }}; @@ -1692,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; @@ -1722,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 * 45f, with(Items.silicon, 20, Items.metaglass, 35)), - }; + 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"){{ @@ -1760,14 +1847,14 @@ 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"){{ @@ -1779,14 +1866,14 @@ public class Blocks implements ContentList{ 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"){{ @@ -1800,12 +1887,14 @@ public class Blocks implements ContentList{ constructTime = 60f * 60f * 1.5f; liquidCapacity = 60f; - upgrades = new UnitType[][]{ - {UnitTypes.zenith, UnitTypes.antumbra}, - {UnitTypes.spiroct, UnitTypes.arkyid}, - {UnitTypes.fortress, UnitTypes.scepter}, - {UnitTypes.bryde, UnitTypes.sei}, - }; + 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"){{ @@ -1819,12 +1908,14 @@ public class Blocks implements ContentList{ constructTime = 60f * 60f * 4; liquidCapacity = 180f; - upgrades = new UnitType[][]{ - {UnitTypes.antumbra, UnitTypes.eclipse}, - {UnitTypes.arkyid, UnitTypes.toxopid}, - {UnitTypes.scepter, UnitTypes.reign}, - {UnitTypes.sei, UnitTypes.omura} - }; + 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"){{ @@ -1957,11 +2048,18 @@ public class Blocks implements ContentList{ }}; memoryCell = new MemoryBlock("memory-cell"){{ - requirements(Category.logic, with(Items.graphite, 40, Items.silicon, 40)); + 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.lead, 100, Items.silicon, 50, Items.metaglass, 50)); diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index 9e454576a7..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; @@ -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){ @@ -474,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 21f6d98ee3..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 @@ -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()); @@ -1019,28 +1148,11 @@ public class Fx{ }), railHit = new Effect(18f, 200f, e -> { - if(true){ - color(Pal.orangeSpark); + color(Pal.orangeSpark); - for(int i : Mathf.signs){ - Drawf.tri(e.x, e.y, 10f * e.fout(), 60f, e.rotation + 140f * i); - } - }else{ - e.scaled(7f, b -> { - color(Color.white, Color.lightGray, b.fin()); - stroke(b.fout() * 2f + 0.2f); - Lines.circle(b.x, b.y, b.fin() * 28f); - }); - - color(Pal.orangeSpark); - float rot = e.rotation + Mathf.randomSeedRange(e.id, 20f); - float w = 9f * e.fout(); - - Drawf.tri(e.x, e.y, w, 100f, rot); - Drawf.tri(e.x, e.y, w, 10f, rot + 180f); + for(int i : Mathf.signs){ + Drawf.tri(e.x, e.y, 10f * e.fout(), 60f, e.rotation + 140f * i); } - - }), lancerLaserShoot = new Effect(21f, e -> { @@ -1054,7 +1166,7 @@ public class Fx{ lancerLaserShootSmoke = new Effect(26f, e -> { color(Color.white); - float length = e.data == null || !(e.data instanceof Float) ? 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); @@ -1229,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) -> { 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 582a661226..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, muddy, 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; @@ -72,7 +81,7 @@ public class StatusEffects implements ContentList{ melting = new StatusEffect("melting"){{ speedMultiplier = 0.8f; - armorMultiplier = 0.8f; + healthMultiplier = 0.8f; damage = 0.3f; effect = Fx.melting; @@ -84,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; }}; @@ -106,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; @@ -123,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 2abe1ce799..e9aa178388 100644 --- a/core/src/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -2,7 +2,7 @@ package mindustry.content; import arc.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.ctype.*; import mindustry.game.Objectives.*; import mindustry.type.*; @@ -15,6 +15,7 @@ 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; @@ -109,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, () -> { @@ -211,7 +213,9 @@ public class TechTree implements ContentList{ }); node(memoryCell, () -> { + node(memoryBank, () -> { + }); }); }); @@ -224,6 +228,9 @@ public class TechTree implements ContentList{ }); }); }); + + node(illuminator, () -> { + }); }); }); @@ -263,7 +270,7 @@ public class TechTree implements ContentList{ node(steamGenerator, () -> { node(thermalGenerator, () -> { node(differentialGenerator, () -> { - node(thoriumReactor, () -> { + node(thoriumReactor, Seq.with(new Research(Liquids.cryofluid)), () -> { node(impactReactor, () -> { }); @@ -342,11 +349,17 @@ public class TechTree implements ContentList{ }); }); + + node(tsunami, () -> { + + }); }); node(lancer, () -> { - node(meltdown, () -> { + node(foreshadow, () -> { + node(meltdown, () -> { + }); }); node(shockMine, () -> { @@ -376,7 +389,11 @@ public class TechTree implements ContentList{ node(nova, () -> { node(pulsar, () -> { node(quasar, () -> { + node(vela, () -> { + node(corvus, () -> { + }); + }); }); }); }); @@ -409,7 +426,11 @@ public class TechTree implements ContentList{ node(mono, () -> { node(poly, () -> { node(mega, () -> { + node(quad, () -> { + node(oct, () -> { + }); + }); }); }); }); @@ -524,35 +545,46 @@ public class TechTree implements ContentList{ } public static void setup(){ - TechNode.context = null; + context = null; map = new ObjectMap<>(); all = new Seq<>(); } - public static TechNode node(UnlockableContent content, Runnable children){ + //all the "node" methods are hidden, because they are for internal context-dependent use only + //for custom research, just use the TechNode constructor + + static TechNode node(UnlockableContent content, Runnable children){ return node(content, content.researchRequirements(), children); } - public static TechNode node(UnlockableContent content, ItemStack[] requirements, Runnable children){ - return new TechNode(content, requirements, children); + static TechNode node(UnlockableContent content, ItemStack[] requirements, Runnable children){ + return node(content, requirements, null, children); } - public static TechNode node(UnlockableContent content, Seq objectives, Runnable children){ - TechNode node = new TechNode(content, empty, children); - node.objectives = objectives; + static TechNode node(UnlockableContent content, ItemStack[] requirements, Seq objectives, Runnable children){ + TechNode node = new TechNode(context, content, requirements); + if(objectives != null){ + node.objectives = objectives; + } + + TechNode prev = context; + context = node; + children.run(); + context = prev; + return node; } - public 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); } @@ -561,8 +593,6 @@ public class TechTree implements ContentList{ } public static class TechNode{ - static TechNode context; - /** Depth in tech tree. */ public int depth; /** Requirement node. */ @@ -580,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; @@ -599,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 4891cb5b37..9a1b851118 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -11,17 +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 + miner + commander - public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class, Commanderc.class}) UnitType nova, pulsar, quasar; + //mech + builder + miner + public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class}) UnitType nova, 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; @@ -38,14 +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 TODO implement - public static @EntityDef({Unitc.class, Builderc.class, Minerc.class, Payloadc.class}) UnitType quad, oct; + //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 + commander - public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType risso, minke, bryde, sei, omura; + //water + 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,7 +66,7 @@ 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; @@ -72,7 +80,7 @@ public class UnitTypes implements ContentList{ mace = new UnitType("mace"){{ speed = 0.4f; - hitsize = 9f; + hitSize = 9f; health = 500; armor = 4f; @@ -103,7 +111,7 @@ public class UnitTypes implements ContentList{ fortress = new UnitType("fortress"){{ speed = 0.38f; - hitsize = 13f; + hitSize = 13f; rotateSpeed = 3f; targetAir = false; health = 790; @@ -136,7 +144,7 @@ public class UnitTypes implements ContentList{ scepter = new UnitType("scepter"){{ speed = 0.35f; - hitsize = 20f; + hitSize = 20f; rotateSpeed = 2.1f; health = 9000; armor = 11f; @@ -145,6 +153,7 @@ public class UnitTypes implements ContentList{ mechStepParticles = true; mechStepShake = 0.15f; + singleTarget = true; weapons.add( new Weapon("scepter-weapon"){{ @@ -152,7 +161,7 @@ public class UnitTypes implements ContentList{ y = 1f; x = 16f; shootY = 8f; - reload = 50f; + reload = 45f; recoil = 5f; shake = 2f; ejectEffect = Fx.shellEjectBig; @@ -161,7 +170,7 @@ public class UnitTypes implements ContentList{ inaccuracy = 3f; shotDelay = 4f; - bullet = new BasicBulletType(7f, 45){{ + bullet = new BasicBulletType(7f, 50){{ width = 11f; height = 20f; lifetime = 25f; @@ -170,7 +179,7 @@ public class UnitTypes implements ContentList{ lightningLength = 6; lightningColor = Pal.surge; //standard bullet damage is far too much for lightning - lightningDamage = 25; + lightningDamage = 30; }}; }}, @@ -196,7 +205,7 @@ public class UnitTypes implements ContentList{ reign = new UnitType("reign"){{ speed = 0.35f; - hitsize = 26f; + hitSize = 26f; rotateSpeed = 1.65f; health = 24000; armor = 14f; @@ -218,8 +227,9 @@ public class UnitTypes implements ContentList{ ejectEffect = Fx.shellEjectBig; shootSound = Sounds.artillery; - bullet = new BasicBulletType(13f, 55){{ + bullet = new BasicBulletType(13f, 60){{ pierce = true; + pierceCap = 10; width = 14f; height = 33f; lifetime = 15f; @@ -238,6 +248,8 @@ public class UnitTypes implements ContentList{ width = 10f; height = 10f; pierce = true; + pierceBuilding = true; + pierceCap = 3; lifetime = 20f; hitEffect = Fx.flakExplosion; @@ -254,17 +266,17 @@ 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; @@ -280,20 +292,20 @@ public class UnitTypes implements ContentList{ }}; pulsar = new UnitType("pulsar"){{ - itemCapacity = 60; canBoost = true; - boostMultiplier = 1.5f; - speed = 0.62f; - hitsize = 10f; - health = 320f; + boostMultiplier = 1.6f; + speed = 0.7f; + hitSize = 10f; + health = 300f; buildSpeed = 0.9f; armor = 4f; mineTier = 2; mineSpeed = 5f; - commandLimit = 15; + commandLimit = 8; abilities.add(new ShieldFieldAbility(20f, 40f, 60f * 5, 60f)); + ammoType = AmmoTypes.power; weapons.add(new Weapon("heal-shotgun-weapon"){{ top = false; @@ -323,24 +335,23 @@ 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; - commandLimit = 24; + commandLimit = 10; mechFrontSway = 0.55f; + ammoType = AmmoTypes.power; speed = 0.4f; - hitsize = 10f; + hitSize = 10f; - mineTier = 2; - mineSpeed = 7f; + mineSpeed = 6f; drawShields = false; abilities.add(new ForceFieldAbility(60f, 0.3f, 400f, 60f * 6)); @@ -365,14 +376,146 @@ 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; + speed = 1f; + hitSize = 8f; health = 180; mechSideSway = 0.25f; range = 40f; @@ -386,9 +529,9 @@ public class UnitTypes implements ContentList{ hitEffect = Fx.pulverize; lifetime = 10f; speed = 1f; - splashDamageRadius = 55f; + splashDamageRadius = 70f; instantDisappear = true; - splashDamage = 55f; + splashDamage = 80f; killShooter = true; hittable = false; collidesAir = true; @@ -397,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; @@ -439,7 +582,7 @@ public class UnitTypes implements ContentList{ spiroct = new UnitType("spiroct"){{ speed = 0.4f; drag = 0.4f; - hitsize = 12f; + hitSize = 12f; rotateSpeed = 3f; health = 760; immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting); @@ -450,6 +593,7 @@ public class UnitTypes implements ContentList{ legBaseOffset = 2f; hovering = true; armor = 5f; + ammoType = AmmoTypes.power; buildSpeed = 0.75f; @@ -504,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; @@ -521,6 +665,7 @@ public class UnitTypes implements ContentList{ legLengthScl = 0.96f; rippleScale = 2f; legSpeed = 0.2f; + ammoType = AmmoTypes.power; legSplashDamage = 32; legSplashRange = 30; @@ -602,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; @@ -619,6 +764,7 @@ public class UnitTypes implements ContentList{ legLengthScl = 0.93f; rippleScale = 3f; legSpeed = 0.19f; + ammoType = AmmoTypes.powerHigh; legSplashDamage = 80; legSplashRange = 60; @@ -729,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; @@ -747,7 +892,7 @@ public class UnitTypes implements ContentList{ accel = 0.08f; drag = 0.016f; flying = true; - hitsize = 9f; + hitSize = 9f; targetAir = false; engineOffset = 7.8f; range = 140f; @@ -784,7 +929,7 @@ public class UnitTypes implements ContentList{ drag = 0.016f; flying = true; range = 140f; - hitsize = 18f; + hitSize = 20f; lowAltitude = true; armor = 5f; @@ -822,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; @@ -832,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; @@ -895,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; @@ -983,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; }}; @@ -999,15 +1145,16 @@ 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; @@ -1034,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; }}; @@ -1045,8 +1195,10 @@ public class UnitTypes implements ContentList{ mega = new UnitType("mega"){{ defaultController = RepairAI::new; - mineTier = 2; + mineTier = 3; health = 500; + armor = 2f; + armor = 5f; speed = 1.8f; accel = 0.06f; drag = 0.017f; @@ -1054,11 +1206,13 @@ 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"){{ reload = 25f; @@ -1076,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; @@ -1134,18 +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)); @@ -1179,9 +1418,8 @@ public class UnitTypes implements ContentList{ accel = 0.2f; rotateSpeed = 1.8f; drag = 0.17f; - hitsize = 16f; - armor = 6f; - immunities = ObjectSet.with(StatusEffects.wet); + hitSize = 16f; + armor = 7f; rotateShooting = false; trailLength = 22; @@ -1189,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; @@ -1273,10 +1511,9 @@ public class UnitTypes implements ContentList{ speed = 0.73f; drag = 0.17f; - hitsize = 39f; + hitSize = 39f; accel = 0.2f; rotateSpeed = 1.3f; - immunities = ObjectSet.with(StatusEffects.wet); rotateShooting = false; trailLength = 50; @@ -1307,7 +1544,7 @@ public class UnitTypes implements ContentList{ xRand = 8f; shotDelay = 1f; - bullet = new MissileBulletType(4.2f, 25){{ + bullet = new MissileBulletType(4.2f, 30){{ homingPower = 0.12f; width = 8f; height = 8f; @@ -1315,8 +1552,8 @@ public class UnitTypes implements ContentList{ drag = -0.003f; homingRange = 80f; keepVelocity = false; - splashDamageRadius = 25f; - splashDamage = 25f; + splashDamageRadius = 30f; + splashDamage = 35f; lifetime = 56f; trailColor = Pal.bulletYellowBack; backColor = Pal.bulletYellowBack; @@ -1357,14 +1594,13 @@ public class UnitTypes implements ContentList{ health = 22000; speed = 0.62f; drag = 0.18f; - hitsize = 50f; + hitSize = 50f; armor = 16f; accel = 0.19f; rotateSpeed = 0.9f; - immunities = ObjectSet.with(StatusEffects.wet); rotateShooting = false; - float spawnTime = 60f * 25f; + float spawnTime = 60f * 15f; abilities.add(new UnitSpawnAbility(flare, spawnTime, 19.25f, -31.75f), new UnitSpawnAbility(flare, spawnTime, -19.25f, -31.75f)); @@ -1415,13 +1651,14 @@ 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; @@ -1449,15 +1686,16 @@ 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; @@ -1489,13 +1727,14 @@ 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; @@ -1525,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 6f59edbed0..273fdb5899 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -152,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,12 +170,13 @@ public class Weathers implements ContentList{ sandstorm = new Weather("sandstorm"){ TextureRegion region; float size = 140f, padding = size, invDensity = 1500f, baseSpeed = 6.1f; - float force = 0.45f; + float force = 0.4f * 0; Color color = Color.valueOf("f7cba4"); Texture noise; { attrs.set(Attribute.light, -0.1f); + opacityMultiplier = 0.8f; } @Override @@ -250,7 +251,7 @@ public class Weathers implements ContentList{ sporestorm = new Weather("sporestorm"){ TextureRegion region; - float size = 5f, padding = size, invDensity = 2000f, baseSpeed = 4.3f, force = 0.28f; + float size = 5f, padding = size, invDensity = 2000f, baseSpeed = 4.3f, force = 0.28f * 0; Color color = Color.valueOf("7457ce"); Texture noise; @@ -259,6 +260,7 @@ public class Weathers implements ContentList{ attrs.set(Attribute.light, -0.15f); status = StatusEffects.sporeSlowed; statusGround = false; + opacityMultiplier = 0.85f; } @Override 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 38ddda6a24..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.*; @@ -191,10 +190,6 @@ public class Control implements ApplicationListener, Loadable{ } - void resetCamera(){ - - } - @Override public void loadAsync(){ Draw.scl = 1f / Core.atlas.find("scale_marker").width; @@ -322,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); @@ -484,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(); @@ -522,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 ac827fbfae..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, wasTimeout; + 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 9058539764..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()); } @@ -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; @@ -251,58 +254,6 @@ public class Logic implements ApplicationListener{ } } - @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; @@ -335,19 +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()){ - if(!state.wasTimeout){ - universe.displayTimeEnd(); - state.wasTimeout = true; - } - //if no turn was run. - 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 c4e519a4a5..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"); diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 994b3a273e..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(); } 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 ad7806267c..47b7500e10 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -63,7 +63,9 @@ public class Renderer implements ApplicationListener{ 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){ @@ -217,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); @@ -305,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 536e89a9b2..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.*; 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 867ba38f1a..03a18c01ed 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -6,7 +6,6 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.struct.ObjectIntMap.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.noise.*; import mindustry.content.*; @@ -31,7 +30,7 @@ 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<>(); @@ -66,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); } @@ -86,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(); @@ -132,7 +134,6 @@ public class World{ return tile.build; } - @NonNull public Tile rawTile(int x, int y){ return tiles.getn(x, y); } 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 ee1739eb9d..f6e6d0a2dc 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -4,7 +4,7 @@ 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.*; @@ -22,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; @@ -31,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(){ diff --git a/core/src/mindustry/editor/DrawOperation.java b/core/src/mindustry/editor/DrawOperation.java index e63c2f3a6b..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; diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index 1098e463d3..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,7 +18,7 @@ public class EditorTile extends Tile{ } @Override - public void setFloor(@NonNull Floor type){ + public void setFloor(Floor type){ if(skip()){ super.setFloor(type); return; @@ -27,7 +26,7 @@ public class EditorTile extends Tile{ if(type instanceof OverlayFloor){ //don't place on liquids - if(!floor.isLiquid){ + if(floor.hasSurface()){ setOverlayID(type.id); } return; @@ -97,7 +96,14 @@ public class EditorTile extends Tile{ super.recache(); } } - + + @Override + protected void changed(){ + if(state.isGame()){ + super.changed(); + } + } + @Override protected void changeEntity(Team team, Prov entityprov, int rotation){ if(skip()){ @@ -112,7 +118,7 @@ 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); if(block.hasItems) build.items = new ItemModule(); diff --git a/core/src/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java index 2dff5e9f46..194ec97e4c 100644 --- a/core/src/mindustry/editor/EditorTool.java +++ b/core/src/mindustry/editor/EditorTool.java @@ -118,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(); diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 353e39fcf8..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.*; @@ -257,6 +256,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ player.set(world.width() * tilesize/2f, world.height() * tilesize/2f); player.clearUnit(); Groups.unit.clear(); + Groups.build.clear(); logic.play(); }); } @@ -557,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(); diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index 472a20dee0..fae31dc7d5 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -417,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 c46e06f36d..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.*; 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/MapView.java b/core/src/mindustry/editor/MapView.java index 21e659ae1b..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); 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/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 27fa264a4a..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(){ @@ -147,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 1157b83ff9..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 95ca278bbd..c6f592f30f 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -24,7 +24,7 @@ public class Units{ if(unit != null){ unit.dead = true; Fx.unitCapKill.at(unit); - Core.app.post(() -> Call.unitDeath(unit.id)); + Core.app.post(() -> Call.unitDestroy(unit.id)); } } @@ -42,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); @@ -50,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){ @@ -160,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; @@ -180,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; @@ -237,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. */ @@ -269,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); } } @@ -282,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/ForceFieldAbility.java b/core/src/mindustry/entities/abilities/ForceFieldAbility.java index 60c37badfb..fa9fa5e2c8 100644 --- a/core/src/mindustry/entities/abilities/ForceFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ForceFieldAbility.java @@ -21,14 +21,14 @@ public class ForceFieldAbility extends Ability{ /** Cooldown after the shield is broken, in ticks. */ public float cooldown = 60f * 5; - /** State: radius scaling. */ - protected float radiusScale; + /** 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 && Intersector.isInsideHexagon(paramUnit.x, paramUnit.y, realRad * 2f, trait.x(), trait.y()) && paramUnit.shield > 0){ + 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); @@ -40,7 +40,7 @@ public class ForceFieldAbility extends Ability{ } paramUnit.shield -= trait.damage(); - paramUnit.shieldAlpha = 1f; + paramField.alpha = 1f; } }; @@ -59,6 +59,8 @@ public class ForceFieldAbility extends Ability{ unit.shield += Time.delta * regen; } + alpha = Math.max(alpha - Time.delta/10f, 0f); + if(unit.shield > 0){ radiusScale = Mathf.lerpDelta(radiusScale, 1f, 0.06f); paramUnit = unit; @@ -78,7 +80,7 @@ public class ForceFieldAbility extends 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); diff --git a/core/src/mindustry/entities/abilities/HealFieldAbility.java b/core/src/mindustry/entities/abilities/HealFieldAbility.java index 96f0e373d9..90f800ec84 100644 --- a/core/src/mindustry/entities/abilities/HealFieldAbility.java +++ b/core/src/mindustry/entities/abilities/HealFieldAbility.java @@ -8,7 +8,7 @@ import mindustry.gen.*; 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; protected float timer; protected boolean wasHealed = false; @@ -37,7 +37,7 @@ public class HealFieldAbility extends Ability{ }); if(wasHealed){ - activeEffect.at(unit); + activeEffect.at(unit, range); } timer = 0f; diff --git a/core/src/mindustry/entities/abilities/StatusFieldAbility.java b/core/src/mindustry/entities/abilities/StatusFieldAbility.java index a1c9a53418..857cfde5cf 100644 --- a/core/src/mindustry/entities/abilities/StatusFieldAbility.java +++ b/core/src/mindustry/entities/abilities/StatusFieldAbility.java @@ -1,6 +1,5 @@ package mindustry.entities.abilities; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.content.*; import mindustry.entities.*; @@ -8,7 +7,7 @@ import mindustry.gen.*; import mindustry.type.*; public class StatusFieldAbility extends Ability{ - public @NonNull StatusEffect effect; + public StatusEffect effect; public float duration = 60, reload = 100, range = 20; public Effect applyEffect = Fx.heal; public Effect activeEffect = Fx.overdriveWave; @@ -17,7 +16,7 @@ public class StatusFieldAbility extends Ability{ 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; diff --git a/core/src/mindustry/entities/abilities/UnitSpawnAbility.java b/core/src/mindustry/entities/abilities/UnitSpawnAbility.java index 1af235140b..74140114d9 100644 --- a/core/src/mindustry/entities/abilities/UnitSpawnAbility.java +++ b/core/src/mindustry/entities/abilities/UnitSpawnAbility.java @@ -2,7 +2,6 @@ package mindustry.entities.abilities; import arc.graphics.g2d.*; import arc.math.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.*; import mindustry.content.*; @@ -13,13 +12,13 @@ import mindustry.type.*; import mindustry.ui.*; public class UnitSpawnAbility extends Ability{ - public @NonNull UnitType type; + public UnitType type; public float spawnTime = 60f, spawnX, spawnY; public Effect spawnEffect = Fx.spawn; protected float timer; - public UnitSpawnAbility(@NonNull UnitType type, float spawnTime, float spawnX, float spawnY){ + public UnitSpawnAbility(UnitType type, float spawnTime, float spawnX, float spawnY){ this.type = type; this.spawnTime = spawnTime; this.spawnX = spawnX; 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 d1a83dbe52..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.*; @@ -25,6 +25,7 @@ public abstract class BulletType extends Content{ public float drawSize = 40f; public float drag = 0f; public boolean pierce, pierceBuilding; + public int pierceCap = -1; public Effect hitEffect, despawnEffect; /** Effect created when shooting. */ @@ -71,13 +72,23 @@ public abstract class BulletType extends Content{ 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; @@ -96,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; @@ -126,15 +139,23 @@ 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, 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){ @@ -154,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)); } } @@ -176,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)); } } @@ -187,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); } @@ -200,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; } } @@ -267,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 9400eb5092..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, float initialHealth){ - 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 35745d6b34..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 diff --git a/core/src/mindustry/entities/bullet/LiquidBulletType.java b/core/src/mindustry/entities/bullet/LiquidBulletType.java index 22d5c22d42..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){ @@ -25,7 +25,7 @@ public class LiquidBulletType extends BulletType{ } ammoMultiplier = 1f; - lifetime = 74f; + lifetime = 34f; statusDuration = 60f * 2f; despawnEffect = Fx.none; hitEffect = Fx.hitLiquid; @@ -62,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 @@ -79,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 index c5a267831f..8265f35e8b 100644 --- a/core/src/mindustry/entities/bullet/RailBulletType.java +++ b/core/src/mindustry/entities/bullet/RailBulletType.java @@ -4,6 +4,12 @@ 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. */ @@ -37,7 +43,9 @@ public class RailBulletType extends BulletType{ @Override public void update(Bullet b){ - updateEffect.at(b.x, b.y, b.rotation()); + if(b.timer(1, 0.9f)){ + updateEffect.at(b.x, b.y, b.rotation()); + } } @Override diff --git a/core/src/mindustry/entities/bullet/SapBulletType.java b/core/src/mindustry/entities/bullet/SapBulletType.java index 549485c3e2..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); @@ -68,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 0d58e683d2..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; @@ -30,7 +31,14 @@ public class ShrapnelBulletType extends BulletType{ @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/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index bd4ae6a87d..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)){ @@ -117,7 +116,6 @@ abstract class BuilderComp implements Unitc{ 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 32b23f2b6b..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; @@ -216,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){ @@ -346,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(){ @@ -421,7 +429,7 @@ 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); @@ -438,10 +446,10 @@ 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); @@ -466,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){ @@ -475,7 +483,7 @@ 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); @@ -497,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(self(), 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); } @@ -529,9 +537,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, 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(self(), liquid, flow)){ + if(flow > 0f && ofract <= fract && next.acceptLiquid(self(), liquid)){ next.handleLiquid(self(), liquid, flow); liquids.remove(liquid, flow); return flow; @@ -575,7 +583,7 @@ 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); @@ -593,7 +601,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * 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); @@ -619,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; @@ -654,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. */ @@ -849,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(){ } @@ -865,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); } @@ -1029,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); } } @@ -1156,10 +1180,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, proximity.add(tile); } - for(Building other : tmpTiles){ - other.onProximityUpdate(); - } - onProximityAdded(); onProximityUpdate(); @@ -1213,31 +1233,40 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, @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.maxHealth) return maxHealth(); - 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.getLastScaledPowerIn() * 60; - if(sensor == LAccess.powerNetOut && power != null) return power.graph.getLastScaledPowerOut() * 60; - if(sensor == LAccess.powerNetStored && power != null) return power.graph.getLastPowerStored(); - if(sensor == LAccess.powerNetCapacity && power != null) return power.graph.getLastCapacity(); - 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){ - if(sensor == LAccess.type) return block; + 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; + }; - return noSensed; } @Override @@ -1255,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){ diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index 5ef68ac2e1..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()); } } } @@ -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){ @@ -95,14 +89,12 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw 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); } @@ -152,6 +144,10 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw return false; }); } + + if(type.pierceCap != -1 && collided.size >= type.pierceCap) { + remove(); + } } @Override 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 354581654b..b0fbddcf85 100644 --- a/core/src/mindustry/entities/comp/CommanderComp.java +++ b/core/src/mindustry/entities/comp/CommanderComp.java @@ -3,28 +3,31 @@ 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*/ 0); //TODO rotation set to 0 because rotating is pointless @@ -32,18 +35,15 @@ abstract class CommanderComp implements Unitc{ } } - @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 != self()){ + 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,8 +74,8 @@ abstract class CommanderComp implements Unitc{ void command(Formation formation, Seq units){ clearCommand(); - float spacing = hitSize() * 1f; - minFormationSpeed = type().speed; + float spacing = hitSize * 0.65f; + minFormationSpeed = type.speed; controlling.addAll(units); for(Unit unit : units){ 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/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 2b20e908b2..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 diff --git a/core/src/mindustry/entities/comp/FlyingComp.java b/core/src/mindustry/entities/comp/FlyingComp.java index 15d0e84b1e..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{ @@ -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 9473dfbca3..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.*; diff --git a/core/src/mindustry/entities/comp/LegsComp.java b/core/src/mindustry/entities/comp/LegsComp.java index 68c0de5f00..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,14 @@ 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 diff --git a/core/src/mindustry/entities/comp/MechComp.java b/core/src/mindustry/entities/comp/MechComp.java index 407b256136..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, 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 7e367c00bc..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.*; @@ -36,6 +35,11 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ 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 public void update(){ Building core = closestCore(); @@ -50,20 +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 - || mineTile.drop() == null || !canMine(mineTile.drop())){ + if(core == null || !validMine(mineTile)){ mineTile = null; mineTimer = 0f; }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()){ @@ -105,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 f6b896118f..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(){ @@ -55,7 +55,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ void pickup(Building tile){ tile.tile.remove(); - payloads.add(new BlockPayload(tile)); + payloads.add(new BuildPayload(tile)); Fx.unitPickup.at(tile); } @@ -86,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; } @@ -98,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; } @@ -118,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; + 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 61168fdece..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; @@ -92,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 @@ -189,6 +188,11 @@ 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(self(), unit)); 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/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 3a31b13b95..fcce0d0a02 100644 --- a/core/src/mindustry/entities/comp/StatusComp.java +++ b/core/src/mindustry/entities/comp/StatusComp.java @@ -19,7 +19,7 @@ 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; @Import UnitType type; @@ -104,7 +104,7 @@ abstract class StatusComp implements Posc, Flyingc{ } applied.clear(); - speedMultiplier = damageMultiplier = armorMultiplier = reloadMultiplier = 1f; + speedMultiplier = damageMultiplier = healthMultiplier = reloadMultiplier = 1f; if(statuses.isEmpty()) return; @@ -122,7 +122,7 @@ 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(self(), entry.time); 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 79df336be4..1cf0f7e216 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -6,8 +6,8 @@ import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; +import mindustry.ai.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.ctype.*; @@ -23,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; //TODO remove deactivation boolean + boolean spawnedByCore; + double flag; transient Seq abilities = new Seq<>(0); + private transient float resupplyTime = Mathf.random(10f); public void moveAt(Vec2 vector){ moveAt(vector, type.accel); @@ -63,35 +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.width * 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.maxHealth) return maxHealth; - 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){ - if(sensor == LAccess.type) return type; + 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; + }; - return noSensed; } @Override @@ -103,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 @@ -149,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){ @@ -166,7 +199,7 @@ 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(){ @@ -178,7 +211,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I 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()); @@ -206,18 +239,15 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I public void add(){ //check if over unit cap - if(count() > cap() && !spawnedByCore){ - deactivated = true; - - if(!dead){ - Call.unitCapDeath(self()); - } + if(count() > cap() && !spawnedByCore && !dead){ + Call.unitCapDeath(self()); + team.data().updateCount(type, -1); } } @Override public void remove(){ - teamIndex.updateCount(team, type, -1); + team.data().updateCount(type, -1); controller.removed(self()); } @@ -232,22 +262,23 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @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(self()); - - if(abilities.size > 0){ - for(Ability a : abilities){ - a.update(self()); - } + if(abilities.size > 0){ + for(Ability a : abilities){ + a.update(self()); } - }else if(!dead){ - Call.unitCapDeath(self()); } drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f); @@ -305,18 +336,20 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I 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(); } @@ -325,11 +358,6 @@ 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(self()); @@ -362,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); } @@ -409,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 5d5ede8a06..d891dbc1e4 100644 --- a/core/src/mindustry/entities/comp/WeaponsComp.java +++ b/core/src/mindustry/entities/comp/WeaponsComp.java @@ -13,13 +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; @@ -67,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; @@ -85,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(){ @@ -93,7 +101,27 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ for(WeaponMount mount : mounts){ Weapon weapon = mount.weapon; mount.reload = Math.max(mount.reload - Time.delta * reloadMultiplier, 0); - mount.heat = Math.max(mount.heat - Time.delta * reloadMultiplier / mount.weapon.cooldownTime, 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 && @@ -104,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; @@ -124,21 +152,9 @@ 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); - - - 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; - mount.heat = 1f; ammo--; if(ammo < 0) ammo = 0; @@ -146,39 +162,57 @@ 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)); } - 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){ + private Bullet bullet(Weapon weapon, float x, float y, float angle, float lifescl){ float xr = Mathf.range(weapon.xRand); - weapon.bullet.create(this, team(), + 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 03d9daf8b4..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.*; @@ -21,6 +21,7 @@ public class AIController implements UnitController{ protected Unit unit; protected Interval timer = new Interval(4); + protected AIController fallback; /** main target that is being faced */ protected Teamc target; @@ -34,11 +35,27 @@ public class AIController implements UnitController{ @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; } @@ -64,6 +81,23 @@ public class AIController implements UnitController{ } } + 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]; @@ -74,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; } @@ -100,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; @@ -114,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; @@ -158,13 +194,17 @@ public class AIController implements UnitController{ } 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 * 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 6cf83c2767..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{ @@ -21,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 9ec689a1aa..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; } diff --git a/core/src/mindustry/game/Schematic.java b/core/src/mindustry/game/Schematic.java index 334d96cc08..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.*; @@ -23,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; @@ -38,27 +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 -> { 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; @@ -68,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); } @@ -96,7 +94,7 @@ public class Schematic implements Publishable, Comparable{ @Override public String steamDescription(){ - return null; + return description(); } @Override @@ -124,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 672f0a23b5..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.*; diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 806d079b05..b66dc5bf95 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -2,7 +2,6 @@ package mindustry.game; import arc.math.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.content.*; import mindustry.ctype.*; @@ -11,6 +10,8 @@ import mindustry.world.*; import mindustry.world.blocks.storage.CoreBlock.*; import mindustry.world.modules.*; +import java.util.*; + import static mindustry.Vars.*; public class SectorInfo{ @@ -24,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. */ @@ -33,6 +34,8 @@ 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. */ @@ -41,7 +44,21 @@ public class SectorInfo{ /** 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){ @@ -72,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)); } } @@ -80,7 +97,7 @@ 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); } @@ -92,10 +109,10 @@ public class SectorInfo{ internalTimeSpent += Time.delta; - //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(); @@ -111,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); @@ -130,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 9cea3b582f..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; 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 e0f73248ed..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.*; diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index cb3cf1de19..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.*; @@ -20,7 +19,7 @@ public class Universe{ private int turn; private Schematic lastLoadout; - private Seq lastLaunchResources = new Seq<>(); + private ItemSeq lastLaunchResources = new ItemSeq(); public Universe(){ load(); @@ -54,25 +53,9 @@ public class Universe{ } } - public void displayTimeEnd(){ - if(!headless){ - //check if any sectors are under attack to display this - Seq attacked = state.getSector().planet.sectors.select(s -> s.hasWaves() && s.hasBase() && !s.isBeingPlayed() && s.getSecondsPassed() > 1); - - if(attacked.any()){ - state.set(State.paused); - - //TODO localize - String text = attacked.size > 1 ? attacked.size + " sectors attacked." : "Sector " + attacked.first().id + " under attack."; - - ui.hudfrag.sectorText = text; - ui.hudfrag.attackedSectors = attacked; - ui.announce(text); - }else{ - //autorun next turn - universe.runTurn(); - } - } + /** @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. */ @@ -104,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. */ @@ -157,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); } } @@ -174,7 +171,6 @@ public class Universe{ } } } - //TODO events Events.fire(new TurnEvent()); diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index 99996f09eb..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); @@ -196,10 +197,15 @@ public class BlockRenderer implements Disposable{ 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 @@ -209,7 +215,7 @@ 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! + 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 c3eed64feb..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{ @@ -51,6 +51,17 @@ public enum CacheLayer{ endShader(Shaders.slag); } }, + space{ + @Override + public void begin(){ + beginShader(); + } + + @Override + public void end(){ + endShader(Shaders.space); + } + }, normal(5), walls(3); diff --git a/core/src/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java index 4da853049b..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); diff --git a/core/src/mindustry/graphics/FloorRenderer.java b/core/src/mindustry/graphics/FloorRenderer.java index 3598a0ad09..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++){ @@ -218,7 +217,7 @@ public class FloorRenderer implements Disposable{ 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 * 7); + 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 997c8c2721..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" + diff --git a/core/src/mindustry/graphics/LightRenderer.java b/core/src/mindustry/graphics/LightRenderer.java index fbe154a6b9..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{ diff --git a/core/src/mindustry/graphics/MenuRenderer.java b/core/src/mindustry/graphics/MenuRenderer.java index 5d036ce4e5..2899efcdba 100644 --- a/core/src/mindustry/graphics/MenuRenderer.java +++ b/core/src/mindustry/graphics/MenuRenderer.java @@ -237,8 +237,6 @@ 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); diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index bba020f792..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,7 +121,7 @@ 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 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); diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index ea988e5e78..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.*; @@ -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()); diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index 1d154dc5c0..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"), @@ -47,6 +47,7 @@ public class Pal{ 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 bdc95d2a92..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, mud, tar, slag; + public static SurfaceShader water, mud, tar, slag, space; public static PlanetShader planet; public static PlanetGridShader planetGrid; public static AtmosphereShader atmosphere; @@ -45,6 +44,7 @@ public class Shaders{ 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(); @@ -155,7 +155,7 @@ public class Shaders{ setUniformf("u_progress", progress); setUniformf("u_uv", region.u, region.v); setUniformf("u_uv2", region.u2, region.v2); - setUniformf("u_texsize", region.texture.getWidth(), region.texture.height); + setUniformf("u_texsize", region.texture.width, region.texture.height); } } @@ -175,7 +175,7 @@ public class Shaders{ setUniformf("u_uv", region.u, region.v); setUniformf("u_uv2", region.u2, region.v2); setUniformf("u_time", Time.time()); - setUniformf("u_texsize", region.texture.getWidth(), region.texture.height); + setUniformf("u_texsize", region.texture.width, region.texture.height); } } @@ -197,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){ @@ -226,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 042852edb4..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.*; @@ -49,7 +48,7 @@ public class DesktopInput extends InputHandler{ 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(); @@ -177,7 +176,7 @@ 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(); } @@ -200,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); } @@ -354,7 +353,7 @@ public class DesktopInput extends InputHandler{ }).visible(() -> state.isCampaign()).tooltip("@planetmap"); table.button(Icon.up, Styles.clearPartiali, () -> { - ui.planet.show(state.getSector(), player.team().core()); + ui.planet.showLaunch(state.getSector(), player.team().core()); }).visible(() -> state.isCampaign()).tooltip("@launchcore").disabled(b -> player.team().core() == null); } @@ -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 c678723fec..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.*; @@ -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,6 +122,29 @@ 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); @@ -113,13 +158,13 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Payloadc pay = (Payloadc)unit; if(target.isAI() && target.isGrounded() && pay.canPickup(target) - && target.within(unit, unit.type().hitsize * 2f + target.type().hitsize * 2f)){ - Call.pickedUnitPayload(player, target); + && target.within(unit, unit.type().hitSize * 2f + target.type().hitSize * 2f)){ + Call.pickedUnitPayload(unit, target); } } @Remote(targets = Loc.both, called = Loc.server) - public static void requestBlockPayload(Player player, Building tile){ + public static void requestBuildPayload(Player player, Building tile){ if(player == null) return; Unit unit = player.unit(); @@ -129,57 +174,49 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ && unit.within(tile, tilesize * tile.block.size * 1.2f + tilesize * 5f)){ //pick up block directly if(tile.block.buildVisibility != BuildVisibility.hidden && tile.canPickup() && pay.canPickup(tile)){ - Call.pickedBlockPayload(player, tile, true); + Call.pickedBuildPayload(unit, tile, true); }else{ //pick up block payload Payload current = tile.getPayload(); if(current != null && pay.canPickupPayload(current)){ - Call.pickedBlockPayload(player, tile, false); + Call.pickedBuildPayload(unit, tile, false); } } } } @Remote(targets = Loc.server, called = Loc.server) - public static void pickedUnitPayload(Player player, Unit target){ - if(player == null || target == null || !(player.unit() instanceof Payloadc)){ - if(target != null){ - target.remove(); - } - return; + public static void pickedUnitPayload(Unit unit, Unit target){ + if(target != null && unit instanceof Payloadc pay){ + pay.pickup(target); + }else if(target != null){ + target.remove(); } - - ((Payloadc)player.unit()).pickup(target); } @Remote(targets = Loc.server, called = Loc.server) - public static void pickedBlockPayload(Player player, Building tile, boolean onGround){ - if(player == null || tile == null || !(player.unit() instanceof Payloadc)){ - if(tile != null && onGround){ - Fx.unitPickup.at(tile); - tile.tile.remove(); - } - return; - } - - Unit unit = player.unit(); - Payloadc pay = (Payloadc)unit; - - 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(); - if(taken != null){ - pay.addPayload(taken); + 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(); + if(taken != null){ + pay.addPayload(taken); + Fx.unitPickup.at(tile); + } } } + + }else if(tile != null && onGround){ + Fx.unitPickup.at(tile); + tile.tile.remove(); } } @@ -193,19 +230,17 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Tmp.v1.set(x, y).sub(pay).limit(tilesize * 4f).add(pay); float cx = Tmp.v1.x, cy = Tmp.v1.y; - Call.payloadDropped(player, cx, cy); + Call.payloadDropped(player.unit(), cx, cy); } @Remote(called = Loc.server, targets = Loc.server) - public static void payloadDropped(Player player, float x, float y){ - if(player == null) return; - - Payloadc pay = (Payloadc)player.unit(); - - float prevx = pay.x(), prevy = pay.y(); - pay.set(x, y); - pay.dropLastPayload(); - pay.set(prevx, prevy); + 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(); + pay.set(prevx, prevy); + } } @Remote(targets = Loc.client, called = Loc.server) @@ -221,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) || @@ -229,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(); @@ -236,7 +272,7 @@ 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 || !player.within(tile, buildingRange) || tile.items == 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 -> { @@ -274,6 +310,15 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ 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; @@ -292,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); } @@ -316,13 +361,11 @@ 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){ //TODO try out some other formations commander.commandNearby(new CircleFormation()); @@ -365,7 +408,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } 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); @@ -375,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; } @@ -392,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.requestUnitPayload(player, target); }else{ Building tile = world.buildWorld(pay.x(), pay.y()); if(tile != null && tile.team == unit.team){ - Call.requestBlockPayload(player, tile); + Call.requestBuildPayload(player, tile); } } } @@ -490,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); @@ -931,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); diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index 28ffb9e1b6..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,6 +583,9 @@ public class MobileInput extends InputHandler implements GestureListener{ //ignore off-screen taps if(cursor == null || Core.scene.hasMouse(x, y)) return false; + + Call.tileTap(player, cursor); + Tile linked = cursor.build == null ? cursor : cursor.build.tile; if(!player.dead()){ @@ -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 e6ea20cf9e..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,7 @@ public class JsonIO{ } }); - json.setSerializer(Liquid.class, new Serializer(){ + json.setSerializer(Liquid.class, new Serializer<>(){ @Override public void write(Json json, Liquid object, Class knownType){ json.writeValue(object.name); @@ -109,12 +109,12 @@ public class JsonIO{ @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()); + Liquid i = Vars.content.getByName(ContentType.liquid, jsonData.asString()); return i == null ? Liquids.water : i; } }); - json.setSerializer(Item.class, new Serializer(){ + json.setSerializer(Item.class, new Serializer<>(){ @Override public void write(Json json, Item object, Class knownType){ json.writeValue(object.name); @@ -123,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); @@ -140,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); @@ -153,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); @@ -165,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(); @@ -180,7 +180,7 @@ public class JsonIO{ } }); - json.setSerializer(UnlockableContent.class, new Serializer(){ + json.setSerializer(UnlockableContent.class, new Serializer<>(){ @Override public void write(Json json, UnlockableContent object, Class knownType){ json.writeValue(object.name); diff --git a/core/src/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java index c925dc48a4..0aef1a19df 100644 --- a/core/src/mindustry/io/SaveFileReader.java +++ b/core/src/mindustry/io/SaveFileReader.java @@ -49,7 +49,9 @@ public abstract class SaveFileReader{ "holostone-wall", "dacite-wall", "rock", "boulder", "snowrock", "snow-boulder", - "cliffs", "stone-wall" + "cliffs", "stone-wall", + + "cryofluidmixer", "cryofluid-mixer" ); protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(); diff --git a/core/src/mindustry/io/SaveIO.java b/core/src/mindustry/io/SaveIO.java index 518cfa13d1..8b56ef2a61 100644 --- a/core/src/mindustry/io/SaveIO.java +++ b/core/src/mindustry/io/SaveIO.java @@ -126,6 +126,10 @@ public class SaveIO{ } } + 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); } 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/LegacySaveVersion.java b/core/src/mindustry/io/legacy/LegacySaveVersion.java index cd8302d16d..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{ @@ -61,7 +61,7 @@ public abstract class LegacySaveVersion extends SaveVersion{ 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 2661509c7e..0954567c06 100644 --- a/core/src/mindustry/logic/ConditionOp.java +++ b/core/src/mindustry/logic/ConditionOp.java @@ -6,7 +6,8 @@ public enum ConditionOp{ 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(); 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 30eacf2402..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, @@ -26,18 +27,34 @@ public enum LAccess{ 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 7ca74ca83c..4f72d121aa 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -2,8 +2,9 @@ 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.*; @@ -21,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); @@ -45,6 +52,15 @@ public class LAssembler{ } } + //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){ @@ -202,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 b532151f1c..3bcfaf46ee 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1,17 +1,23 @@ 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.*; @@ -24,7 +30,9 @@ public class LExecutor{ //special variables public static final int varCounter = 0, - varTime = 1; + varTime = 1, + varUnit = 2, + varThis = 3; public static final int maxGraphicsBuffer = 256, @@ -37,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; @@ -103,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; @@ -122,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{ @@ -143,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; @@ -163,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)); + } } } } @@ -206,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]); } @@ -231,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); @@ -259,8 +605,7 @@ public class LExecutor{ Object target = exec.obj(from); Object sense = exec.obj(type); - if(target instanceof Senseable){ - Senseable se = (Senseable)target; + if(target instanceof Senseable se){ if(sense instanceof Content){ exec.setnum(to, se.sense(((Content)sense))); }else if(sense instanceof LAccess){ @@ -308,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; @@ -325,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; @@ -343,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; @@ -484,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]); @@ -547,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)); @@ -577,7 +924,7 @@ public class LExecutor{ if(address != -1){ Var va = exec.vars[value]; Var vb = exec.vars[compare]; - boolean cmp = false; + boolean cmp; if(op.objFunction != null && (va.isobj || vb.isobj)){ //use object function if provided, and one of the variables is an object 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 b289efc1f2..40d02a8345 100644 --- a/core/src/mindustry/logic/LogicOp.java +++ b/core/src/mindustry/logic/LogicOp.java @@ -1,6 +1,7 @@ package mindustry.logic; import arc.math.*; +import arc.util.*; public enum LogicOp{ add("+", (a, b) -> a + b), @@ -9,8 +10,8 @@ public enum LogicOp{ 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, (a, b) -> a == b ? 1 : 0), - notEqual("not", (a, b) -> Math.abs(a - b) < 0.000001 ? 0 : 1, (a, b) -> a != b ? 1 : 0), + 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), 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/maps/Map.java b/core/src/mindustry/maps/Map.java index ebf2896e0e..edef90cea7 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.*; 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 54c3856d7d..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.*; 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/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 1feba11ad1..857be64369 100644 --- a/core/src/mindustry/maps/filters/NoiseFilter.java +++ b/core/src/mindustry/maps/filters/NoiseFilter.java @@ -1,13 +1,11 @@ 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; 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 0a462548cc..28ffd1a714 100644 --- a/core/src/mindustry/maps/filters/RiverNoiseFilter.java +++ b/core/src/mindustry/maps/filters/RiverNoiseFilter.java @@ -1,13 +1,11 @@ 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; 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 f6dcaeaf27..cc0ba82b54 100644 --- a/core/src/mindustry/maps/filters/TerrainFilter.java +++ b/core/src/mindustry/maps/filters/TerrainFilter.java @@ -1,14 +1,12 @@ 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; diff --git a/core/src/mindustry/maps/generators/BaseGenerator.java b/core/src/mindustry/maps/generators/BaseGenerator.java index 7a752a453a..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,7 +60,7 @@ 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; @@ -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/PlanetGenerator.java b/core/src/mindustry/maps/generators/PlanetGenerator.java index 6bbc15ed2f..2f0bd37058 100644 --- a/core/src/mindustry/maps/generators/PlanetGenerator.java +++ b/core/src/mindustry/maps/generators/PlanetGenerator.java @@ -1,6 +1,7 @@ package mindustry.maps.generators; import arc.math.geom.*; +import arc.struct.*; import arc.util.noise.*; import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.PlanetGrid.*; @@ -8,6 +9,7 @@ import mindustry.type.*; 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. */ diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index 4e15baf9e1..fab208fd05 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,6 +22,7 @@ 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}, @@ -29,9 +31,9 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ {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.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.basalt, 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}, @@ -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 && !(enemies.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 9aeee4ab2f..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); } @@ -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(); @@ -634,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{ diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index 14a9e4326f..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.", "mindustry.async."); + 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 3170a92617..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){ @@ -226,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 651c5c7923..8c4b40b4c2 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -7,7 +7,6 @@ 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.noise.*; import mindustry.ctype.*; @@ -24,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. */ @@ -32,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.*/ @@ -60,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. */ 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 137c1b0142..4c1df28945 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -3,13 +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 mindustry.*; import mindustry.game.Saves.*; import mindustry.graphics.g3d.PlanetGrid.*; +import mindustry.world.modules.*; import static mindustry.Vars.*; @@ -31,9 +30,6 @@ public class Sector{ public float baseCoverage; public boolean generateEnemyBase; - //TODO implement a dynamic launch period - public int launchPeriod = 10; - public Sector(Planet planet, Ptile tile){ this.planet = planet; this.tile = tile; @@ -100,7 +96,7 @@ public class Sector{ 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(){ @@ -134,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); @@ -158,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); } @@ -179,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; @@ -209,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; @@ -257,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){ @@ -275,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(){ 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 c670f3ecd6..661e735fa7 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -11,7 +11,6 @@ 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.*; @@ -19,7 +18,6 @@ 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.*; @@ -34,27 +32,29 @@ 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), outlineSpace = 0.01f; + 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 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<>(); @@ -64,6 +64,9 @@ public class UnitType extends UnlockableContent{ public float legSplashDamage = 0f, legSplashRange = 5; public boolean flipBackLegs = true; + public int ammoResupplyAmount = 10; + public float ammoResupplyRange = 100f; + public float mechSideSway = 0.54f, mechFrontSway = 0.1f; public float mechStride = -1f; public float mechStepShake = -1f; @@ -71,14 +74,16 @@ public class UnitType extends UnlockableContent{ public Color mechLegColor = Pal.darkMetal; public int itemCapacity = -1; - public int ammoCapacity = 220; + 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; @@ -134,41 +139,6 @@ public class UnitType extends UnlockableContent{ public void update(Unit unit){ - if(unit instanceof Mechc){ - updateMechEffects(unit); - } - } - - public void updateMechEffects(Unit unit){ - Mechc mech = (Mechc)unit; - - float extend = walkExtend((Mechc)unit, false); - float base = walkExtend((Mechc)unit, true); - float extendScl = base % 1f; - - float lastExtend = mech.walkExtension(); - - if(extendScl < lastExtend && base % 2f > 1f){ - int side = -Mathf.sign(extend); - float width = hitsize / 2f * side, length = mechStride * 1.35f; - - float cx = unit.x + Angles.trnsx(mech.baseRotation(), length, width), - cy = unit.y + Angles.trnsy(mech.baseRotation(), length, width); - - if(mechStepShake > 0){ - Effect.shake(mechStepShake, mechStepShake, cx, cy); - } - - if(mechStepParticles){ - Tile tile = world.tileWorld(cx, cy); - if(tile != null){ - Color color = tile.floor().mapColor; - Fx.unitLand.at(cx, cy, hitsize/8f, color); - } - } - } - - mech.walkExtension(extendScl); } public void landed(Unit unit){} @@ -182,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){ @@ -230,30 +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 * 7, 20), 20); + 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); } } if(mechStride < 0){ - mechStride = 4f + (hitsize-8f)/2.1f; + 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; + mechStepShake = Mathf.round((hitSize - 11f) / 9f); + mechStepParticles = hitSize > 15f; } - canHeal = weapons.contains(w -> w.bullet instanceof HealBulletType); + canHeal = weapons.contains(w -> w.bullet.healPercent > 0f); //add mirrored weapon variants Seq mapped = new Seq<>(); @@ -277,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 @@ -306,14 +295,14 @@ public class UnitType extends UnlockableContent{ ItemStack[] stacks = null; //calculate costs based on reconstructors or factories found - Block rec = content.blocks().find(b -> b instanceof Reconstructor && Structs.contains(((Reconstructor)b).upgrades, u -> u[1] == this)); + 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 && Structs.contains(((UnitFactory)u).plans, p -> p.unit == this)); + UnitFactory factory = (UnitFactory)content.blocks().find(u -> u instanceof UnitFactory && ((UnitFactory)u).plans.contains(p -> p.unit == this)); if(factory != null){ - stacks = Structs.find(factory.plans, p -> p.unit == this).requirements; + stacks = factory.plans.find(p -> p.unit == this).requirements; } } @@ -338,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); @@ -355,10 +344,10 @@ public class UnitType extends UnlockableContent{ drawMech(mech); //side - legOffset.trns(mech.baseRotation(), 0f, Mathf.lerp(Mathf.sin(walkExtend(mech, true), 2f/Mathf.PI, 1) * mechSideSway, 0f, unit.elevation)); + 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(walkExtend(mech, true), 1f/Mathf.PI, 1) * mechFrontSway, 0f, unit.elevation))); + legOffset.add(Tmp.v1.trns(mech.baseRotation() + 90, 0f, Mathf.lerp(Mathf.sin(mech.walkExtend(true), 1f/Mathf.PI, 1) * mechFrontSway, 0f, unit.elevation))); unit.trns(legOffset.x, legOffset.y); } @@ -373,7 +362,6 @@ public class UnitType extends UnlockableContent{ drawPayload((Unit & Payloadc)unit); } - //TODO drawOcclusion(unit); Draw.z(z - outlineSpace); @@ -396,10 +384,6 @@ public class UnitType extends UnlockableContent{ unit.trns(-legOffset.x, -legOffset.y); } - if(unit.deactivated){ - drawDeactive(unit); - } - if(unit.abilities.size > 0){ for(Ability a : unit.abilities){ Draw.reset(); @@ -410,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(); @@ -444,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(); @@ -525,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.width; 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); @@ -540,17 +513,16 @@ public class UnitType extends UnlockableContent{ Draw.rect(weapon.outlineRegion, wx, wy, - width * Draw.scl * -Mathf.sign(weapon.flipSprite), + weapon.outlineRegion.width * Draw.scl * -Mathf.sign(weapon.flipSprite), weapon.region.height * Draw.scl, weaponRotation); - Draw.z(z); } Draw.rect(weapon.region, wx, wy, - width * Draw.scl * -Mathf.sign(weapon.flipSprite), + weapon.region.width * Draw.scl * -Mathf.sign(weapon.flipSprite), weapon.region.height * Draw.scl, weaponRotation); @@ -559,8 +531,8 @@ public class UnitType extends UnlockableContent{ Draw.blend(Blending.additive); Draw.rect(weapon.heatRegion, wx, wy, - width * Draw.scl * -Mathf.sign(weapon.flipSprite), - weapon.region.height * Draw.scl, + weapon.heatRegion.width * Draw.scl * -Mathf.sign(weapon.flipSprite), + weapon.heatRegion.height * Draw.scl, weaponRotation); Draw.blend(); Draw.color(); @@ -571,6 +543,8 @@ public class UnitType extends UnlockableContent{ } public void drawOutline(Unit unit){ + Draw.reset(); + if(Core.atlas.isFound(outlineRegion)){ Draw.rect(outlineRegion, unit.x, unit.y, unit.rotation - 90); } @@ -614,11 +588,6 @@ public class UnitType extends UnlockableContent{ 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); @@ -634,7 +603,7 @@ 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(); } @@ -656,6 +625,10 @@ public class UnitType extends UnlockableContent{ } } + if(baseRegion.found()){ + Draw.rect(baseRegion, unit.x, unit.y, rotation - 90); + } + Draw.reset(); } @@ -666,8 +639,8 @@ public class UnitType extends UnlockableContent{ float e = unit.elevation; - float sin = Mathf.lerp(Mathf.sin(walkExtend(mech, true), 2f / Mathf.PI, 1f), 0f, e); - float extension = Mathf.lerp(walkExtend(mech, false), 0, e); + 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(); @@ -700,20 +673,6 @@ public class UnitType extends UnlockableContent{ Draw.mixcol(); } - public float walkExtend(Mechc mech, boolean scaled){ - - //now ranges from -maxExtension to maxExtension*3 - float raw = mech.walkTime() % (mechStride * 4); - - if(scaled) return raw / mechStride; - - if(raw > mechStride*3) raw = raw - mechStride * 4; - else if(raw > mechStride*2) raw = mechStride * 2 - raw; - else if(raw > mechStride) raw = mechStride * 2 - raw; - - return raw; - } - public void applyColor(Unit unit){ Draw.color(); Draw.mixcol(Color.white, unit.hitTime); diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index 0845ba54a8..2038374ad5 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -4,7 +4,6 @@ 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.*; @@ -16,7 +15,7 @@ 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 */ @@ -29,6 +28,8 @@ public class Weapon{ 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 */ @@ -54,6 +55,8 @@ public class Weapon{ /** 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; @@ -67,6 +70,8 @@ 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) */ @@ -77,6 +82,10 @@ public class Weapon{ 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; diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 5e7eedc6bc..8fb30aecb6 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -18,6 +18,7 @@ import static mindustry.Vars.*; 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 @@ -122,7 +123,7 @@ public abstract class Weather extends UnlockableContent{ /** 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){ @@ -177,14 +178,14 @@ public abstract class Weather extends UnlockableContent{ if(renderer.weatherAlpha() > 0.0001f){ Draw.draw(Layer.weather, () -> { weather.rand.setSeed(0); - Draw.alpha(renderer.weatherAlpha() * opacity); + 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); + 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 cb1588650d..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); 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 a9902349bb..6eefedcd53 100644 --- a/core/src/mindustry/ui/ContentDisplay.java +++ b/core/src/mindustry/ui/ContentDisplay.java @@ -1,9 +1,9 @@ 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.*; @@ -130,7 +130,7 @@ public class ContentDisplay{ public static void displayUnit(Table table, UnitType unit){ table.table(title -> { - title.image(unit.icon(Cicon.xlarge)); + title.image(unit.icon(Cicon.xlarge)).size(8 * 6).scaling(Scaling.fit); title.add("[accent]" + unit.localizedName).padLeft(5); }); 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 6cb705185d..fb26769c98 100644 --- a/core/src/mindustry/ui/ItemImage.java +++ b/core/src/mindustry/ui/ItemImage.java @@ -8,15 +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"); - t.pack(); add(new Table(o -> { o.left(); o.add(new Image(region)).size(32f); })); - add(t); + + add(new Table(t -> { + t.left().bottom(); + t.add(amount + ""); + t.pack(); + })); } public ItemImage(TextureRegion region){ @@ -27,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 ea7babb459..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.*; 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 294e547510..e14629b594 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -140,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); @@ -172,6 +173,7 @@ public class CustomRulesDialog extends BaseDialog{ 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(); @@ -184,8 +186,6 @@ public class CustomRulesDialog extends BaseDialog{ }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f).row(); main.button("@rules.weather", this::weatherDialog).width(250f).left().row(); - - //TODO add weather patterns } void number(String text, Floatc cons, Floatp prov){ diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java index 8b4f378902..1a718e318a 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -56,7 +56,7 @@ public class DatabaseDialog extends BaseDialog{ 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); 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 4d710fe27c..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(); @@ -327,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 -> {}); @@ -406,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); } 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/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/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 4695091886..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(); + }); }); }); }); diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index 3b0f56906c..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,7 +88,7 @@ public class PausedDialog extends BaseDialog{ }else if(state.isCampaign()){ cont.buttonRow("@launchcore", Icon.up, () -> { hide(); - ui.planet.show(state.getSector(), player.team().core()); + 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 022a92b770..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,25 @@ 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; @@ -118,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 @@ -128,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); } } } @@ -169,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); } } @@ -193,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); @@ -211,7 +237,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ cont.clear(); titleTable.remove(); - cont.stack( new Element(){ { @@ -219,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; } @@ -237,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(); } @@ -312,6 +338,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ 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 @@ -319,7 +347,7 @@ 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(); - } + }*/ if(sector.save != null){ stable.add("@sectors.resources").row(); @@ -359,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(); @@ -382,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){ @@ -408,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(); @@ -440,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 26ced8808c..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; @@ -388,7 +400,8 @@ public class ResearchDialog extends BaseDialog{ } } - return false; + //can always spend when locked + return node.content.locked(); } void spend(TechNode node){ @@ -402,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 c4cfc02132..8dd9753fda 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -93,7 +93,7 @@ public class SettingsMenuDialog extends SettingsDialog{ 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(); 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 853c10025e..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(){ diff --git a/core/src/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/mindustry/ui/fragments/BlockInventoryFragment.java index 515a7ef05c..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()) || !player.within(tile, buildingRange)) 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"; diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index d26a886e2c..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() && ui.hudfrag.shown(); + 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 65038ee67f..f56d507c4d 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -4,7 +4,6 @@ import arc.*; import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; -import arc.input.*; import arc.math.*; import arc.scene.*; import arc.scene.actions.*; @@ -16,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.*; @@ -26,7 +26,6 @@ import mindustry.input.*; import mindustry.net.Packets.*; import mindustry.type.*; import mindustry.ui.*; -import mindustry.ui.dialogs.*; import static mindustry.Vars.*; @@ -34,25 +33,41 @@ public class HudFragment extends Fragment{ private static final float dsize = 65f; public final PlacementFragment blockfrag = new PlacementFragment(); - - //TODO localize - public String sectorText = "Out of sector time."; - public Seq attackedSectors = new Seq<>(); + 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 @@ -64,7 +79,6 @@ 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(); @@ -72,20 +86,23 @@ public class HudFragment extends Fragment{ //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()); + 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); + .touchable(Touchable.disabled) + .name("position"); t.top().right(); }); @@ -97,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()){ @@ -134,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()){ @@ -160,36 +180,39 @@ 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(); + wavesMain.top().left().name = "waves"; wavesMain.table(s -> { //wave info button with text - s.add(makeStatusTable()).grow(); + s.add(makeStatusTable()).grow().name("status"); //table with button to skip wave s.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).disabled(b -> !canSkipWave()).visible(() -> state.rules.waves); + }).growY().fillX().right().width(40f).disabled(b -> !canSkipWave()) + .visible(() -> state.rules.waves).name("skip"); }).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(); + .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 -> { @@ -210,29 +233,33 @@ public class HudFragment extends Fragment{ }).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(); }); //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)))) @@ -241,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}; @@ -257,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; @@ -277,39 +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 - top.add(sectorText).style(Styles.outlineLabel).color(Pal.accent).update(l -> { - l.color.a = Mathf.absin(Time.globalTime(), 7f, 1f); - l.setText(sectorText); - }).colspan(2); - top.row(); - - top.defaults().pad(2).size(150f, 54f); - //TODO localize - top.button("Skip", () -> { - universe.runTurn(); - state.set(State.playing); - - //announce turn info only when something is skipped. - ui.announce("[accent][[ Turn " + universe.turn() + " ]\n[scarlet]" + attackedSectors.size + "[lightgray] sector(s) attacked."); - }); - - //TODO localize - top.button("Switch Sectors", () -> { - ui.paused.runExitSave(); - - //switch to first attacked sector - control.playSector(attackedSectors.first()); - }).disabled(b -> attackedSectors.isEmpty()); - }).margin(8).growX(); - }); - //tutorial text parent.fill(t -> { + t.name = "tutorial"; Runnable resize = () -> { t.clearChildren(); t.top().right().visible(() -> state.rules.tutorial); @@ -332,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(() -> { @@ -352,6 +354,7 @@ 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); @@ -446,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 @@ -576,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; @@ -741,7 +706,7 @@ public class HudFragment extends Fragment{ 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() ? Pal.ammo : Pal.health); + 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(); @@ -752,22 +717,6 @@ public class HudFragment extends Fragment{ 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)); @@ -786,13 +735,8 @@ 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; } diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index 5ec2692d04..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,13 +69,12 @@ 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); @@ -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 2b12fe3062..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().height / 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().height / 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 c705b34f6b..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,6 +30,7 @@ public class PlacementFragment extends Fragment{ final int rowWidth = 4; public Category currentCategory = Category.distribution; + Seq returnArray = new Seq<>(), returnArray2 = new Seq<>(); Seq returnCatArray = new Seq<>(); boolean[] categoryEmpty = new boolean[Category.all.length]; @@ -81,6 +81,10 @@ public class PlacementFragment extends Fragment{ }); } + public Displayable hover(){ + return hover; + } + void rebuild(){ currentCategory = Category.turret; Group group = toggler.parent; @@ -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 -> { 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 94fc221305..95d9a426e0 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -12,7 +12,6 @@ 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.*; @@ -194,10 +193,14 @@ 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; public Prov buildType = null; //initialized later public ObjectMap, Cons2> configurations = new ObjectMap<>(); @@ -209,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<>(); @@ -369,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. */ @@ -463,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! */ @@ -481,24 +485,19 @@ 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; } @@ -588,6 +587,8 @@ public class Block extends UnlockableContent{ current = current.getSuperclass(); } + 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()); @@ -620,7 +621,7 @@ public class Block extends UnlockableContent{ 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, 10); + 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)); } 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 097c016541..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; 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 f3b4526ad8..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){ @@ -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){ + 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){ @@ -508,7 +516,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } } - if(block.hasEntity()){ + if(block.hasBuilding()){ build = entityprov.get().init(this, team, block.update && !state.isEditor(), rotation); } } 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 b9cff3840e..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,23 +10,42 @@ 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); @@ -35,6 +53,12 @@ public interface Autotiler{ 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); @@ -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,6 +127,8 @@ public interface Autotiler{ } } + // Calculate direction for non-square sprites. + blendresult[4] = 0; for(int i = 0; i < 4; 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,6 +191,8 @@ 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); @@ -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 95674dc86b..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,6 +72,14 @@ 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() @@ -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 efbd2485a2..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(); @@ -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) @@ -176,22 +208,23 @@ public class LaunchPad extends Block{ public void remove(){ if(!state.isCampaign()) return; - //on multiplayer the destination is a the first captured sector (basically random) - Sector destsec = !net.client() ? state.secinfo.origin : state.rules.sector.planet.sectors.find(Sector::hasBase); + Sector destsec = state.secinfo.getRealDestination(); //actually launch the items upon removal - if(team() == state.rules.defaultTeam && destsec != null){ - ItemSeq dest = destsec.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); } - - destsec.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 5a2fd461af..b508e90965 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -33,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; diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index f9fc7b0ac8..a2efa6e8b0 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -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/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 c99100166a..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,6 +99,7 @@ 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)); } } @@ -105,6 +111,9 @@ public class Wall extends Block{ //bullet reflection chance depends on bullet damage 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/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 c834dbb6bb..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 @@ -135,7 +133,7 @@ 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()) <= 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 847f624247..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,13 +15,12 @@ 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, (TurretBuild entity) -> entity.target != null || (entity.logicControlled() && entity.logicShooting)); + consumes.powerCond(powerUse, TurretBuild::isActive); super.init(); } diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index d74ff36214..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(); @@ -150,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(){ @@ -175,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 @@ -193,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); @@ -202,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")){ @@ -239,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; @@ -305,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(){ @@ -325,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(); } @@ -338,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(){ @@ -396,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); } @@ -407,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/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java index 19d769f85f..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.*; @@ -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(); @@ -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/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index 6064963919..2d09c69eba 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -276,7 +276,10 @@ public class ItemBridge extends Block{ 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); + } } } } @@ -351,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); @@ -365,7 +368,7 @@ 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){ 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 7880c72db6..1776ed7522 100644 --- a/core/src/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/mindustry/world/blocks/distribution/MassDriver.java @@ -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); @@ -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 981080a95d..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 diff --git a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java index 6d1e765fa6..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 = 50f; + 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); @@ -53,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; @@ -99,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(); @@ -201,13 +206,21 @@ 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(); + return this.item == null && payload.fits(payloadLimit); } //accepting payloads from units isn't supported - return this.item == null && progress <= 5f && payload.fits(); + return this.item == null && progress <= 5f && payload.fits(payloadLimit); } @Override diff --git a/core/src/mindustry/world/blocks/distribution/Router.java b/core/src/mindustry/world/blocks/distribution/Router.java index cb0ae9807d..5b107d5a0e 100644 --- a/core/src/mindustry/world/blocks/distribution/Router.java +++ b/core/src/mindustry/world/blocks/distribution/Router.java @@ -28,7 +28,7 @@ public class Router extends Block{ @Override public void updateTile(){ if(lastItem == null && items.any()){ - items.clear(); + lastItem = items.first(); } if(lastItem != null){ diff --git a/core/src/mindustry/world/blocks/distribution/Sorter.java b/core/src/mindustry/world/blocks/distribution/Sorter.java index 6deed76005..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.*; diff --git a/core/src/mindustry/world/blocks/distribution/StackConveyor.java b/core/src/mindustry/world/blocks/distribution/StackConveyor.java index d70c518bc0..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; @@ -197,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); @@ -219,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/Boulder.java b/core/src/mindustry/world/blocks/environment/Boulder.java index 4c90d8204f..28893d22d4 100644 --- a/core/src/mindustry/world/blocks/environment/Boulder.java +++ b/core/src/mindustry/world/blocks/environment/Boulder.java @@ -1,11 +1,9 @@ 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 Boulder extends Block{ protected int variants; diff --git a/core/src/mindustry/world/blocks/environment/Cliff.java b/core/src/mindustry/world/blocks/environment/Cliff.java index d4347a7c97..49dba95d7c 100644 --- a/core/src/mindustry/world/blocks/environment/Cliff.java +++ b/core/src/mindustry/world/blocks/environment/Cliff.java @@ -2,11 +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); @@ -19,15 +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(), size, size, 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 2ac5e933cf..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 */ @@ -166,6 +166,11 @@ 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; } 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 5e923f6f5f..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{ diff --git a/core/src/mindustry/world/blocks/environment/StaticWall.java b/core/src/mindustry/world/blocks/environment/StaticWall.java index 2b9e41a41e..a364db4ab2 100644 --- a/core/src/mindustry/world/blocks/environment/StaticWall.java +++ b/core/src/mindustry/world/blocks/environment/StaticWall.java @@ -8,7 +8,7 @@ import mindustry.annotations.Annotations.*; import mindustry.graphics.*; import mindustry.world.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; public class StaticWall extends Boulder{ public @Load("@-large") TextureRegion large; diff --git a/core/src/mindustry/world/blocks/environment/TreeBlock.java b/core/src/mindustry/world/blocks/environment/TreeBlock.java index b6170b8b85..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; 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 0afbeafb78..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 072d64ecea..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 6b8739b93a..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 @@ -32,8 +32,8 @@ public class ArmoredConduit extends Conduit{ } @Override - public boolean acceptLiquid(Building source, Liquid liquid, float amount){ - return super.acceptLiquid(source, liquid, amount) && (source.block instanceof Conduit || + 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 0db85e80c0..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); @@ -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/LiquidJunction.java b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java index 2845281d96..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 89a1f674c9..aecf5d4149 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -127,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 @@ -304,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); @@ -331,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; @@ -421,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 9a6592ea36..cb062259b8 100644 --- a/core/src/mindustry/world/blocks/logic/LogicDisplay.java +++ b/core/src/mindustry/world/blocks/logic/LogicDisplay.java @@ -75,15 +75,15 @@ 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); } } 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 3fc87dbe6b..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.newBuilding().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 db6597f309..724df792fa 100644 --- a/core/src/mindustry/world/blocks/payloads/UnitPayload.java +++ b/core/src/mindustry/world/blocks/payloads/UnitPayload.java @@ -7,6 +7,7 @@ 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.*; @@ -47,15 +48,16 @@ public class UnitPayload implements Payload{ return false; } - //naval units need water. - if(unit instanceof WaterMovec){ + //check if unit can be dumped here + SolidPred solid = unit.solidity(); + if(solid != null){ int tx = unit.tileX(), ty = unit.tileY(); - boolean nearEmpty = !EntityCollisions.waterSolid(tx, ty); + boolean nearEmpty = !solid.solid(tx, ty); for(Point2 p : Geometry.d4){ - nearEmpty |= !EntityCollisions.waterSolid(tx + p.x, ty + p.y); + nearEmpty |= !solid.solid(tx + p.x, ty + p.y); } - //cannot dump on dry land + //cannot dump on solid blocks if(!nearEmpty) return false; } 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/PowerGraph.java b/core/src/mindustry/world/blocks/power/PowerGraph.java index 2d5a4d2918..fdb19dc05c 100644 --- a/core/src/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/mindustry/world/blocks/power/PowerGraph.java @@ -19,7 +19,7 @@ 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; @@ -201,7 +201,7 @@ public class PowerGraph{ tile.power.status = 1f; } - lastPowerNeeded = lastPowerProduced = lastUsageFraction = 1f; + lastPowerNeeded = lastPowerProduced = 1f; return; } @@ -236,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){ diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index f4d6799b88..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; @@ -114,6 +112,12 @@ public class PowerNode extends PowerBlock{ (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.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 @@ -392,7 +396,7 @@ public class PowerNode extends PowerBlock{ if(!linkValid(this, link)) continue; - if(link.block instanceof PowerNode && !(link.pos() < tile.pos())) continue; + if(link.block instanceof PowerNode && link.id >= id) continue; drawLaser(team, x, y, link.x, link.y, size, link.block.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 e7456f0287..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; 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 44004ded7e..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 @@ -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 86ce15956e..524d6eb939 100644 --- a/core/src/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/mindustry/world/blocks/storage/Unloader.java @@ -66,6 +66,7 @@ public class Unloader extends Block{ }else{ other.items.remove(item, 1); } + other.itemTaken(item); } } } 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 fa2783f30f..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) )); } @@ -181,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 609452cc2b..abcc4bf738 100644 --- a/core/src/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/mindustry/world/blocks/units/RepairPoint.java @@ -70,6 +70,7 @@ 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){ 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/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 80b9a3bd37..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; @@ -231,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 5f3a13609a..a2dd079c20 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java +++ b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java @@ -3,14 +3,13 @@ package mindustry.world.consumers; import arc.func.*; 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; 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 0fd0cdf26c..01909e2a14 100644 --- a/core/src/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/mindustry/world/consumers/ConsumeItems.java @@ -2,7 +2,6 @@ package mindustry.world.consumers; import arc.scene.ui.layout.*; import arc.struct.*; -import arc.util.ArcAnnotate.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.ui.*; @@ -10,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; 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 f2cae7676e..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 66e9e2782c..05e45acbfe 100644 --- a/core/src/mindustry/world/meta/BlockStat.java +++ b/core/src/mindustry/world/meta/BlockStat.java @@ -1,8 +1,8 @@ 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{ @@ -11,6 +11,7 @@ public enum BlockStat{ displaySize(StatCategory.general), buildTime(StatCategory.general), buildCost(StatCategory.general), + memoryCapacity(StatCategory.general), itemCapacity(StatCategory.items), itemsMoved(StatCategory.items), 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 0466b4f139..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. 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/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 c29ee65eff..6b383b958d 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -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){ 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 ce24a22635..7e7c9ecef3 100644 --- a/desktop/src/mindustry/desktop/steam/SStats.java +++ b/desktop/src/mindustry/desktop/steam/SStats.java @@ -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/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/gradle.properties b/gradle.properties index 225bb91cfd..77aed771ce 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=35f5d68f9cd8538208bc06f77a573386f2ecd477 +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 b123d7e694..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", "", @@ -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; } } diff --git a/servers.json b/servers.json index 07226a273f..6ee33c6d30 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" }, @@ -44,6 +35,9 @@ { "address": "aamindustry.play.ai:6568" }, + { + "address": "aamindustry.play.ai:6570" + }, { "address": "mindustry.atannergaming.com" }, @@ -76,5 +70,8 @@ }, { "address": "Chaotic-Neutral.ddns.net:3333" + }, + { + "address": "pandorum.su:9999" } ] diff --git a/servers_be.json b/servers_be.json index 5ebfae37df..312bc9da30 100644 --- a/servers_be.json +++ b/servers_be.json @@ -7,5 +7,8 @@ }, { "address": "md.surrealment.com" + }, + { + "address": "mindustry.pl:6660" } ] diff --git a/servers_v6.json b/servers_v6.json index adcfa052dd..85f4c11b19 100644 --- a/servers_v6.json +++ b/servers_v6.json @@ -8,7 +8,19 @@ { "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 d689dbd5df..01cf659df2 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -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"); diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ItemLiquidGeneratorTests.java index 08f636c566..1e2224753f 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ItemLiquidGeneratorTests.java @@ -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 994130a596..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); 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/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 3f09c262ee..d8f67eee8c 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -78,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++){ @@ -214,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); } } @@ -314,8 +387,7 @@ public class Generators{ type.init(); Color outc = Pal.darkerMetal; - //Func outlineS = i -> i.shadow(0.8f, 9); - Func outline = i -> i.outline(4, outc); + Func outline = i -> i.outline(3, outc); Cons outliner = t -> { if(t != null && t.found()){ ImagePacker.replace(t, outline.get(ImagePacker.get(t))); @@ -325,26 +397,20 @@ public class Generators{ for(Weapon weapon : type.weapons){ if(outlined.add(weapon.name) && ImagePacker.has(weapon.name)){ outline.get(ImagePacker.get(weapon.name)).save(weapon.name + "-outline"); - - //old outline - //ImagePacker.get(weapon.name).outline(4, Pal.darkerMetal).save(weapon.name); } } - //baseRegion, legRegion, region, shadowRegion, cellRegion, - // occlusionRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion, outlineRegion; - 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 = ImagePacker.get(type.region); + Image image = outline.get(ImagePacker.get(type.region)); - outline.get(image).save(type.name + "-outline"); - //ImagePacker.replace(type.region, outline.get(image)); + image.save(type.name + "-outline"); + //draw mech parts if(type.constructor.get() instanceof Mechc){ image.drawCenter(type.baseRegion); image.drawCenter(type.legRegion); @@ -352,6 +418,19 @@ public class Generators{ image.draw(type.region); } + //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); + } + + //draw base region on top to mask weapons + image.draw(type.region); + 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")))); @@ -361,7 +440,7 @@ public class Generators{ for(Weapon weapon : type.weapons){ weapon.load(); - image.draw(weapon.region, + 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 65e1f72f26..83594f22be 100644 --- a/tools/src/mindustry/tools/Image.java +++ b/tools/src/mindustry/tools/Image.java @@ -182,9 +182,14 @@ 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.width, y + region.height, 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);